Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
Actuellement dans mon fichier header.phtml j'ai cette portion de code
href="<?php echo $this->baseUrl;?>/public/styles/site.css" />
Dans mon fichier index.phtml j'ai cette ligne : <?php echo $this->render('header.phtml'); ?>
$this->baseUrl fait référence à IndexController ou je défini "$this->view->baseUrl = $this->_request->getBaseUrl();"
Ce que je ne comprends pas : comment se fait-il que $this défini dans le fichier header.phtml fasse référence à l'objet défini par IndexController ? d'après ce que j'ai pu comprendre index.phtml est référencé par IndexController, et donc header.phtml n'a pas de lien avec IndexController.
En fait, je souhaiterai arriver à écrire ce code :
href="<?php echo $this->path_css />
au lieu de
href="<?php echo $this->baseUrl;?>/public/styles/site.css" />
ou
href="<?php echo $this->MaClassPath->path_css" />
Je ne sais pas ou déclarer la classe MaClassPath ou variable path_css pour qu'elle soit connu par tous controlleur de mon site.
Pouvez-vous me renseigner ?
Hors ligne
En fait, quand tu es en phase de rendu, c'est l'objet vue qui travail. Donc le $this fait référence a la vue.
Dans ton contrôleur, quand tu fais $this->view->toto = 'titi', tu initialises la variable toto dans l'instance de l'objet vue.
Pour obtenir ce que tu veux, il suffit dans ton controleur d'initialiser la variable que tu souhaites avec la valeur que tu souhaites. Elle sera dispo dans la vue via $this->tavariable.
donc au lieu de
$this->view->baseUrl = $this->_request->getBaseUrl();
tu fais
$this->view->path_css = $this->_request->getBaseUrl() . '/public/styles/site.css';
Ca c'est pour un contrôleur. Maintenant, si tu souhaites que tous les contrôleurs prépare la même variable pour la vue sans avoir à répéter le code, tu peux dériver le contrôleur et tu ajouter dans l'init() du contrôleur le code que tu souhaites voir exécuter par tout tes contrôleurs .
Plus, simple, tu fais faire un simple view helper qui te fera la même chose et qui sera dispo pour toutes tes vues, indépendamment du contrôleur.
class View_Helper_GetCss { const CSS = '/public/styles/site.css'; /** membre statique pour ne faire la recherche qu'une seule fois */ private static $_css = false; /** * retourne le path css relatif à la racine du srv web * * @return string path css */ public function getCss() { if(self::$_css === false) { self::$_css = Zend_Controller_Front::getInstance()->getRequest()->getBaseUrl() . self::CSS; } return self::$_css; } } // Dans header.phtml href="<?php echo $this->getCss() ?>"
Hors ligne
Bonjour,
D'abord le principe :
- par défaut tu as une vue (un objet Zend_View) créé par le ZF auquel tu accèdes dans tes controlleurs avec $this->view. Quand tu fais $this->view->toto = "Mon nom est toto", ça définit une variable toto accessible dans la vue.
- ensuite à la fin de ton controlleur (c'est fait automatiquement dans la configuration par défaut), le ZF affiche le fichier .phtml qui correspond.
- Pour afficher ce fichier phtml, il appelle la fonction _run() de la vue qui inclut le fichier .phtml.
- Donc en fait tout ton code .phtml est lancé à l'intérieur d'une méthode de ton objet $this->view. Comme tu est à l'intérieur du $this->view, tu accès directement à tes paramètres avec $this->toto (qui vaut donc "Mon nom est toto")
Dans la pratique, pour faire dans la vue :
<?php echo $this->path_css; ?>
il faut avoir fait dans le controlleur
$this->view->path_css = "/mon_chemin_vers_la_css/titi.css";
A+, Philippe
Edit : Damned, je me suis fait griller sur le poteau par Titerm...
Dernière modification par philippe (06-02-2008 08:52:36)
Hors ligne
Les helpers fonctionnent sur un principe similaire.
Pour le css, tu as headStyle
Pour créer des liens routés, tu as url
Hors ligne
non le phtml n'a rien à voir avec ton contrôleur
par contre il à tout a voir avec ta vue.
le front controleur crée ton contrôleur et un objet vue. il accroche cette vue à ton contrôleur.
tu peux donc la manipuler avec $this->view
lorsque tu lance le rendu et que tu donne (ou pas) le fichier phtml à utiliser
tu rend la main au front controleur qui lui la donne à la vue qui va faire le rendu.
c'est donc l'objet vue qui exécute son code. $this à ce moment là est donc la vue et non pas le contrôleur.
elle va charger le code phtml et l'évaluer dans son propre contexte son $this est la vue.
voilà comment le $this du phtml se retrouve être le même objet que le $this->view su controlleur.
A+JYT
Hors ligne
Pour résoudre une partie du problème, la balise html <base href=""> peux simplifier un peu pour tous les liens avec l'url de base
Mais bon ca ne réponds pas vraiment à la question (quoique un peu)
Hors ligne
Dans les codes sources que j'utilise comme source d'inspiration (divine) je ne créé pas d'objet Vue, elle doit se créer automatiquement alors. Comment savoir qu'elle vue affiche quel fichier .phtml ?Est-ce que j'ai plutôt intérêt à créer dés maintenant un objet vue et l'utiliser ? Fondamentalement, une vue = un controlleur ? Je n'ai pas encore chercher à comprendre le fonctionnement des Vues, pour ne pas surcharger ce post, je vais faire un nouveau tour sur les docs et revenir certainement plus tard.
Hors ligne
non ta vue est crée automatiquement mais le script utilisé pour le rendu est choisit en fonction du nom du contrôleur et de l'action
http://dns/moncontroller/monaction
appelle le controller /app/controller/moncontrollerController.php, exécute la methode monactionAction
et est associé au script
/moncontroller/monaction.phtml
si tu veux rendre un autre script que celui associé par défaut il te faut faire $this->render('autre.phtml') pour que ZF le choisisse.
pour ton problème il te faut intervenir dans ton contrôleur
par exemple dans la methode ini
tu peux alors placer tous les éléments que tu initialise dans ta vue dans toutes tes actions de ton contrôleur
si tu veux le faire pour tous les contrôleur dans
/application/controllers tu crée une classe Application_Controllers_Action et dans tes controleur tu dérive de celle-ci
Zend_Loader::loadClass("Application_Controllers_Action"); class IndexController extends Application_Controllers_Action
ainsi tous tes contrôleur sont initialisé avec tous tes variables de vue que tu as défini dans la methode ini.
voici ma classe Application_Controllers_Action
Zend_Loader::loadClass("Zend_Controller_Action"); class Application_Controllers_Action extends Zend_Controller_Action { public function init() { parent::init(); $this->initView(); $this->view->page = new StdClass(); $this->view->module = $this->_request->getModuleName(); $this->view->controller = $this->_request->getControllerName(); $this->view->action = $this->_request->getActionName(); $this->view->baseUrl = $this->_request->getBaseUrl(); if ($parameters = Zend_Registry::get('Parameters')) { $this->_auth = $parameters->fast->get('auth', false); if($this->_auth) { $user = Zend_Auth::getInstance()->getIdentity(); if ($user) { $this->user = clone($user); $this->view->user = clone($user); if(isset($user->profile)) $this->view->user->profile = clone($user->profile); } } $menu = $parameters->fast->get('menu', false); if($menu) { Zend_Loader::loadClass('Fast_Menu'); $this->menu = new Fast_Menu(); } $this->view->app_version = $parameters->fast->get('version', 'undefined'); $audiance = $parameters->fast->get('audiance', false); if($audiance&&$config = Zend_Registry::get('Configuration')) { $this->view->audience = (object)$config->get('audiance')->toArray(); } } }
A+JYT
Dernière modification par sekaijin (07-02-2008 07:36:32)
Hors ligne