在Zend Framework中将变量发送到布局

时间:2009-10-08 13:09:51

标签: zend-framework layout zend-view

在我的项目中,我有许多动态元素,每个页面都是一致的。我把这些放在我的layout.phtml

我的问题是:如何从控制器向我的布局发送变量?

如果我想从我的控制器发送东西,我可以使用:

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

视图中接收它
echo $this->whatever;

我无法弄清楚如何对我的布局做同样的事情。也许有更好的解决方法吗?

8 个答案:

答案 0 :(得分:46)

布局视图,因此分配变量的方法是相同的。在您的示例中,如果您要回显$ this->在布局中的任何内容,您应该看到相同的输出。

一个常见问题是如何将您在每个页面上使用的变量分配给布局,因为您不希望在每个控制器操作中复制代码。一个解决方案是创建一个插件,在渲染布局之前分配这些数据。 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';
   }
}

然后使用前端控制器注册此插件,例如

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

答案 1 :(得分:43)

不使用帮助器或插件:

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

在此之后,您可以在布局中使用以下内容:

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

这将打印“foo”。

答案 2 :(得分:7)

我实现了一个基本控制器,所有其他控制器都可以扩展。

所以我有一个控制器......

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

并在布局和/或视图中

<?= $this->foo ?>

答案 3 :(得分:3)

如果在MVC中使用布局,则可以使用标准视图变量。在bootstrap文件中,包括:

Zend_Layout::startMvc();

然后,您必须告诉每个控制器(甚至每个操作,如果您想要对几个不同的布局进行精细控制)要使用哪个布局。我把我放在每个控制器的init()中。这是一个例子,如果您的布局文件名为layout.phtml:

$this->_helper->layout->setLayout('layout');

答案 4 :(得分:1)

嗯,我想你可以通过创建视图帮助器来创建另一个解决方案..在application / views / helper中创建一个文件并将其命名为abc.php然后将以下代码放在那里。

class Zend_View_helper_abc {

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

所以你可以在布局中使用这个帮助器,比如..

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

答案 5 :(得分:1)

class IndexController extends Zend_Controller_Action
{

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

在布局文件中,您可以调用

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

如果在某些操作中,如果您不想要该部分,那么:

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

答案 6 :(得分:0)

作为旁注,如果您在应用中的某个位置发送json,请注意不会随响应一起发送全局视图变量。

答案 7 :(得分:0)

查看助手也是一个好主意。我有一个电子商务网站,我有一个layout.phtml,其中包含我需要从数据库中带来的类别和子类别的菜单。

为此,我做了以下事情:

bootstrap.php中:

protected function _initHelperPath() 
{

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

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

}

的application.ini:

resources.view[]=

在views / helpers中,我有一个名为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();

    }

}

在layout.phtml中,我只需要调用特定的帮助器,并从中调用方法:

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

希望它可以帮助需要从数据库中提取数据的人来呈现布局。