Recherche sur trois tables

Bonjour à tous,

Je fais encore appel à vous car je n’arrive pas à faire une recherche sur trois tables avec yii.

Voici mon shémas :

Enfaite j’aimerais pouvoir “filtrer” les films par acteurs, réalisateurs, genres, pays, etc … Grâce à votre aide j’ai pu réussir à réalisé un filtrage avec les acteurs/réalisateurs. Mais là c’est plus difficile de le faire avec le genre du film.

J’utilise l’extension giix qui gère mieux les relations multi-tables.

Ainsi dans mon /views/pays/view.php j’ai juste à faire :

[CODE]foreach($model->films as $relatedModel) {

	echo GxHtml::openTag('li');


	echo GxHtml::link(GxHtml::encode(GxHtml::valueEx($relatedModel)), array('films/view', 'id' => GxActiveRecord::extractPkValue($relatedModel, true)));


	echo GxHtml::closeTag('li');


}[/CODE]

pour afficher tout les films ayant le même pays. Jusque la tout est à l’aise (sauf que je n’ai pas la pagination).

J’ai donc logiquement tenté un :

[CODE]$this->render(’../films/_view’, array(

    'model' => $model->films,


    ));[/CODE]

pour pouvoir lister les films “proprement” mais ça ne fonctionne pas, j’ai une erreur : “Undefined variable: data”. (il ne peux accéder au divers information du film (titre, affiche, etc …)

pourtant lorsque je fais :

[CODE]foreach($model->films as $relatedModel) {

echo $relatedModel->titre;

echo $relatedModel->affiche;

}

[/CODE] cela fonctionne très bien.

J’espère avoir été assez clair :s

Merci de votre aide.

Bonjour à tous,

Je me permet de faire un petit up car j’ai vraiment tout tenté pour régler ce problème mais rien n’y fait.

J’ai même tenté une requête :

$dataProvider=Films::model()->with('pays')->findAll();

Mais toujours ce problème de "Undefined variable: data".

Raoul je dois te dire que sur ce coup tout mes espoirs reposent sur toi :D

Bonne journée à tous

Pour avoir la pagination c’est plus simple de faire ta recherche avec CPagination

Exemple dans ton FilmsController.php


public function actionIndex()

	{


    	$dataProvider=new CActiveDataProvider('Films', array(

			'criteria'=>array(

				'order'=>'id DESC',

			),

			'pagination'=>array(

				'pageSize'=>20,

			),

		));

  	

		

		$this->render('index',array(

			'dataProvider'=>$dataProvider,

		));	

	}

Ensuite dans ton index.php


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

	'dataProvider'=>$dataProvider,

	'itemView'=>'_view',

)); ?>

Et dans ton _view.php (dans le dossier films, toujours), tu fais ton affichage pour chaque film.




<h2><?php echo $data->titre; ?></h2>

<p><?php echo $data->affiche; ?></p>




C’est un truc du genre que tu cherchais?

Bonjour,

Tout d’abord merci de ta réponse clem, je commençais à me sentir abandonné ^^.

Dans mon PaysController (le contrôleur qui me permet de savoir dans quel pays a été tourné le film (USA, GB, etc …)

j’ai mon action view comme celle-ci :

[CODE]

public function actionView(&#036;id) {


	&#036;this-&gt;render('view', array(


		'model' =&gt; &#036;this-&gt;loadModel(&#036;id, 'Pays'),


	));


}[/CODE]

Et dans ma vue (view/pays/view.php)

je voudrais mettre quelque chose comme ceci :

[CODE]

$this->widget(‘zii.widgets.CListView’, array(

'dataProvider'=&gt;&#036;model-&gt;films,


'itemView'=&gt;'&#46;&#46;/films/_view',

)); [/CODE]

Mais j’obtiens une erreur ( Fatal error: Call to a member function getData() on a non-object in /var/www/yii-1.1.8/framework/zii/widgets/CBaseListView.php on line 105 )

ma vue des films (view/films/_view.php)

correspond à ceci :



&lt;div class=&quot;view&quot;&gt;





	


	&lt;?php echo GxHtml::link('&lt;img src=&quot;http://images.allocine.fr/r_160_214/b_1_cfd7e1/'.GxHtml::encode(&#036;data-&gt;Affiche).'&quot; alt=&quot;'.GxHtml::encode(&#036;data-&gt;titre).'&quot; title=&quot;voir '.GxHtml::encode(&#036;data-&gt;titre).'&quot; hspace=&quot;15&quot;&gt;'


                , array('view', 'id' =&gt; &#036;data-&gt;idFilms)); ?&gt;











	&lt;br /&gt;


	&lt;?php echo GxHtml::encode(&#036;data-&gt;getAttributeLabel('titre')); ?&gt;:


	&lt;?php echo GxHtml::encode(&#036;data-&gt;titre); ?&gt;


	&lt;br /&gt;


	&lt;?php echo GxHtml::encode(&#036;data-&gt;getAttributeLabel('Titre_original')); ?&gt;:


	&lt;?php echo GxHtml::encode(&#036;data-&gt;Titre_original); ?&gt;





	&lt;br /&gt;


	&lt;?php echo GxHtml::encode(&#036;data-&gt;getAttributeLabel('Acteurs')); ?&gt;:


	&lt;?php echo GxHtml::encode(&#036;data-&gt;Acteurs); ?&gt;


	&lt;br /&gt;


	&lt;?php echo GxHtml::encode(&#036;data-&gt;getAttributeLabel('Realisateurs')); ?&gt;:


	&lt;?php echo GxHtml::encode(&#036;data-&gt;Realisateurs); ?&gt;


	&lt;br /&gt;


	


	&lt;?php echo GxHtml::encode(&#036;data-&gt;getAttributeLabel('Date_de_sortie')); ?&gt;:


	&lt;?php echo GxHtml::encode(&#036;data-&gt;Date_de_sortie); ?&gt;


           &lt;br /&gt;


	&lt;?php echo GxHtml::encode(&#036;data-&gt;getAttributeLabel('Duree')); ?&gt;:


	&lt;?php echo GxHtml::encode(&#036;data-&gt;Duree); ?&gt;


	&lt;br /&gt;


&lt;/div&gt;

Pourtant il me suffit de coller ce code dans un foreach de ma vue (/view/pays/view.php)



 foreach(&#036;model-&gt;films as &#036;data) {


	


        


        echo GxHtml::link('&lt;img src=&quot;http://images.allocine.fr/r_160_214/b_1_cfd7e1/'.GxHtml::encode(&#036;data-&gt;Affiche).'&quot; alt=&quot;'.GxHtml::encode(&#036;data-&gt;titre).'&quot; title=&quot;voir '.GxHtml::encode(&#036;data-&gt;titre).'&quot; hspace=&quot;15&quot;&gt;'


                , array('view', 'id' =&gt; &#036;data-&gt;idFilms)); ?&gt;











	&lt;br /&gt;


	&lt;?php echo GxHtml::encode(&#036;data-&gt;getAttributeLabel('titre')); ?&gt;:


	&lt;?php echo GxHtml::encode(&#036;data-&gt;titre); ?&gt;


	&lt;br /&gt;


	&lt;?php echo GxHtml::encode(&#036;data-&gt;getAttributeLabel('Titre_original')); ?&gt;:


	&lt;?php echo GxHtml::encode(&#036;data-&gt;Titre_original); 


}?&gt;

et sa fonctionne sans problème. Alors ma question est pourquoi est-ce que je n’arrive pas à utilisé :

[CODE]$this->widget(‘zii.widgets.CListView’, array(

'dataProvider'=&gt;&#036;model-&gt;films,


'itemView'=&gt;'&#46;&#46;/films/_view',

));[/CODE] alors que dans foreach il n’y a aucun problème ? Auriez-vous une solution pour m’éviter de copier/coller ?