affichage objet et sous objet quand sous objet null

Bonjour,

J’ai un objet livre et un objet auteur

J’ai une CGridView qui m’affiche une liste d’objet livre et avec le nom de l’auteur, je fais donc $data->auteur->nom pour accéder à la propriété nom de l’objet auteur issue de l’objet livre.




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

	'id'=>'livre-auteur-grid',

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

	'filter'=>$model,

	'columns'=>array(

		'id',

                array(

		  'header' => 'Nom auteur',

		  'name' => 'nom_search',

		  'value' => '$data->auteur->nom',

		),

		array(

			'class'=>'CButtonColumn',

		),

	),

)); ?>



Parfois j’ai un livre sans auteur, j’ai donc une erreur de type “Trying to get property of non-object”, normale.

Comment faire pour afficher une chaine vide dans le champs nom de l’auteur quand je n’ai pas d’auteur afin d’éviter l’erreur ?

Bonjour,

Regarde ce lien il m’a appris comment appeller le controlleur et faire des fonction dans le controller a partir des vue.

http://www.yiiframework.com/forum/index.php/topic/54328-cgridview-clistview-cdetailview/

Après dans ta fonction il suffit de mettre un if si l’auteur est null afficher null.

Je pense que ca peux marcher.

En te répondant rapidement.

Cordialement Navy

Merci pour le lien j’ai trouvé juste ce que je voulais en fait j’avais mis un if en trop dans la variable value.

Voilà ce qu’il fallait écrire :




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

        'id'=>'livre-auteur-grid',

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

        'filter'=>$model,

        'columns'=>array(

                'id',

                array(

                  'header' => 'Nom auteur',

                  'name' => 'nom_search',

                  'value' => 'isset($data->auteur)?$data->auteur->nom : ""',

                ),

                array(

                        'class'=>'CButtonColumn',

                ),

        ),

)); ?>



Derien c’est avec plaisir.

Cordialement Navy

J’ai une autre astuce: utiliser CHtml::value().

Cela devient:


 'value'=>'CHtml::value($data,"auteur.nom")'

Un peu plus long en exécution, mais plus rapide à écrire et plus lisible ;-). Je l’utilise tout le temps.

Beaucoup plus propre en effet, merci :wink:

En “2ième lecture” et répondant avec un peu plus de recul, je suggère d’utiliser mon extension http://www.yiiframework.com/extension/relatedsearchbehavior/ .

Avec cette extension (Behavior), il convient de définir une relation ‘nom_auteur’ à la valeur ‘auteur.nom’, et d’ajouter ‘nom_auteur’ dans les rules comme un champs autorisé pendant la recherche.

Ensuite, il ne sera plus nécessaire de définir un ‘nom_search’, ni d’implémenter spécifiquement la recherche dans la colonne de la table lié car RelatedSearchBehavior s’occupe de tout cela.

Il est vrai que j’utilises tout le temps “CHtml::value”, mais pour les CGridView j’utilise RelatedSearchBehavior.

De plus, une fois que ‘nom_auteur’ est défini pour RelatedSearchBehavior, ‘nom_auteur’ est disponible comme ‘champs virtuel’ et je peux utiliser $model->nom_auteur à tout moment, ainsi que $model->nom_auteur($value,…) qui est un scope permettant de limiter les recherches (find, findAll, …) par rapport à ce champs virtuel nom_auteur.

Cela nécessitera un peu de temps à comprendre, mais c’est très très puissant et fera gagner beaucoup de temps par la suite.

(Et ceux qui souhaitent pourraient venir dans mes Bureaux à Bezons pour une petite formation (contre rémunération) - on pourrait éventeuellement faire une première réunion Yii officielle en France).