Ceci est une ancienne révision du document !
Ce composant permet de parser des champs de recherche afin de générer un tableau de conditions qui peut être utilisé pour effectuer une recherche. Le tableau généré peut typiquement être passé à la méthode paginate() des controleurs.
function index() { $this->set('users', $this->paginate($this->User, $this->AlaxosFilter->get_filter())); }
Son fonctionnement est étroitement lié au Helper AlaxosFormHelper qui peut être utilisé pour générer des champs de recherche. La combinaison du AlaxosFilterComponent et du AlaxosFormHelper permet de générer très facilement des pages d'index contenant des champs de recherche en haut des colonnes comme sur [cette page](http://demo.alaxos.ch/admin/users).
Les champs de recherche générés (vue) et le traitement des valeurs de recherche saisies tiennent compte automatiquement des types de champ, ce qui évite de devoir écrire trop de code.
Il existe d'autres solutions de filtre sur le web qui ont été écrites avant celle-ci. Elles ne correspondaient cependant pas entièrement à mes besoins, d'où l'écriture de ce composant. Son code est par contre certainement en partie inspiré de ces solutions: Nik Chankov, Maciej Grajcarek et james Fairhurst.
get_auto_append_wildcard_characters($auto_append_wildcard_characters)
permet de spécifier pour les champs texte si un caractère wildcard est automatiquement ajouté au début et à la fin du mot de recherche.
function index() { (...) $this->AlaxosFilter->set_auto_append_wildcard_characters(true); //-> if you search names for 'ico', names like 'nicolas' will be found (...) }
set_auto_clear_filter($auto_clear_filter)
permet de spécifier si les filtres saisis doivent être effacés lorsque l'on revient sur une page (ce qui est le comportement par défaut).
En settant cette valeur à false, cela permet de conserver les filtres de recherche, même après avoir visité d'autres pages du site.
function index() { (...) $this->AlaxosFilter->set_auto_clear_filter(false); //-> navigating to another page of the website will not clear the filter when the user comes back (...) }
add_field_alias($alias, $db_fields, $field_type = 'string')
permet de configurer un alias utilisé pour la recherche.
$db_fields expression SQL
$field_type le type de champ. Pris en compte dans la manière de construire la condition correspondante
A noter que dans la plupart des cas, il n'est pas besoin d'utiliser cette méthode, le composant essayant de trouver
une expression SQL dans les [*virtualFields*](http://book.cakephp.org/view/1588/virtualFields)
function index() { (...) /* * Add alias to allow search on lastname+firstname */ $this->AlaxosFilter->add_field_alias('user_display_name', "\"User\".lastname||' '||\"User\".firstname"); $this->set('users', $this->paginate($this->User, $this->AlaxosFilter->get_filter())); (...) }
qui pourrait aussi être
function index() { (...) /* * Create this virtual field to allow sorting and filtering */ $this->User->virtualFields = array('user_display_name' => "\"User\".lastname||' '||\"User\".firstname"); $this->set('users', $this->paginate($this->User, $this->AlaxosFilter->get_filter())); (...) }
get_filter()
La méthode principale permettant d'obtenir le filtre (tableau de conditions) à utiliser pour faire une recherche, dans un find() ou paginate().
posts_controller.php
class PostsController extends AppController { var $name = 'Posts'; var $helpers = array('Form', 'Alaxos.AlaxosForm', 'Alaxos.AlaxosHtml'); var $components = array('Alaxos.AlaxosFilter'); function index() { $this->Post->recursive = 1; $this->Post->virtualFields = array('user_display_name' => "\"User\".lastname||' '||\"User\".firstname"); $this->set('posts', $this->paginate($this->Post, $this->AlaxosFilter->get_filter())); } }
admin_index.ctp
<?php echo $alaxosForm->create('Post', array('controller' => 'posts', 'url' => $this->passedArgs)); ?> <table> <tr class="sortHeader"> <th><?php echo $this->Paginator->sort(__('user', true), 'user_display_name');?></th> <th><?php echo $this->Paginator->sort(__('title', true), 'Post.title');?></th> <th><?php echo $this->Paginator->sort(__('published', true), 'Post.published');?></th> <th><?php echo $this->Paginator->sort(__('created', true), 'Post.created');?></th> <th><?php echo $this->Paginator->sort(__('modified', true), 'Post.modified');?></th> <th class="actions"><?php __('Actions');?></th> </tr> <tr class="searchHeader"> <td> <?php echo $this->AlaxosForm->filter_field('user_display_name'); //-> print a text field ?> </td> <td> <?php echo $this->AlaxosForm->filter_field('title'); //-> print a text field ?> </td> <td> <?php echo $this->AlaxosForm->filter_field('published'); //-> print a from-to date field ?> </td> <td style="width:80px;"> <?php echo $this->AlaxosForm->filter_field('created'); //-> print a from-to date field ?> </td> <td style="width:80px;"> <?php echo $this->AlaxosForm->filter_field('modified'); //-> print a from-to date field ?> </td> <td style="width:80px"> <?php echo $this->AlaxosForm->end(___('search', true));?> </td> </tr> <?php $i = 0; foreach ($posts as $post): $class = null; if ($i++ % 2 == 0) { $class = ' class="row"'; } else { $class = ' class="altrow"'; } ?> <tr<?php echo $class;?>> <td> <?php echo $post['User']['lastname'] . ' ' . $post['User']['firstname']; ?> </td> <td> <?php echo $post['Post']['title']; ?> </td> <td> <?php echo $alaxosHtml->get_yes_no($post['Post']['published']); ?> </td> <td> <?php echo DateTool :: sql_to_date($post['Post']['created']); ?> </td> <td> <?php echo DateTool :: sql_to_date($post['Post']['modified']); ?> </td> </tr> <?php endforeach; ?> </table>