Yii Framework Forum: Recherche sur trois tables - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Recherche sur trois tables Rate Topic: -----

#1 User is offline   Co-k-ine 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 97
  • Joined: 29-March 10

Posted 08 July 2011 - 05:00 AM

Bonjour à tous,

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

Voici mon shémas :

Posted Image

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 :
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');
	}


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 :
$this->render('../films/_view', array(
        'model' => $model->films,
        ));


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 :
foreach($model->films as $relatedModel) {
echo $relatedModel->titre;
echo $relatedModel->affiche;
}
cela fonctionne très bien.

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

Merci de votre aide.
0

#2 User is offline   Co-k-ine 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 97
  • Joined: 29-March 10

Posted 11 July 2011 - 04:29 PM

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
0

#3 User is offline   Clem 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 30
  • Joined: 15-November 10

Posted 18 July 2011 - 01:37 PM

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?
0

#4 User is offline   Co-k-ine 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 97
  • Joined: 29-March 10

Posted 20 July 2011 - 04:17 AM

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 :
	public function actionView($id) {
		$this->render('view', array(
			'model' => $this->loadModel($id, 'Pays'),
		));
	}


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

je voudrais mettre quelque chose comme ceci :

$this->widget('zii.widgets.CListView', array(
	'dataProvider'=>$model->films,
	'itemView'=>'../films/_view',
)); 


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 :
<div class="view">

	
	<?php echo GxHtml::link('<img src="http://images.allocine.fr/r_160_214/b_1_cfd7e1/'.GxHtml::encode($data->Affiche).'" alt="'.GxHtml::encode($data->titre).'" title="voir '.GxHtml::encode($data->titre).'" hspace="15">'
                , array('view', 'id' => $data->idFilms)); ?>



	<br />
	<?php echo GxHtml::encode($data->getAttributeLabel('titre')); ?>:
	<?php echo GxHtml::encode($data->titre); ?>
	<br />
	<?php echo GxHtml::encode($data->getAttributeLabel('Titre_original')); ?>:
	<?php echo GxHtml::encode($data->Titre_original); ?>

	<br />
	<?php echo GxHtml::encode($data->getAttributeLabel('Acteurs')); ?>:
	<?php echo GxHtml::encode($data->Acteurs); ?>
	<br />
	<?php echo GxHtml::encode($data->getAttributeLabel('Realisateurs')); ?>:
	<?php echo GxHtml::encode($data->Realisateurs); ?>
	<br />
	
	<?php echo GxHtml::encode($data->getAttributeLabel('Date_de_sortie')); ?>:
	<?php echo GxHtml::encode($data->Date_de_sortie); ?>
           <br />
	<?php echo GxHtml::encode($data->getAttributeLabel('Duree')); ?>:
	<?php echo GxHtml::encode($data->Duree); ?>
	<br />
</div>


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

 foreach($model->films as $data) {
	
        
        echo GxHtml::link('<img src="http://images.allocine.fr/r_160_214/b_1_cfd7e1/'.GxHtml::encode($data->Affiche).'" alt="'.GxHtml::encode($data->titre).'" title="voir '.GxHtml::encode($data->titre).'" hspace="15">'
                , array('view', 'id' => $data->idFilms)); ?>



	<br />
	<?php echo GxHtml::encode($data->getAttributeLabel('titre')); ?>:
	<?php echo GxHtml::encode($data->titre); ?>
	<br />
	<?php echo GxHtml::encode($data->getAttributeLabel('Titre_original')); ?>:
	<?php echo GxHtml::encode($data->Titre_original); 
}?>

et sa fonctionne sans problème. Alors ma question est pourquoi est-ce que je n'arrive pas à utilisé :
$this->widget('zii.widgets.CListView', array(
	'dataProvider'=>$model->films,
	'itemView'=>'../films/_view',
));
alors que dans foreach il n'y a aucun problème ? Auriez-vous une solution pour m'éviter de copier/coller ?
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users