ajouter un model dans le controller par defaut sur l'action index


(Tanebisse) #1

Bonjour,

J’ai besoin d’afficher en continue le resultat d’une valeur contenue en base quelque soit l’action.

J’ai donc tenté dans le SiteController dans l’action index de charger le modèle voulu et de l’ajouter en paramètre du render comme ce ci :


public function actionIndex()

	{

		// renders the view file 'protected/views/site/index.php'

		// using the default layout 'protected/views/layouts/main.php'

		$toto = Parametre::model()->findByAttributes(array('code'=>'TOTO'));

		$this->render('index',array('toto'=>$toto));

	}

Puis dans la page views/layouts/main.php j’ai ajouté àa avant le <html> et le doctype


<?php 

/* @var $this Controller */ 

/* @var $toto Parametre */

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

Puis plus loin dans le code j’ai un affichage du contenu de $toto :


<?php echo $toto->nom ; ?>

Hélas ça ne fonctionne pas quelqu’un aurait-il une idée ?


(Mj011nir) #2

Bonjour,

Avant toute chose :

  • Ce n’est pas parce que tu mets qqch dans actionIndex que cela va être répercuté dans toutes les actions de ton contrôleur. C’est juste l’action par défaut, celle qui est appelée quand l’action n’est pas précisée.

  • Le fait d’ajouter les annotations @var en début de fichier ne sert qu’à assurer l’autocomplétion dans ton IDE, et à faire une sorte de pense-bête afin de connaître les éléments que ton contrôleur passe à la vue sans être obligé d’éditer ton fichier de contrôleur.

Alors je n’ai pas épluché la question mais je vois une solution relativement “propre” :

Si tous tes contrôleurs héritent de la même classe Controller comme c’est le cas par défaut, tu peux rajouter dans cette classe Controller qqch comme :




public $toto;


public function init()

{

    $this->toto = Parametre::model()->findByAttributes(array('code' => 'TOTO'));

}



Cette fonction init s’exécute à l’initialisation de ta classe Controller, ainsi tous tes contrôleurs en profiteront, ainsi que tes vues. Tu pourras donc accéder à ton objet comme ceci dans ta vue :




<?php echo $this->toto->nom; ?>




(Tanebisse) #3

Oui effectivement j’avais aussi pensé à ça mais je ne voulais pas modifier une classe du framework.

Autrement je crée un nouveau Controller MyController qui étends la classe Controller dans laquelle je surcharge la fonction init() et j’en fais hérité chacune de mes classes Controller.

Sinon merci pour tes autres précisions.


(Tanebisse) #4

Oubliez ce que je viens d’écrire j’avais pas vu que la classe Controller se trouvait dans Component !