Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 06-02-2008 07:57:15

whitespirit
Membre
Date d'inscription: 25-01-2008
Messages: 393

Ou déclarer les variables globales ?

Bonjour,

Actuellement dans mon fichier header.phtml j'ai cette portion de code

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 :

Code:

 href="<?php echo $this->path_css />

au lieu de

Code:

 href="<?php echo $this->baseUrl;?>/public/styles/site.css" />

ou

Code:

 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

 

#2 06-02-2008 08:50:32

TiTerm
Membre
Date d'inscription: 01-07-2007
Messages: 175

Re: Ou déclarer les variables globales ?

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.

Code:

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

 

#3 06-02-2008 08:51:22

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: Ou déclarer les variables globales ?

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 :

Code:

<?php echo $this->path_css; ?>

il faut avoir fait dans le controlleur

Code:

$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)


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#4 06-02-2008 09:26:41

Julien
Membre
Date d'inscription: 16-03-2007
Messages: 501

Re: Ou déclarer les variables globales ?

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

 

#5 06-02-2008 14:20:43

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: Ou déclarer les variables globales ?

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

 

#6 06-02-2008 17:13:31

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: Ou déclarer les variables globales ?

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 smile
Mais bon ca ne réponds pas vraiment à la question (quoique un peu)

Hors ligne

 

#7 07-02-2008 06:04:21

whitespirit
Membre
Date d'inscription: 25-01-2008
Messages: 393

Re: Ou déclarer les variables globales ?

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

 

#8 07-02-2008 07:33:26

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: Ou déclarer les variables globales ?

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

Code:

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

Code:

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

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages