Filtre De Recherche Avec Tbextendedfilter De Yiibooster

Bonjour à tous,

j’utilise Yiibooster, et plus particulièrement la grid.

J’essaye d’ajouter un filtre de recherche à ma grid (http://yiibooster.clevertech.biz/extendedGridView#extendedfilter), mais il me semble qu’il manque quelque chose pour ça puisse être fonctionnel.

J’ai un méthode action dans mon controleur qui est écrit comme suit :


public function actionList (){

        $persons = User::model()->findAll();

        $userForm = new UserForm();

        if (isset($_GET['UserForm'])){

            //print_r ($_REQUEST['UserForm']);

            $userForm->filters = $_GET['UserForm'];

        } else {

            $this->layout = 'dashboard';

        }

        $filteredData = $userForm->filter($persons);


        $gridDataProvider = new CArrayDataProvider($filteredData, array(

            'id' => 'user',

            'sort' => array(

                'attributes' => array(

                    'id', 'firstname', 'surname', 'email', 'enable'

                )


            ),

            'pagination' => array(

                'pageSize' => 10

            )

        ));


        $gridColumns = array(

            array('name'=>'id', 'header'=>'#', 'htmlOptions'=>array('style'=>'width: 60px')),

            array('name'=>'firstname', 'header'=>'Prénom'),

            array('name'=>'surname', 'header'=>'Nom'),

            array('name'=>'email', 'header'=>'E-mail'),

            array('name'=>'enable', 'header'=>'Activé'),

            array(

                'htmlOptions' => array('nowrap'=>'nowrap'),

                'class'=>'booster.widgets.TbButtonColumn',

                'template' => '{update} {delete}',

                'viewButtonUrl'=>null,

                'updateButtonUrl'=> null,

                'deleteButtonUrl'=>null,

                'buttons' => array(

                    'update' => array(

                        'click' => 'function (){

                            var id = parseInt ($(this).parent().parent().find("td").eq(0).html());

                            $(location).attr("href","/fr/user-edit/" + id);

                        }'

                    )

                )

            )

        );




        $this->render('/user/list', array(

            'personns' => $persons,

            'userForm' => $userForm,

            'filteredData' => $filteredData,

            'gridDataProvider' => $gridDataProvider,

            'gridColumns' => $gridColumns

        ));

    }

Une vue :


<?php


$this->widget(

    'booster.widgets.TbExtendedGridView',

    array(

        'fixedHeader' => true,

        'headerOffset' => 40,

        'type' => 'striped bordered condensed',

        'dataProvider' => $gridDataProvider,

        'template' => "{items}",

        'responsiveTable' => true,

        'filter' => $userForm,

        'columns' => $gridColumns,

    )

);

$persons = new User ();

Le modele :




class User extends CActiveRecord

{


    public static function model($className=__CLASS__)

    {

        return parent::model($className);

    }


    public function tableName()

    {

        return 'user';

    }


    public function validatePassword($password)

    {

        //$hash = $this->hashPassword($password);

        //die ($hash);

        return CPasswordHelper::verifyPassword($password,$this->password);

    }


    public function hashPassword($password)

    {

        return CPasswordHelper::hashPassword($password);

    }


    public function rules (){

        return array(

            array( 'id,firstname,surname,email,enable', 'safe', 'on'=>'search' ),

        );

    }


    public function attributeLabels (){

        return array(

            'username' => 'Pseudo',

            'firstname' => 'Prénom',

            'surname' => 'Nom',

            'password' => 'Mot de passe',

            'email' => 'E-mail',

            'enable' => 'Actif'

        );

    }

}



Le modele du formulaire :


class UserForm extends CFormModel{


    public $id;

    public $username;

    public $firstname;

    public $surname;

    public $email;

    public $profile;

    public $isadmin;

    public $enable;


    public $filters = array();


    public function __get($name){

        if (!array_key_exists($name, $this->filters)) {

            $this->filters[$name] = '';

        }

        return $this->filters[$name];

    }


    public function __set($name, $value){

        $this->filters[$name] = $value;

    }


    public function filter(array $data){

        //print_r ($data);

        foreach ($data AS $rowIndex => $row) {

            foreach ($this->filters AS $key => $searchValue) {

                if (!is_null($searchValue) AND $searchValue !== '') {

                    $compareValue = null;

                    if ($row instanceof CModel) {

                        if (isset($row->$key) == false) {

                            throw new CException("Property " . get_class($row) . "::{$key} does not exist!");

                        }

                        $compareValue = $row->$key;

                    } elseif (is_array($row)) {

                        if (!array_key_exists($key, $row)) {

                            throw new CException("Key {$key} does not exist in array!");

                        }

                        $compareValue = $row[$key];

                    } else {

                        throw new CException("Data in CArrayDataProvider must be an array of arrays or an array of CModels!");

                    }


                    if (stripos($compareValue, $searchValue) === false) {

                        unset($data[$rowIndex]);

                    }

                }

            }

        }

        return $data;

    }


} 

Quand je saisi un terme dans un des champs de recherche (par exemple “toto” dans le champ surname) et que je tape sur la touche “enter”, la valeur du formulaire n’est pas envoyé vu que l’appel ajax est le suivant :


{mon-url}? UserForm%5Bid%5D=&UserForm%5Bfirstname%5D=&UserForm%5Bsurname%5D=&UserForm%5Bemail%5D=&UserForm%5Benable%5D=&ajax=yw0&user_page=1

Est ce que quelqu’un aurait une idée de ce qui pourrait manquer dans mon code ?

Merci d’avance.

Salut.

Je n’ai jamais utilisé cette extension, donc ce que je vais dire sera pas forcément pertinent, mais je perd rien à essayer.

Tu as essayé de remplacer


$userForm->filters = $_GET['UserForm'];

Par


$userForm->attributes = $_GET['UserForm'];

?

J’espère que ça peut être aussi simple que ça …

Désolé pour la pauvreté de cette réponse x)

Bonjour,

merci pour ta réponse.

Je n’ai pas essayé ça, je vais mettre cette solution en place et voir si ça fonctionne.

Je vous tiens au courant.