Zend framework 向Zend Framework中的布局发送变量

Zend framework 向Zend Framework中的布局发送变量,zend-framework,layout,zend-view,Zend Framework,Layout,Zend View,在我的项目中,我有许多动态元素,它们一致地出现在每个页面上。我已经把这些放在我的布局中了 我的问题是:如何将变量从控制器发送到布局中 如果我想从控制器发送东西,我可以使用: $this->view->whatever = "foo"; 并在视图中以 echo $this->whatever; 我不知道如何对我的布局做同样的事情。也许有更好的方法解决这个问题?布局是一个视图,因此分配变量的方法是相同的。在您的示例中,如果要回显布局中的$this->任何内容,您应该会看到相同的

在我的项目中,我有许多动态元素,它们一致地出现在每个页面上。我已经把这些放在我的布局中了

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

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

$this->view->whatever = "foo";
并在视图中以

echo $this->whatever;
我不知道如何对我的布局做同样的事情。也许有更好的方法解决这个问题?

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

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

<?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';
   }
}

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

所以我有一个控制器

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

不使用帮助程序或插件,请执行以下操作:

Zend_Layout::getMvcInstance()->assign('whatever', 'foo');
在此之后,您可以在布局中使用以下内容:

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


这将打印“foo”。

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

class Zend_View_helper_abc {

    static public function abc() {
        $html = 'YOUR HTML';
        return $html;
    }
}
因此,您可以在布局中使用此帮助器,如

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


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

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

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

$this->_helper->layout->setLayout('layout');
在布局文件中,可以调用

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

查看帮助程序也是一个好主意。我有一个电子商务网站,我有一个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[]=
在视图/助手中,我有一个名为“菜单”的文件:

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

希望它能帮助那些需要从数据库中获取数据来渲染布局的人。

很酷,谢谢。。。我现在有另一个解决方案,我将发布给其他人参考。我把这个插件放在哪里(哪个文件夹?),我在哪里设置
Zend_Controller_Front::getInstance()->registerPlugin(新的My_布局_插件())?这行代码可以在任何地方使用,但通常在引导类中使用。请查看插件的放置位置。虽然我喜欢这个想法,但我还是忍不住认为使用视图帮助器会更好。基本控制器几乎总是一个非常糟糕的主意。控制器插件和控制器助手是专门为解决基本控制器的不灵活性而创建的(可以概括为组合而非继承)。所以,除非你知道所有的含义-永远不要依赖于自定义基控制器。我知道我在这里提出了死亡,但我有同样的问题@Victor Farazdagi>但是如何将所需的变量传递给视图帮助器呢?对于简单的赋值,这是一个完美的解决方案!我喜欢。1+您也可以通过这种方式分配阵列谢谢您的提示。第一行中有一个额外的括号。请注意,您需要先调用Zend_Layout::startMvc()。
resources.view[]=
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();

    }

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