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
$options['order'][$alias . '.' . $field] = $value;
} elseif ($object->hasField($field)) {
$options['order'][$alias . '.' . $field] = $value;
}
après
$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']
et hop ça trie !
Articles similaires
- Un plugin de forum pour vos applications CakePHP
- CakePHP dans le dossier public_html de votre user sous Ubuntu 9.10
- Mettre CakePHP à l'heure Française sur un serveur à l'autre bout du monde
- De l'avenir de CakePHP
- Première conférence CakePHP en Europe du 9 au 12 juillet 2009
- CakePHP composant Auth et redirection pour le formulaire de login
- CakePHP 1.2 final est sortie
- CakePHP 1.2 RC4 est sortie
- CakePHP : validation Ajax
- Lancez vos sites sur orbite avec Fredistrano 1.0


