【问题标题】:How to implement a sidebar in Zend Framework如何在 Zend Framework 中实现侧边栏
【发布时间】:2010-11-18 06:30:12
【问题描述】:

如何在 Zend Framework 中实现侧边栏? 我知道我可以在 Zend_layout 中使用占位符或类似的东西,但是如何在我的控制器中自动生成侧边栏的代码,而不必在每个控制器中调用侧边栏类? 我的设置如下

Application
- modules
  - blog
  - other modules

我只想要博客模块的侧边栏。

我找到了这个http://www.zfforums.com/zend-framework-components-13/model-view-controller-mvc-21/how-layout-sidebar-etc-2677.html,但我不明白最后一部分“只需注入您的布局,将其注册到前端控制器......”

【问题讨论】:

    标签: model-view-controller zend-framework


    【解决方案1】:

    您可以在其中一个呈现侧边栏的控制器中执行操作和视图。

    来自您刚刚调用的博客模块的布局:

    <? echo $this->action('action','controller','module',array('optionalparams'=>1); ?>
    

    在你想要的位置。因此,一呼百应。

    【讨论】:

    • 我相信这很贵。
    • 贵是什么意思? AFAIK 就是这样做的方法。 zfforums 链接中提到的代码与 MVC 模式恕我直言。
    • 谢谢,我知道这应该很容易。我只需要弄清楚如何为每个模块设置不同的布局。现在我对每个模块都有相同的布局。笨蛋:贵是什么意思?如果我在控制器中调用操作会更便宜吗?我的第一个想法是创建一个固定侧边栏的默认控制器,然后在我的所有博客控制器中从该控制器继承。
    • 不幸的是,目前 ZF 不支持开箱即用的每个模块的布局。但与往常一样,实施它并不难。详情请参阅dustint.com/archives/28
    • 感谢您的快速回答。
    【解决方案2】:

    您可以渲染一个包含侧边栏元素的“部分视图脚本”,而不是使用操作堆栈和 action() 视图助手。

    # in your layout.phtml
    <div id="sidebar">
        <?php echo $this->render('blog/_sidebar.phtml'); /*relative to your view scripts directory*/ ?>
    </div>
    
    # in blog/_sidebar.phtml
    <div id="blog_categories">
        <?php foreach ($this->categories as $category): ?>
            <?php echo $category->name; ?>
        <?php endforeach; ?>
    </div>
    

    render() 视图助手用于渲染另一个视图脚本的内容。它与所有其他视图脚本具有相同的范围,因此如果有任何变量分配给视图,它们将可用于您的部分。所以在上面的例子中,categories 变量是在控制器中设置的。

    还有另一个视图助手称为partial() 视图助手。这个函数有点贵,因为它创建了自己的变量范围。换句话说,您当前的视图变量都将不可用。你将有一个干净的工作,这意味着你必须传递你需要的任何变量:

    # in your layout.phtml
    <div id="sidebar">
        <?php echo $this->partial('blog/_sidebar.phtml', array('categories2'=>$this->categories)); ?>
    </div>
    
    # in blog/_sidebar.phtml
    <div id="blog_categories">
        <?php foreach ($this->categories2 as $category): ?>
            <?php echo $category->name; ?>
        <?php endforeach; ?>
    </div>
    

    我发现自己不经常使用partial(),因为它更昂贵,而且我很少需要创建单独的上下文。

    就设置在侧边栏部分中使用的变量(本示例中为$this-&gt;categories)而言,我根据特定问题使用了许多不同的方法。如果它特定于控制器动作,我将编写代码并在视图脚本中分配它:

    # controller
    public function somethingAction()
    {
        $this->view->categories = $this->_getCategoriesForThisParticularAction();
        // other controller code
    }
    

    如果我的代码对控制器的所有操作更通用,我将使用控制器的preDispatch() 函数。如果它对多个控制器更通用,我会将代码放在我的基本控制器的init()(我的大部分控制器都扩展的控制器)。

    有时我什至没有将代码放入我的控制器中。如果它足够简单,我只需将代码粘贴在部分中。如果它更复杂一点,我会将其移至视图助手。这可能会破坏 MVC 模式,但我认为这确实取决于特定情况以确定最佳位置。

    【讨论】:

      【解决方案3】:

      如果您使用 Zend_Layout,只需按照 Rufinus 的说明添加带有 Action viewhelper 的侧边栏即可。

      在您的布局脚本中:

      <div id="sidebar">
      <?php echo $this->action('action', 'controller', 'module', array('optionalparams'=>1)); ?>
      </div>
      <div id="content">
      <?php echo $this->layout()->content; ?>
      </div>
      

      这应该满足您问题中发布的要求。

      【讨论】:

      • 感谢您确认 Rufinus 的回答
      猜你喜欢
      • 1970-01-01
      • 2017-10-13
      • 1970-01-01
      • 2017-07-16
      • 1970-01-01
      • 2013-03-13
      • 1970-01-01
      • 2012-03-29
      • 1970-01-01
      相关资源
      最近更新 更多