Problème Cgridview

Bonjour,

Je débute Yii depuis quelques jours seulement et je tourne en ronde pour résoudre un problème de CGridView donc je peux vous dire qu’il y a beaucoup de questions là dessus, dont j’ai essayé les solutions proposées et ça fonctionne chez les autres, mais pas chez moi. Je me demande si la version y est pour qqch, 1.1.12.

J’ai des tables course et person. Chaque cours a une personne de contact.

J’ai peux sans problème lister le nom du contact dans le grid. Mais les filtres et les tris ne fonctionnent pas très bien sur l’en-tête des colonnes et ça ne retourne les errors :

Error 500: <h1>PHP Error [8]</h1>

<p>Trying to get property of non-object (/var/www/yii/framework/base/CComponent.php(607) : eval()'d code:1)</p>

<pre>#0 /var/www/yii/framework/base/CComponent.php(607) : eval()'d code(1): CWebApplication->handleError()

Je vous montre les codes essentiels :

Dans le fichier Model de Course.




  public function rules()

  {

    return array(

      //... d'autres array

      array('contact, firstname, lastname', 'safe'),

      array('contact, firstname, lastname', 'safe', 'on'=>'search'),

    );

  }


  public function relations()

  {

    return array(

      'contact' => array(self::BELONGS_TO, 'Person', 'id_contact'),

    );

  }


  public function search()

  {

    $criteria=new CDbCriteria;


    // ... d'autres criteria


    $criteria->together = true ;

    $criteria->compare('id',$this->id,true);

    $criteria->with=array('contact');

    $criteria->compare('contact',$this->contact,true);


    return new CActiveDataProvider($this, array(

      'criteria'=>$criteria,

    ));


  }



Et dans l’admin.php




$this->widget('zii.widgets.grid.CGridView', array(

  'id'=>'course-grid',

  'dataProvider'=>$model->search(),

  'filter'=>$model,

  'columns'=>array(


   //... d'autres attribues


    array(

      'name'=>'contact',

      'value'=>'$data->contact->lastname' ,

    ),


    

    array(

      'class'=>'CButtonColumn',

    ),

  ),

));



Bien sûr, j’aimerais pourvoir faire un filtre et un tri avec tous les colonnes. Mais surtout, j’aimerais pourvoir faire un filtre avec “lastname” et “firstname” dans la même colonne. Pour les afficher dans la même colonne, je parviens à le faire, mais toujours avec les mêmes problèmes de filtre et de tri.




    array(

      'name'=>'contact',

      'value'=>'$data->contact->lastname." ".$data->contact->firstname' ,

    ),



Merci d’avance pour votre aide.

D’abord il vaut mieux déclarer un attribut virtuel dans le modèle Course au lieu d’utiliser “contact”:


public $contactName;

Il faudrait aussi l’ajouter dans les attributs safe dans les règles de validation.

Ensuite dans la méthode search() :


$criteria2=new CDbCriteria;

list($nomPartiel, $prenomPartiel) = explode(' ', $this->contactName);

$criteria2->compare('contact.lastname', $nomPartiel, true);

$criteria2->compare('contact.firstname', $prenomPartiel, true, 'OR');

$criteria->mergeWith($criteria2);

Et dans la vue


array(

    'name'=>'contactName',

    'value'=>'$data->contact->lastname." ".$data->contact->firstname',

),

Merci pour ta réponse rapide bennouna.

ça me donne une erreur d’exécution sur la ligne


list($nomPartiel, $prenomPartiel) = explode(' ', $this->contactName);

Undefined offset: 1

Apparemment, c’est le explode qui n’a pas fonctionné.

J’ai essayé d’utiliser 2x le contactName et il n’y a plus d’erreur.




    $criteria2=new CDbCriteria;

    //list($nomPartiel, $prenomPartiel) = explode(' ', $this->contactName);

    $criteria2->compare('contact.lastname', $this->contactName, true);

    $criteria2->compare('contact.firstname', $this->contactName, true, 'OR');

    $criteria->mergeWith($criteria2);



Par contre, le problème de filtre et tri persiste.

Pas d’idée pour le problème du filtre et du tri ?

pour compléter la réponse de bennouma

un peu de lecture s’impose

lecture 0

http://www.yiiframework.com/wiki/281/searching-and-sorting-by-related-model-in-cgridview

lecture 1

http://www.yiiframework.com/wiki/319/searching-and-sorting-by-count-of-related-items-in-cgridview/

lecture 2

http://www.yiiframework.com/wiki/385/displaying-sorting-and-filtering-hasmany-manymany-relations-in-cgridview/

bon courage c’est un peu chaud…mais bon avec de la patience ça devrait aller