Sending variables to the layout in Zend Framework

后端 未结 8 1534
[愿得一人]
[愿得一人] 2020-11-28 06:45

In my project I have a number of dynamic elements that are consistently on every page. I have put these in my layout.phtml

My question is: How can I send variables i

相关标签:
8条回答
  • 2020-11-28 07:24

    As a side note, if you send json at some point in your app be careful that global view variables are not sent with the response.

    0 讨论(0)
  • 2020-11-28 07:30

    I have a implemented a Base Controller which all other controllers extend.

    So I have a controller...

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

    and in the layout and/or view

    <?= $this->foo ?>
    
    0 讨论(0)
  • 2020-11-28 07:30
    class IndexController extends Zend_Controller_Action
    {
    
       public function init()
       {
          $this->_layout = $this->_helper->layout->getLayoutInstance();
          $this->_layout->whatever = $this->view->render('test.phtml);
       }
    }
    

    In the layout file you can call

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

    If in some actions if you don't want that section then:

    public function viewAction()
    {
       $this->_layout->whatever = null;
    }
    
    0 讨论(0)
  • 2020-11-28 07:39

    View Helpers are also a good idea. I had a ecommerce website, which I had a layout.phtml with menus with categories and subcategories that I needed to bring from the database.

    For this, I did the following:

    Bootstrap.php:

    protected function _initHelperPath() 
    {
    
        $view = $this->bootstrap('view')->getResource('view');
    
        $view->setHelperPath(APPLICATION_PATH . '/views/helpers', 'View_Helper');
    
    }
    

    application.ini:

    resources.view[]=
    

    In views/helpers, I had a file called 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();
    
        }
    
    }
    

    In layout.phtml, I just had to call the specific helper, and call the methods from it:

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

    Hope it helps someone that needs to bring data from database to render the layout.

    0 讨论(0)
  • 2020-11-28 07:42

    The layout is a view, so the method for assigning variables is the same. In your example, if you were to echo $this->whatever in your layout, you should see the same output.

    One common problem is how to assign variables that you use on every page to your layout, as you wouldn't want to have to duplicate the code in every controller action. One solution to this is to create a plugin that assigns this data before the layout is rendered. 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';
       }
    }
    

    then register this plugin with the front controller, e.g.

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

    0 讨论(0)
  • 2020-11-28 07:42

    Without using helpers or plugins do :

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

    After this you can use the following in your layout:

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

    This will print "foo".

    0 讨论(0)
提交回复
热议问题