2009-10-08 14 views
38

Dans mon projet, j'ai un certain nombre d'éléments dynamiques qui sont systématiquement sur chaque page. Je l'ai mis dans ma ces layout.phtmlEnvoi de variables à la mise en page dans Zend Framework

Ma question est la suivante: Comment puis-je envoyer des variables dans ma mise en page de mes contrôleurs?

Si je veux envoyer des choses de mon contrôleur je peux utiliser:

$this->view->whatever = "foo"; 

et le recevoir dans la vue avec

echo $this->whatever; 

Je ne peux pas comprendre comment faire la même chose avec ma mise en page . Peut-être y a-t-il un meilleur moyen de contourner le problème?

Répondre

47

La mise en page est une vue, donc la méthode d'affectation des variables est la même. Dans votre exemple, si vous deviez echo $ this-> quoi que ce soit dans votre layout, vous devriez voir la même sortie.

Un problème commun est de savoir comment assigner des variables que vous utilisez sur chaque page de votre mise en page, que vous ne voudriez pas avoir à dupliquer le code dans chaque action du contrôleur. Une solution consiste à créer un plug-in qui affecte ces données avant que la mise en page ne soit rendue. E.g .:

<?php 

class My_Layout_Plugin extends Zend_Controller_Plugin_Abstract 
{ 
    public function preDispatch(Zend_Controller_Request_Abstract $request) 
    { 
     $layout = Zend_Layout::getMvcInstance(); 
     $view = $layout->getView(); 

     $view->whatever = 'foo'; 
    } 
} 

puis d'enregistrer ce plugin avec le contrôleur frontal, par ex.

Zend_Controller_Front::getInstance()->registerPlugin(new My_Layout_Plugin());

+0

cool merci ... J'ai une autre solution que je poste maintenant pour la référence d'autres peuples – sfusion

+4

où dois-je mettre ce plugin (quel dossier?) Et où dois-je définir Zend_Controller_Front :: getInstance() -> registerPlugin (new My_Layout_Plugin()); '? –

+1

Cette ligne fonctionnera n'importe où, mais l'endroit habituel pour faire cela est dans votre classe Bootstrap –

7

I ont une mis en œuvre un contrôleur de base qui tous les autres contrôleurs étendent.

J'ai un contrôleur ...

<?php 
class BaseController extends Zend_Controller_Action 
{ 
    public function init() 
    { 
    $this->view->foo = "bar"; 
    } 
} 

et dans la mise en page et/ou vue

<?= $this->foo ?> 
+1

Est-ce que cela fonctionne? Y at-il une question cachée dans ce :) – Andrew

+0

Bien que j'aime cette idée, je ne peux pas m'empêcher de penser qu'une aide de vue aurait été une meilleure idée. – azz0r

+1

Le contrôleur de base est presque toujours une idée très mauvaise. Les plugins de contrôleur et les aides de contrôleur ont été créés spécifiquement pour adresser l'inflexibilité de contrôleur de base (qui peut être résumé en tant que composition au-dessus de l'héritage). Donc, à moins que vous connaissiez toutes les implications - ne comptez jamais sur le contrôleur de base personnalisé. –

43

Sans utiliser des aides ou des plugins faire:

Zend_Layout::getMvcInstance()->assign('whatever', 'foo'); 

Après cette vous pouvez utiliser les éléments suivants dans votre mise en page:

<?php echo $this->layout()->whatever; ?> 

Ce imprimera "toto".

+4

Pour des missions simples, c'est une solution parfaitement élégante! Aimer. 1 + –

+0

Vous pouvez également affecter des tableaux de cette façon – 10us

+0

Merci pour le conseil. Il y a une parenthèse supplémentaire dans cette première ligne. – getWeberForStackExchange

1

Eh bien, je suppose que vous pouvez avoir une autre solution en créant vue helper .. créer un fichier dans application/views/helper et nommez-le comme vous voulez abc.php puis mettez le code suivant là-bas.

class Zend_View_helper_abc { 

    static public function abc() { 
     $html = 'YOUR HTML'; 
     return $html; 
    } 
} 

Vous pouvez utiliser cette aide dans la mise en page comme ..

<?= $this->abc() ?> 
0

Comme une note de côté, si vous envoyez JSON à un moment donné dans votre application veiller à ce que les variables globales de vue ne sont pas envoyés avec la réponse.

3

Les variables d'affichage standard sont disponibles si vous utilisez la mise en page dans le MVC.Dans le fichier d'amorçage, comprennent ceci:

Zend_Layout::startMvc(); 

Vous devez alors dire chaque contrôleur (ou même chaque action, si vous voulez un contrôle granulaire sur plusieurs mises en page différentes) qui mise en page à utiliser. J'ai mis le mien dans le init() de chaque contrôleur. Voici un exemple, si votre fichier de mise en page est nommé layout.phtml:

$this->_helper->layout->setLayout('layout'); 
1
class IndexController extends Zend_Controller_Action 
{ 

    public function init() 
    { 
     $this->_layout = $this->_helper->layout->getLayoutInstance(); 
     $this->_layout->whatever = $this->view->render('test.phtml); 
    } 
} 

Dans le fichier de mise en page, vous pouvez appeler

<p><?php echo $this->layout()->whatever ?> 

Si dans certaines actions si vous ne voulez pas que l'article puis:

public function viewAction() 
{ 
    $this->_layout->whatever = null; 
} 
0

Les aides sont également une bonne idée. J'ai eu un site de commerce électronique, dont j'avais un layout.phtml avec des menus avec des catégories et des sous-catégories que j'avais besoin d'apporter de la base de données.

Pour cela, je ne les suivantes:

Bootstrap.php:

protected function _initHelperPath() 
{ 

    $view = $this->bootstrap('view')->getResource('view'); 

    $view->setHelperPath(APPLICATION_PATH . '/views/helpers', 'View_Helper'); 

} 

application.ini:

resources.view[]= 

Dans les vues/aides, j'avais un fichier appelé menus:

class View_Helper_Menus extends Zend_View_Helper_Abstract { 

    public function categories(){ 

     $categories = new Application_Model_DbTable_Categories(); 

     return $categories->fetchAll(); 

    } 

    public function subCategories(){ 

     $subCategories = new Application_Model_DbTable_SubCategories(); 

     return $subCategories->fetchAll(); 

    } 

} 

En layout.phtml, je viens d'avoir à appeler l'aide spécifique et appeler les méthodes de celui-ci:

$menu = $this->getHelper('Menus'); 
$categories = $menu->categories(); 
$subCategories = $menu->subCategories(); 

aide quelqu'un espère que ce qui a besoin d'apporter des données de base de données pour rendre la mise en page.