【问题标题】:Sending variables to the layout in Zend Framework在 Zend Framework 中将变量发送到布局
【发布时间】:2010-12-04 23:51:18
【问题描述】:

在我的项目中,我在每个页面上都有许多动态元素。我已经把这些放在了我的 layout.phtml

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

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

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

并在视图中接收它

echo $this->whatever;

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

【问题讨论】:

    标签: zend-framework layout zend-view


    【解决方案1】:

    布局一个视图,所以分配变量的方法是一样的。在您的示例中,如果您要回显 $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';
       }
    }
    

    然后将此插件注册到前端控制器,例如

    Zend_Controller_Front::getInstance()-&gt;registerPlugin(new My_Layout_Plugin());

    【讨论】:

    • 很酷,谢谢...我有另一个解决方案,我现在将发布以供其他人参考
    • 我在哪里放置这个插件(哪个文件夹?)以及我在哪里设置Zend_Controller_Front::getInstance()-&gt;registerPlugin(new My_Layout_Plugin());
    • 该行在任何地方都可以使用,但通常的地方是在您的 Bootstrap 类中
    • 插件的放置位置请参见stackoverflow.com/questions/2400772/…
    【解决方案2】:

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

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

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

    在布局和/或视图中

    <?= $this->foo ?>
    

    【讨论】:

    • 虽然我喜欢这个主意,但我不禁认为视图助手会是一个更好的主意。
    • 基本控制器几乎总是一个非常糟糕的主意。控制器插件和控制器助手是专门为解决基本控制器的不灵活性而创建的(可以概括为组合而不是继承)。所以,除非你知道所有的含义 - 永远不要依赖自定义基础控制器。
    • 我知道我在这里复活,但我也有同样的问题。 @Victor Farazdagi > 但是你如何将所需的变量传递给视图助手?
    【解决方案3】:

    不使用助手或插件:

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

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

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

    这将打印“foo”。

    【讨论】:

    • 对于简单的作业,这是一个非常优雅的解决方案!爱它。 1+
    • 你也可以这样分配数组
    • 感谢您的提示。第一行有一个额外的括号。
    • 请注意,您需要先调用 Zend_Layout::startMvc()。
    【解决方案4】:

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

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

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        Zend_Layout::startMvc();
        

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

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

        【讨论】:

          【解决方案7】:
          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;
          }
          

          【讨论】:

            【解决方案8】:

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

            为此,我做了以下工作:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-04-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多