代码之家  ›  专栏  ›  技术社区  ›  Billy ONeal IS4

如何在Zend_应用程序中使用多个视图(使用Zend_布局)?

  •  3
  • Billy ONeal IS4  · 技术社区  · 14 年前

    我有一个4个单独的“块”的布局。他们是:

    • 带有菜单和面包屑的导航面板。这是使用Zend_导航构建的。
    • 侧边栏,默认显示常规“新闻”
    • 一个内容区域,其中放置每个控制器操作的主输出
    • 一个标题区域,位于导航上方,通常只显示一些库存文本和一张照片。

    内容区符合Zend_应用程序文档所述的传统单视图模型,但其他三个不符合。它们都有合理的默认视图可供使用,但是如果需要,控制器需要能够覆盖它们。例如,管理页面覆盖“Newsy”视图以显示系统上最近执行的管理操作的日志是有意义的。

    这个 Zend_Layout / Zend_Application 但是,所有示例都假定一个视图(它们调用 <?php echo $this->layout()->content; ?> .

    如何完成这种对布局的覆盖?我唯一想到的解决方案是存储重写 Zend_View S内 Zend_Registry ,但这似乎是用管道胶带把东西粘在一起;)

    2 回复  |  直到 13 年前
        1
  •  4
  •   Andries    14 年前

    我相信你所指的是“命名段”。Zend框架的响应对象支持这些所谓的“命名段”,并允许您将正文内容分隔成不同的段。

    例如,使用以下布局文件:

    <div id="nav">
        <?php echo $this->layout()->nav ?>
    </div>
    <div id="content">
        <?php echo $this->layout()->content ?>
    </div>
    

    这里有两个命名段,分别是“内容”和“导航”。默认情况下,视图脚本的输出将呈现到“内容”段。为了将输出呈现到“nav”段,可以在控制器中执行以下操作:

    <?php
    
    $response = $this->getResponse();
    $response->insert('nav', $view->render('nav.phtml'));
    
    ?>
    

    当与actionstack操作助手结合使用时,此功能特别有用。例如,您在一个管理页面上,并且您希望覆盖“nav”部分,然后您可以确定每个控制器要呈现给该段的部分。最好的解释方法是通过一个代码示例:

    <?php
    
    class PageController extends Zend_Controller_Action
    {
        public function barAction()
        {
            // this would render the output of NavController::menuAction()
            // to the "nav" segment (note how we set the response segment in the
            // NavController in order to do this)
            $this->_helper->actionStack('menu', 'nav');
        }
    }
    
    class NavController extends Zend_Controller_Action
    {
        public function menuAction()
        {
            $this->_helper->viewRenderer->setResponseSegment('nav'); 
            // do stuff
        }
    }
    
    ?>
    
        2
  •  3
  •   Tim Fountain    14 年前

    通常,您会有一个布局,其中包含标题区、导航面板、内容区和边栏。内容区域将使用包含的$this->layout()->内容片段加载,其他块可以在主布局中调用或通过包含。部分。如果使用后一种方法,布局文件可能如下所示:

    <html>
    <head>
    <title><?=$this->headTitle()?></title>
    </head>
    
    <body>
    
    <?=$this->render('_header.phtml')?>
    
    <?=$this->render('_navigation.phtml')?>
    
    <?=$this->render('_sidebar.phtml')?>
    
    <?=$this->layout()->content?>
    
    </body>
    </html>
    

    如果您发现您的部分包含的PHP代码多于HTML,那么您可以考虑编写一个助手。所以您可以沿着这些行创建一个侧边栏助手:

    <?php
    class My_View_Helper_Sidebar extends Zend_view_Helper_Abstract
    {
        public function sidebar()
        {
            $html = '';
    
            // code to generate side bar here
    
            return $html;
        }
    }
    ?>
    

    然后,您将调用侧边栏助手,而不是像上面那样呈现部分内容:

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

    控制器可以很容易地覆盖布局,因此您可以创建一个管理布局,它类似于上面的示例,但没有侧边栏,并且可能具有不同的标题。然后你会让你的管理员控制器使用这个而不是默认的。

    我可以想到一些情况,您需要配置多个Zend_视图对象,这意味着您正在考虑。