'ordre', 'addToEnd' => true ), (array)$config ); $this->settings[$model->alias] = $settings; } /** * Méthode appelée après chaque sauvegarde. * Si c'est un ajout, on regarde la valeur de l'option $addToEnd * et on met à jour la valeur de l'ordre de l'enregistrement concerné. * * @param object $model Le modèle relié au Comportement * @param boolean $created Vrai s'il s'agit d'un ajout (INSERT), faux si c'est une mise à jour (UPDATE) * @return boolean Renvoie vrai si succès, faux en cas d'erreur */ function afterSave(&$model, $created) { extract($this->settings[$model->alias]); if($created) { if($addToEnd) { // Ajout après le dernier list($order) = array_values( $model->find( 'first', array( 'conditions' => '1=1', 'fields' => 'MAX(' . $field . ') AS ' . $field, 'recursive' => -1 ) ) ); return $model->saveField( $field, empty($order[$field]) ? 1 : $order[$field]+1, false ); } else { // Ajout en premier et décalage d'un cran pour tous $model->saveField( $field, 0, false ); return $this->__reIndex($model); } } } /** * Méthode appelée avant chaque suppression. * On décale d'un cran les enregistrements suivant celui à supprimer * * @param object $model Le modèle relié au Comportement * @return boolean Renvoie vrai si succès, faux en cas d'erreur */ function beforeDelete(&$model) { extract($this->settings[$model->alias]); $start = $model->field($field); return $this->__reIndex($model, $start, -1); } /** * Monter d'un certain nombre de crans * * @param object $model Modèle relié au Comportement * @param integer $id Id de l'enregistrement à monter * @param integer $delta Nombre de crans * @return boolean Renvoie vrai si succès, faux en cas d'erreur */ function moveUp(&$model, $id = null, $delta = -1) { return $this->__move($model, $id, $delta); } /** * Descendre d'un certain nombre de crans * * @param object $model Modèle relié au Comportement * @param integer $id Id de l'enregistrement à descendre * @param integer $delta Nombre de crans * @return boolean Renvoie vrai si succès, faux en cas d'erreur */ function moveDown(&$model, $id = null, $delta = +1) { return $this->__move($model, $id, $delta); } /** * Réindexer la colonne de tri. * * @param object $model Modèle relié au Comportement * @param integer $start Ordre à partir duquel appliquer le décalage * @param integer $offset Grandeur du décalage * @return boolean Renvoie vrai si succès, faux en cas d'erreur * @access private */ function __reIndex(&$model, $start = 0, $offset = +1) { extract($this->settings[$model->alias]); return $model->updateAll( array( $model->escapeField($field) => $model->escapeField($field) . '+' . $offset ), array( $model->escapeField($field) => '>= ' . $start ) ); } /** * Monter ou descendre d'un certain nombre de crans * * @param object $model Modèle relié au Comportement * @param integer $id Id de l'enregistrement à modifier * @param integer $delta Nombre de crans * @return boolean Renvoie vrai si succès, faux en cas d'erreur * @access private */ function __move(&$model, $id = null, $delta = 1) { if(empty($id)) { $id = $model->id; } extract($this->settings[$model->alias]); $one = $model->find( 'first', array( 'conditions' => array( $model->primaryKey => $id ), 'fields' => array( $model->primaryKey, $field ), 'recursive' => -1 ) ); if(empty($one)) { return false; } list($one) = array_values($one); $two = $model->find( 'first', array( 'conditions' => array( $field => $one[$field] + $delta ), 'fields' => $model->primaryKey, 'recursive' => -1 ) ); if(empty($two)) { return false; } list($two) = array_values($two); return $this->__switch( $model, $id, $two[$model->primaryKey] ); } /** * Echanger les ordres de deux enregistrements * * @param object $model Modèle relié au Comportement * @param integer $one_id Id du premier enregistrement * @param integer $two_id Id du deuxième enregistrement * @return boolean Renvoie vrai si succès, faux en cas d'erreur * @access private */ function __switch(&$model, $one_id, $two_id) { extract($this->settings[$model->alias]); $one = $model->find( 'first', array( 'conditions' => array( $model->primaryKey => $one_id ), 'fields' => array( $model->primaryKey, $field ), 'recursive' => -1 ) ); $two = $model->find( 'first', array( 'conditions' => array( $model->primaryKey => $two_id ), 'fields' => array( $model->primaryKey, $field ), 'recursive' => -1 ) ); if(empty($one) or empty($two)) { return false; } list($one) = array_values($one); list($two) = array_values($two); $model->id = $one[$model->primaryKey]; $model->saveField($field, $two[$field], false); $model->id = $two[$model->primaryKey]; $model->saveField($field, $one[$field], false); return true; } } ?>