CakePHP tri sur un champ calculé avec paginate

Tagged:

La méthode paginate() de /cake/libs/controller/controller.php ne permet pas le tri sur un champ calculé qui n'existe pas dans la table.
J'ai cherché pas mal de temps en vain, quand je passais un champ calculé au 'order' de paginate la clause ORDER BY disparaissait de ma requête MySQL.

La solution pour trier sur un champ calculé avec paginate

Je n'ai pas trouvé d'autre solution que de modifier la fonction paginate de /cake/libs/controller/controller.php

Je l'ai donc copier dans /app/app_controller.php

et j'ai modifier les lignes suivantes :

avant

if (isset($object->{$alias}) && $object->{$alias}->hasField($field)) {
$options['order'][$alias . '.' . $field] = $value;
} elseif ($object->hasField($field)) {
$options['order'][$alias . '.' . $field] = $value;
}

après

if (isset($object->{$alias}) && $object->{$alias}->hasField($field)) {
$options['order'][$alias . '.' . $field] = $value;
} elseif ($object->hasField($field)) {
$options['order'][$alias . '.' . $field] = $value;
} elseif ($object->isComputedField($field)) {
$options['order'][$field] = $value;
}

ensuite dans /app/app_model.php

/**
* Verifie si le champ en paramètre est un champ calculé autorisé pour le tri
*
* @param string $field
* @return boolean
*/
function isComputedField($field){
if (in_array($field, $this->computedFields)) {
return true;
}
return false;
}

puis dans les modèles pour lesquels je veux faire des tris sur des champs calculés

/**
* tableau des champs calculé autorisés pour le tri
*
* @var array
*/
var $computedFields = array('monChampCalcule');

enfin dans les controller ou le tri sur un champ calculé est demandé je rajoute le champ calculé dans $this->paginate['fields']

$this->paginate['fields'][] = '(ma formule de calcul) AS monChampCalcule';

et hop ça trie !