39

在我的项目中,我有许多动态元素,它们在每一页上都是一致的。我已将这些放在我的 layout.phtml 中

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

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

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

并在视图中接收它

echo $this->whatever;

我不知道如何对我的布局做同样的事情。也许有更好的方法来解决这个问题?

4

8 回答 8

47

布局一个视图,所以分配变量的方法是一样的。在您的示例中,如果您要在布局中回显 $this->whatever,您应该会看到相同的输出。

一个常见的问题是如何将您在每个页面上使用的变量分配给您的布局,因为您不希望在每个控制器操作中都复制代码。对此的一种解决方案是创建一个插件,在呈现布局之前分配此数据。例如:

<?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());

于 2009-10-08T13:47:52.233 回答
43

不使用助手或插件:

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

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

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

这将打印“foo”。

于 2010-08-10T17:46:32.870 回答
7

我有一个实现了所有其他控制器扩展的基本控制器。

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

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

并在布局和/或视图中

<?= $this->foo ?>
于 2009-10-08T14:15:34.067 回答
3

如果您在 MVC 中使用布局,则可以使用标准视图变量。在引导文件中,包括以下内容:

Zend_Layout::startMvc();

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

$this->_helper->layout->setLayout('layout');
于 2012-09-25T14:45:56.930 回答
1

好吧,我想您可以通过创建视图助手来获得另一种解决方案。在 application/views/helper 中创建一个文件并将其命名为您想要的任何名称,abc.php然后将以下代码放在那里。

class Zend_View_helper_abc {

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

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

<?= $this->abc() ?>
于 2011-10-13T06:12:25.630 回答
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;
}
于 2013-02-21T02:35:44.713 回答
0

附带说明一下,如果您在应用程序中的某个时间点发送 json,请注意全局视图变量不会随响应一起发送。

于 2012-04-16T10:27:57.630 回答
0

View Helpers 也是一个好主意。我有一个电子商务网站,我有一个 layout.phtml,其中包含需要从数据库中获取的类别和子类别的菜单。

为此,我做了以下事情:

引导程序.php:

protected function _initHelperPath() 
{

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

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

}

应用程序.ini:

resources.view[]=

在视图/助手中,我有一个名为 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();

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

于 2013-11-05T22:01:05.987 回答