Afficher Des Données D'un Autre Model

Bonjour étant débutante sur Yii, je suis capable de créer des models et des cruds grâce à Gii.

Mon problème est le suivant :

Je réalise un projet de covoiturage sous yii et sur la page d’accueil j’aimerais afficher les données d’un autre model

Par exemple : Ma page d’accueil afficherait les différents trajets de covoiturage proposés par d’autres membres sous forme de liste.

J’ai donc une table users et une table rides (les trajets)

Comment afficher les données des rides sur une page différente de l’index des rides ?

Merci d’avance pour vos futures réponses que j’attends avec impatience :)

Julia Buchs

Bonjour Julia

Cela va fortement dépendre de comment tu souhaites afficher ces données.

Gii n’est utilisé que pour générer un CRUD, mais dès que tu veux un site un minimum évolué, il faut ajouter du code.

La première action à faire consiste à t’assurer que les relations entre les models sont bien définies (one-to-many, many-to-one, …)

Ensuite, pour garder une structure MVC correcte, il faut que tu récupères les données qui t’intéressent dans le contrôleur, et que tu passes ces données à la vue qui va uniquement les afficher.

Pour récupérer ces données, utilise les relations définies dans les models.

cela peut paraitre vague, mais je pourrai te donner des explications plus précises si tu as un exemple plus précis (relations entre users et rides, informations des rides à afficher…)

Yannick

Oh ! Merci pour cette réponse si rapide :)

Je vais donc essayer d’indiquer les informations que tu m’as demandé.

Voilà l’arborescence des fichiers concernés :

./models/Rides.php

./models/Users.php

La page d’index du site n’a donc pas de modèle

./views/rides/{index.php,view.php,…) Les fichiers par défaut créés lors de la création de CRUD via gii

./views/users/{index.php,view.php,…)

./views/site/index.php Le fichier où je voudrais afficher les différents rides avec leurs utilisateurs, créé par défaut par yii

Relations inscrites dans le model de rides (Il faut savoir que j’avais d’abord créé la base de données sous mysql workbench avant de l’importer dans phpmyadmin, les relations inscrites ci-dessous se sont donc générées automatiquement)




public function relations()

	{

		// NOTE: you may need to adjust the relation name and the related

		// class name for the relations automatically generated below.

		return array(

			'comments' => array(self::HAS_MANY, 'Comments', 'rides_id'),

			'registrations' => array(self::HAS_MANY, 'Registrations', 'rides_id'),

			'ridebadges' => array(self::HAS_MANY, 'Ridebadges', 'rides_idr'),

			'rides' => array(self::BELONGS_TO, 'Rides', 'rides_id'),

			'rides1' => array(self::HAS_MANY, 'Rides', 'rides_id'),

			'towns' => array(self::BELONGS_TO, 'Towns', 'towns_id'),

			'townsId1' => array(self::BELONGS_TO, 'Towns', 'towns_id1'),

			'users' => array(self::BELONGS_TO, 'Users', 'users_id'),

		);

	}



Relations inscrites dans Users




public function relations()

	{

		// NOTE: you may need to adjust the relation name and the related

		// class name for the relations automatically generated below.

		return array(

			'comments' => array(self::HAS_MANY, 'Comments', 'users_id'),

			'registrations' => array(self::HAS_MANY, 'Registrations', 'users_id'),

			'rides' => array(self::HAS_MANY, 'Rides', 'users_id'),

			'votes' => array(self::HAS_MANY, 'Votes', 'users_id'),

		);

	}



Voici les captures d’écran de l’application :

Page d’accueil

5184

covoiturage1.PNG

Page d’un rides

5185

covoiturage2.PNG

J’aimerais donc pouvoir afficher sous forme de tableau les différents rides présents dans la base de données sur la page de la première image. Les différentes informations que j’aimerais voir figurer dans le tableau de la page d’accueil sont par exemple le nom de l’utilisateur conducteur et différentes données à propos du trajet. Remarquez que j’ai réussi à remplacer l’id de l’utilisateur par son pseudo en passant par les relations

Voici le code que j’ai utilisé (dans ./views/rides/view.php)




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

	'data'=>$model,

	'attributes'=>array(

		'id',

		'users_id',

		array(

			'name'=>'users_id',

			'value' => $model->users->cpnvId,

			),

		'towns_id',

		'towns_id1',

		'rides_id',

		'description',

		'departure',

		'arrival',

		'seats',

		'startDate',

		'endDate',

		'day',

	),

));



Julia Buchs

Ok, alors tu peux déjà découper le travail en plusieurs étapes:

  1. Afficher un tableau contenant les rides,

  2. Ajouter les informations du user,

  3. Inclure ce tableau dans la page d’index.

Etape 1:

La bonne nouvelle, c’est que Yii (ou plutôt Gii) s’est déjà chargé de l’étape 1: normalement la page “localhost/covoiturage/covoiturage/rides” doit utiliser un composant CGridView pour afficher tous les rides du site avec les informations qu’ils contiennent dans un tableau paginé et triable.

Etape 2:

Dans la vue “rides/index.php”, tu as la configuration du CGridView avec la liste des colonnes. Je ne suis plus sur mais il y a de fortes chances qu’il existe déjà une colonne “users” qui contient l’id du conducteur.

Pour simplifier la compréhension par la suite, tu peux changer le nom de la relation dans le bout de code




public function relations()

        {

                // NOTE: you may need to adjust the relation name and the related

                // class name for the relations automatically generated below.

                return array(

                        'comments' => array(self::HAS_MANY, 'Comments', 'rides_id'),

                        'registrations' => array(self::HAS_MANY, 'Registrations', 'rides_id'),

                        'ridebadges' => array(self::HAS_MANY, 'Ridebadges', 'rides_idr'),

                        'rides' => array(self::BELONGS_TO, 'Rides', 'rides_id'),

                        'rides1' => array(self::HAS_MANY, 'Rides', 'rides_id'),

                        'towns' => array(self::BELONGS_TO, 'Towns', 'towns_id'),

                        'townsId1' => array(self::BELONGS_TO, 'Towns', 'towns_id1'),

                        '[color="#0000FF"][b]conducteur[/b][/color]' => array(self::BELONGS_TO, 'Users', 'users_id'),

                );

        }

Comme cela, tu pourras accéder directement aux infos de cet utilisateur directement depuis un ride associé:




$monRide->conducteur->prenom



pour avoir le prénom par exemple.

Du coup il n’y a plus qu’à dire dans la config de CGridView que c’est le prénom que tu veux afficher:




array(

    'name'=>'users_id',

    'value' => $model->conducteur->prenom,

),



Etape 3:

La il y a plein de solutions qui vont dépendre de la suite que tu comptes donner à ton projet:

  • Redirection Apache

  • Utiliser l’urlManager de Yii

Mais bon on sort du sujet

Voila, bon courage et bon amusement avec Yii.

Yannick

Salut yannick , moi aussi jai eu ce probleme mais j’ai essayer ta solution ça ne marche pas , on m’affiche une erreur :=>

Trying to get property of non-object