【问题标题】:Zend Framework: LayoutZend 框架:布局
【发布时间】:2009-12-05 11:19:50
【问题描述】:

如何在 layout.phtml 中添加一些变量? 我可以将它添加到每个控制器中,如下所示:Sending variables to the layout in Zend Framework

但这并不是真正的暗示,我也不想在 Bootstrap 中添加它。

【问题讨论】:

    标签: php zend-framework layout


    【解决方案1】:

    您可以创建一个名为 LayoutDefaults 的前端控制器插件:

    class MyLib_Controller_Plugin_LayoutDefaults extends Zend_Controller_Plugin_Abstract
    {    
      public function preDispatch(Zend_Controller_Request_Abstract $request)
      {
        $mvc = Zend_Layout::getMvcInstance();
        if ( !$mvc ) return;
        $view = $mvc->getView();
        if ( !$view ) return;
    
        /**
         * Set the defaults.
         */
        $view->value1 = "default value1";
      }
    }
    

    在您的前端控制器中:

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

    在你的 layout.phtml 中:

    <?= $this->escape($this->value1) ?>
    

    最后,在您的控制器中,根据需要覆盖默认值:

    $this->view->value1 = "new value 1";
    

    【讨论】:

      【解决方案2】:

      创建将扩展 Zend_Controller_Action 的新抽象控制器。

      IndexController extends My_Controller_Action -> My_Controller_Action extends Zend_Controller_Action

      你应该在那里输入init() 任何你想要的东西。 :)

      【讨论】:

        【解决方案3】:

        听起来您正试图将视图内容排除在控制器之外。我也相信尝试将视图内容排除在控制器之外,因此我会尽可能将视图内容放置在我的视图中。我是这样做的:

        例如,在 layout.phtml 中我可能有两个占位符,一个用于标题,另一个用于主要内容:

        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
        <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
        <head>
          <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
          <title><?php echo $this->escape($this->placeholder('titleContent')) ?></title>
        </head>
        <body>
          <div id="maincontent">
            <?php echo $this->layout()->content ?>
          </div>
        </body>
        

        然后在 index.phtml 视图本身中,我将两个内容都放在这样的位置:

        <?php $this->placeholder('titleContent')->Set('My Index Page Title') ?>
        <p>Index page content here</p>
        

        您可以根据需要添加任意数量的占位符,而不会影响您的控制器。使用这种方法,大多数内容都不会出现在控制器之外,除非它来自模型。

        【讨论】: