diff -ur sfPropelActAsSortableBehaviorPlugin-0.6.1/lib/sfPropelActAsSortableBehavior.class.php sfPropelActAsSortableBehaviorPlugin-0.6.1-new/lib/sfPropelActAsSortableBehavior.class.php --- sfPropelActAsSortableBehaviorPlugin-0.6.1/lib/sfPropelActAsSortableBehavior.class.php 2007-08-07 10:56:57.000000000 -0300 +++ sfPropelActAsSortableBehaviorPlugin-0.6.1-new/lib/sfPropelActAsSortableBehavior.class.php 2009-02-20 10:59:25.000000000 -0300 @@ -21,14 +21,18 @@ * * @return mixed sortable object **/ - public static function retrieveByPosition($peerClass, $position, $con = null) + public static function retrieveByPosition($peerClass, $position, $con = null, $group = null) { $rankColumnName = sfConfig::get('propel_behavior_act_as_sortable_'.self::getClassFromPeerClass($peerClass).'_column', 'rank'); - $rankColumnPhpName = call_user_func(array($peerClass, 'translateFieldName'), $rankColumnName, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_COLNAME); + $rankColumnPhpName = call_user_func(array($peerClass, 'translateFieldName'), $rankColumnName, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_COLNAME); + $groupColumnName = sfConfig::get('propel_behavior_act_as_sortable_'.self::getClassFromPeerClass($peerClass).'_group'); + if($groupColumnName) $groupColumnPhpName = call_user_func(array($peerClass, 'translateFieldName'), $groupColumnName, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_COLNAME); + if(!$con) $con = Propel::getConnection(constant("$peerClass::DATABASE_NAME")); $c = new Criteria; - $c->add($rankColumnPhpName, $position); + $c->add($rankColumnPhpName, $position); + if($groupColumnName) $c->add($groupColumnPhpName, $group); return call_user_func(array($peerClass, 'doSelectOne'), $c, $con); } @@ -41,16 +45,26 @@ * * @return integer maximum position **/ - public static function getMaxPosition($peerClass, $con = null) + public static function getMaxPosition($peerClass, $con = null, $group = null) { - $rankColumnName = sfConfig::get('propel_behavior_act_as_sortable_'.self::getClassFromPeerClass($peerClass).'_column', 'rank'); + $rankColumnName = sfConfig::get('propel_behavior_act_as_sortable_'.self::getClassFromPeerClass($peerClass).'_column', 'rank'); + $groupColumnName = sfConfig::get('propel_behavior_act_as_sortable_'.self::getClassFromPeerClass($peerClass).'_group'); + if(!$con) $con = Propel::getConnection(constant("$peerClass::DATABASE_NAME")); $sql = sprintf('SELECT MAX(%s) AS max FROM %s', $rankColumnName, constant("$peerClass::TABLE_NAME") - ); - $rs = $con->prepareStatement($sql)->executeQuery(); + ); + + if($groupColumnName) + { + $sql .= sprintf(" WHERE %s = ?",$groupColumnName); + $stmt = $con->prepareStatement($sql); + $stmt->setString(1,$group); + } + else $stmt = $con->prepareStatement($sql); + $rs = $stmt->executeQuery(); $rs->next(); return $rs->getInt('max'); @@ -66,10 +80,13 @@ * * @return array list of sortable objects **/ - public static function doSelectOrderByPosition($peerClass, $order = Criteria::ASC, $criteria = null, $con = null) + public static function doSelectOrderByPosition($peerClass, $order = Criteria::ASC, $criteria = null, $con = null, $group = null) { $rankColumnName = sfConfig::get('propel_behavior_act_as_sortable_'.self::getClassFromPeerClass($peerClass).'_column', 'rank'); - $rankColumnPhpName = call_user_func(array($peerClass, 'translateFieldName'), $rankColumnName, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_COLNAME); + $rankColumnPhpName = call_user_func(array($peerClass, 'translateFieldName'), $rankColumnName, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_COLNAME); + $groupColumnName = sfConfig::get('propel_behavior_act_as_sortable_'.self::getClassFromPeerClass($peerClass).'_group'); + if($groupColumnName) $groupColumnPhpName = call_user_func(array($peerClass, 'translateFieldName'), $groupColumnName, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_COLNAME); + if(!$con) $con = Propel::getConnection(constant("$peerClass::DATABASE_NAME")); if ($criteria === null) @@ -90,7 +107,8 @@ else { $criteria->addDescendingOrderByColumn($rankColumnPhpName); - } + } + if($groupColumnName) $c->add($groupColumnPhpName,$group); return call_user_func(array($peerClass, 'doSelect'), $criteria, $con); } @@ -159,6 +177,32 @@ public function setPosition($object, $position) { return $object->setByName(sfConfig::get('propel_behavior_act_as_sortable_'.get_class($object).'_column', 'rank'), $position, BasePeer::TYPE_FIELDNAME); + } + + /** + * Gets the group of a sortable object + * + * @param mixed sortable object + * + * @return mixed group of the sortable object + */ + public function getGroup($object) + { + $groupColumnName = sfConfig::get('propel_behavior_act_as_sortable_'.get_class($object).'_group'); + if($groupColumnName) return $object->getByName($groupColumnName, BasePeer::TYPE_FIELDNAME); + else return null; + } + + /** + * Sets the group of a sortable object + * + * @param mixed sortable object + * @param mixed group value + */ + public function setGroup($object, $group) + { + $groupColumnName = sfConfig::get('propel_behavior_act_as_sortable_'.get_class($object).'_group'); + if($groupColumnName) return $object->setByName($groupColumnName, $group, BasePeer::TYPE_FIELDNAME); } /** @@ -170,7 +214,7 @@ **/ public function getNext($object) { - return self::retrieveByPosition(get_class($object).'Peer', self::getPosition($object) + 1); + return self::retrieveByPosition(get_class($object).'Peer', self::getPosition($object) + 1, null, self::getGroup($object)); } /** @@ -182,7 +226,7 @@ **/ public function getPrevious($object) { - return self::retrieveByPosition(get_class($object).'Peer', self::getPosition($object) - 1); + return self::retrieveByPosition(get_class($object).'Peer', self::getPosition($object) - 1, null, self::getGroup($object)); } /** @@ -206,7 +250,7 @@ **/ public function isLast($object) { - return self::getPosition($object) == self::getMaxPosition(get_class($object).'Peer'); + return self::getPosition($object) == self::getMaxPosition(get_class($object).'Peer', null, self::getGroup($object)); } /** @@ -286,31 +330,36 @@ { $class = get_class($object); $peerClass = $class.'Peer'; - $rankColumnName = sfConfig::get('propel_behavior_act_as_sortable_'.$class.'_column', 'rank'); + $rankColumnName = sfConfig::get('propel_behavior_act_as_sortable_'.$class.'_column', 'rank'); + $groupColumnName = sfConfig::get('propel_behavior_act_as_sortable_'.$class.'_group'); if(!$con) $con = Propel::getConnection(constant("$peerClass::DATABASE_NAME")); $oldPosition = self::getPosition($object); if ($oldPosition == $newPosition) return $oldPosition; - + try { $con->begin(); // Move the object away - self::setPosition($object, self::getMaxPosition($peerClass) + 1); + self::setPosition($object, self::getMaxPosition($peerClass,null,self::getGroup($object)) + 1); $object->save(); // Shift the objects between the old and the new position - $query = sprintf('UPDATE %s SET %s = %s %s 1 WHERE %s BETWEEN ? AND ?', + $query = sprintf('UPDATE %s SET %s = %s %s 1 WHERE %s BETWEEN ? AND ?%s', constant("$peerClass::TABLE_NAME"), $rankColumnName, $rankColumnName, ($oldPosition < $newPosition) ? '-' : '+', - $rankColumnName - ); + $rankColumnName, + $groupColumnName?" AND $groupColumnName = ?":"" + + ); + $stmt = $con->prepareStatement($query); $stmt->setInt(1, min($oldPosition, $newPosition)); - $stmt->setInt(2, max($oldPosition, $newPosition)); + $stmt->setInt(2, max($oldPosition, $newPosition)); + if($groupColumnName) $stmt->setString(3,self::getGroup($object)); $stmt->executeQuery(); // Move the object back in @@ -357,9 +406,9 @@ public function moveToBottom($object, $con = null) { $class = get_class($object); - $peerClass = $class.'Peer'; - - return self::moveToPosition($object, self::getMaxPosition($peerClass), $con); + $peerClass = $class.'Peer'; + + return self::moveToPosition($object, self::getMaxPosition($peerClass,null,self::getGroup($object)), $con); } /** @@ -378,7 +427,8 @@ { $class = get_class($object); $peerClass = $class.'Peer'; - $rankColumnName = sfConfig::get('propel_behavior_act_as_sortable_'.$class.'_column', 'rank'); + $rankColumnName = sfConfig::get('propel_behavior_act_as_sortable_'.$class.'_column', 'rank'); + $groupColumnName = sfConfig::get('propel_behavior_act_as_sortable_'.$class.'_group'); if(!$con) $con = Propel::getConnection(constant("$peerClass::DATABASE_NAME")); try @@ -386,14 +436,16 @@ $con->begin(); // Shift the objects with a position higher than the given position - $query = sprintf('UPDATE %s SET %s = %s + 1 WHERE %s >= ?', + $query = sprintf('UPDATE %s SET %s = %s + 1 WHERE %s >= ?%s', constant("$peerClass::TABLE_NAME"), $rankColumnName, $rankColumnName, - $rankColumnName + $rankColumnName, + $groupColumnName?" AND $groupColumnName = ?":"" ); $stmt = $con->prepareStatement($query); - $stmt->setInt(1, $position); + $stmt->setInt(1, $position); + if($groupColumnName) $stmt->setString(2,self::getGroup($object)); $stmt->executeQuery(); // Move the object in the list, at the given position @@ -427,7 +479,7 @@ // new records need to be initialized with position = maxPosition +1 unless position is already set if(!$object->getId() && !$object->isColumnModified($rankColumnPhpName)) { - self::setPosition($object, self::getMaxPosition($peerClass)+1); + self::setPosition($object, self::getMaxPosition($peerClass,null,self::getGroup($object))+1); } } @@ -442,17 +494,20 @@ { $class = get_class($object); $peerClass = $class.'Peer'; - $rankColumnName = sfConfig::get('propel_behavior_act_as_sortable_'.$class.'_column', 'rank'); + $rankColumnName = sfConfig::get('propel_behavior_act_as_sortable_'.$class.'_column', 'rank'); + $groupColumnName = sfConfig::get('propel_behavior_act_as_sortable_'.$class.'_group'); if(!$con) $con = Propel::getConnection(constant("$peerClass::DATABASE_NAME")); - $query = sprintf('UPDATE %s SET %s = %s - 1 WHERE %s > ?', + $query = sprintf('UPDATE %s SET %s = %s - 1 WHERE %s > ?%s', constant("$peerClass::TABLE_NAME"), $rankColumnName, $rankColumnName, - $rankColumnName + $rankColumnName, + $groupColumnName?" AND $groupColumnName = ?":"" ); $stmt = $con->prepareStatement($query); - $stmt->setInt(1, $object->getPosition()); + $stmt->setInt(1, $object->getPosition()); + if($groupColumnName) $stmt->setString(2, self::getGroup($object)); $stmt->executeQuery(); } }