Cgridview, Clistview, Cdetailview

Bonjour,

Après pas mal de recherche j’ai trouver beaucoup de code pour modifier les C****View.

Mais aucun ne me convient.

Je vous explique ayant des tables lier entre elle par l’id j’aimerai afficher non pas l’id mais le nom relier a cette id.

Jusqu’à présent j’ai réussi a créer un lien vers la description de l’élément en relation avec l’id mais c’est tous.

dans CGridView


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

	'data'=>$model,

	'attributes'=>array(

		'ID_INCIDENT',

		array(

			'name'=>'ID_RUBRIQUE_1',

                        'lable'=>'ID_RUBRIQUE_1',

			'type'=>'raw',

                        'value'=>CHtml::link(CHtml::encode($model->ID_RUBRIQUE_1),array('rubrique1/view','id'=>$model->ID_RUBRIQUE_1)),

                ),

                'ID_RUBRIQUE_2',

		'ID_RUBRIQUE_3',

		'ID_AGENT_IMPLIQUE',

		'DESCRIPTION',

....

et dans CListView en modifiant le fichier _view.php. On commente ce que l’on ne veux pas afficher.

Ma question:

Comment faire pour chaque C****View d’afficher une autre variable (NOM_RUBRIQUE_1 au lieu de ID_RUBRIQUE_1) d’une autre table? (pas forcement en url).

Merci d’avance.

Cordialement

Voici une image pour décrire le CDetailView

5568

Capture.PNG

A la place de 1 j’aimerai le nom

et quand je clic dessus il m’anène ici:

5569

Capture2.PNG

donc le lien ce fais bien mais j’arrive pas a récupérer le nom…

Cordialement

Il y’a plusieurs moyens d’arriver à ce que tu veux !

Personnellement pour relier un Id à un nom,

  1. j’ai créé une ForeignKey dans ma BDD

Attention ma BDD est en Postgresql !




ALTER TABLE tbl_post

  ADD CONSTRAINT fk_post_author FOREIGN KEY (author_id)

      REFERENCES tbl_user (id) MATCH SIMPLE

      ON UPDATE RESTRICT ON DELETE CASCADE;



Si t’as BDD est en Mysql :




CONSTRAINT FK_post_author FOREIGN KEY (author_id)

		REFERENCES tbl_user (id) ON DELETE CASCADE ON UPDATE RESTRICT



2)Ensuite je modifie mes fichiers “views” de maniere a traduire l’id de l’auteur en nom.

Dans un CgridView je procede de cette maniere :




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

	'id'=>'post-grid',

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

	'filter'=>$model,

	'columns'=>array(

		'id',

		array(

            'name'=>'title',

            'type'=>'raw',

            'value'=>'CHtml::link(CHtml::encode($data->title))'

        ),

		'content',

		'tags',

		array(

		'name'=>'status',

		'value'=>'Lookup::item("PostStatus",$data->status)',

		'filter'=>Lookup::items('PostStatus'),

		),

		'create_time',

		//'update_time',

		'author.username', // ne pas oublier de définir les relations dans relations() !!

		array(

			'class'=>'CButtonColumn',

		),

	),



/!\ Attention /!\ => il est nécéssaire de modifier les relations en fonction.

EDIT : je viens de trouver un post sur ce que tu veux faire.

http://www.yiiframework.com/forum/index.php/topic/51269-afficher-des-donnees-dun-autre-model/

Salut Navy74

Première réponse qui me vient à l’esprit, je ne sais pas si ça conviendra, mais on ne perd rien à essayer ^^

J’ai rencontré un probleme (formatage de date) dans un CGridView, la réponse pourrait aussi s’adapter à toi :

Dans le CGridView :




array (

			'name' => 'dateCreation',

			'value' => array($model, 'formatDate') // appel de la fonction formatDate($data, $row) de la classe Consultation

		),



Dans le model :




/**

	 * Appelée dans protected/view/consultation/index.php

	 * Retourne la valeur formatée de la date de création

	 * @param Consultation $data donée courrante

	 * @return date Date à afficher

	 */

	public static function formatDate ($data) {

		return date("d/m/Y", strtotime($data->dateCreation));

	}



Je vois un peu ton code comme ça :

View :




array(

                        'name'=>'ID_RUBRIQUE_1',

                        'lable'=>'ID_RUBRIQUE_1',

                        'type'=>'raw',

                        'value'=> array($model, 'getLink')

                ),




Model :




public static function getLink($data) {

   $rubrique = Rubrique::model()->findByPk($data->ID_RUBRIQUE1); // a adapter

   return CHtml::link($rubrique->nomRubrique, array('rubrique1/view','id'=>$model->ID_RUBRIQUE_1));

}



Si j’ai bien cerné ton problème ça devrait faire l’affaire

Tiens moi au courant ^^

Rebonjour Garfield et Arkiens,

Je regarde vos solution et je vous tiens au courant.

Cordialement

Pour l’admin.php

des que je modifie le CGridView il me retourne directement une erreur

La propriété « CDataColumn.lable » est indéfinie.

L’avez vous déjà vue? (entrain de faire des recherche =) )

Et pour le view erreur

Trying to get property of non-object

(avec la méthode de Arkiens)

En recherche aussi je vous tiens au courant demain.

Où est située l’erreur ?

Si dans le controlleur : vérifie que ton ID ne pointe pas vers une donnée inexistante

remplace ‘label’ par ‘nom’

pour savoir comment manipuler le CgridView :

http://www.yiiframework.com/doc/api/1.1/CGridView

voici un exemple :

j’ai deux tables T1 et T2

T1(id,libellecle) et T2(id,nom,idcle). idcle est la clé étrangère venant de la table T1.

T2.php (model)




<?php

class T1 extends CActiveRecord

{

	public $cstename_search; // permet de faire des recherche en tapant le libelle de la clé étrangère


        public function rules()

	{

	  return array(

	         array('nom,cstename_search', 'safe', 'on'=>'search'),

	  );

	}

        public function relations()

	{

	  return array(

            	'relconstante'=> array(self::BELONGS_TO, 'T1', 'idcle'),

	  );

	}

	public function attributeLabels()

	{

		return array(

			'relconstante.libellecle'=> 'Constante',

			'cstename_search'=> 'Constante',

                );

	}

	public function search()

	{

		$criteria=new CDbCriteria;

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

                $criteria->compare('relconstante.libellecle',$this->cstename_search, true);

		return new CActiveDataProvider($this, array(

			'criteria'=>$criteria,

		));

	}



dans la vue admin au niveau (T2)




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

	'id'=>'table-grid',

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

	'filter'=>$model,

	'columns'=>array( // Liste des colonnes affichées 

		'id',

                'nom',

		array(

			 'name'=>'cstename_search', 

			 'value'=>'$data->relconstante->libellecle'  // Affiche le libellé de la clé étrangère

		),

	),

)); ?>




Et voilà le tour est joué. Essayez cela pour voir en l’adaptant à votre cas.

Par contre attention si ta clé étrangère peut etre null dans la table T2 alors le dernier array écris le plutot comme cela




  array(

      'name'=>'cstename_search', 

      'value'=>'(isset($data->relconstante->libellecle) && $data->relconstante->libellecle!==null  && $data->relconstante->libellecle!=="")?$data->relconstante->libellecle:""'

     ),



n’oublie surtout pas de mettre les quotes (’’) au niveau de la ligne value.

Bonjour,

Merci beaucoup à Gueye, Garfield et Arkiens=)

Voici les codes finaux pour afficher les noms a la place de l’id ForeignKey:

(Récapitulatif des messages précédant).

Pour CListView (index.php):

-Modifier le fichier _view.php

Au lieu de:


echo CHtml::encode($data->ID_VOULU);

Mettre ceci:


<?php $libelle = TABLEVOULU::model()->findByPK($data->ID_VOULU);

echo $libelle->NOM_VOULU;?>

[b][u]

Pour CDetailView (view.php):[/u][/b]

Dans view.php après:


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

	'data'=>$model,

	'attributes'=>array(

Modifier ID_VOULU par


		

array(

      'name'=>'ID_VOULU',

      'value'=> array($model, 'getLink')

     ),

Dans le model de TABLE_VOULU




public static function getLink($data) 

{

        $rubrique = TABLEVOULU::model()->findAllBySQL('select ID_VOULU, NOM_VOULU from TABLE_VOULU where ID_VOULU='.$data->ID_VOULU);

        $rubrique = CHtml::listData($rubrique, 'ID_VOULU', 'NOM_ID_VOULU');

	foreach($rubrique as $value)

	{

		return $value;

	}

}



[b][u]

Pour CGridView (admin.php):[/u][/b]

Dans admin.php après:


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

	'id'=>'TABLE_VOULU-grid',

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

	'filter'=>$model,

	'columns'=>array(

Modifier ID_VOULU par




array(

      'name'=>'ID_RUBRIQUE_1',

      'value'=> '$data->relconstante->NOM_RUBRIQUE_1'

      ),

Dans le model de TABLE_VOULU:

Ajouter dans la fonction relations (après le return array)


'relconstante'=> array(self::BELONGS_TO, 'TABLEVOULU', 'ID_VOULU'),

Ajouter dans le fonction attributeLabels(après le return array)


'relconstante.NOM_VOULU'=> 'Constante d'affichage',

Ajouter dans le fonction search




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

$criteria->compare('relconstante.NOM_RUBRIQUE_1',$this->ID_RUBRIQUE_1, true);

sans oublier d’enlever (toujours dans search)


$criteria->compare('ID_VOULU',$this->ID_VOULU);

Merci encore à tous ceux qui m’on aider.

Cordialement

De rien :) bonne continuation sur Yii :lol: la prochaine c’est toi qui m’aide ;)

Avec grand plaisir =)