Zend框架 - '包含'的布局最佳实践

4

我对Zend还比较陌生,想知道如何为我的网站建立布局和结构。我的网站将有用户个人资料部分、管理员部分和默认视图。

对于管理员和个人资料,我会在页眉和页脚中添加自定义元素,否则我希望使用通用的页眉/页脚。

我希望能够拥有一个完全独立于默认视图的自定义皮肤,应该如何组织结构?

到目前为止,我已经在application/目录下创建了一个名为layouts的文件夹。我修改了application.ini文件以便考虑到这一点:

resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"

现在我的默认布局视图位于application/layouts/scripts/layout.phtml,我将页眉和页脚嵌入此layout.phtml文件中,但我想将它们剥离出来放在单独的文件中。

有人能帮助我设计这个结构吗?总之,我想要一个自定义的默认布局、自定义的管理布局、自定义的用户个人资料布局,在这三个布局中都可以定制页眉/页脚"包含",但我不确定在Zend中如何正确地完成这个操作,因为我习惯使用include文件。

4个回答

9

目录结构:

/application
  /layouts
    /scripts
      /layout.phtml
      /profile.phtml
      /admin.phtml
      /_header.phtml
      /_footer.phtml

layout.phtml:

<?php echo $this->doctype('HTML4_STRICT') ?>
<html> 
<head>  
  <title>Bah</title>
</head> 
<body>
  <?php echo $this->render('_header.phtml') ?>
  <?php echo $this->layout()->content ?>
  <?php echo $this->render('_footer.phtml') ?>
</body>
</html>

profile.phtml:

<?php echo $this->doctype('HTML4_STRICT') ?>
<html> 
<head>  
  <title>Profile</title>
</head> 
<body>
  <!-- profile header -->
  <?php echo $this->layout()->content ?>
  <!-- profile footer-->
</body>
</html>

FooController.php:

profileAction()
{
    // do stuff
    $this->_helper->layout->setLayout('profile');
}

这种方法允许您更改不同布局的整个页面结构(管理员突然需要一个侧边栏!)。您可以通过增强灵活性和可维护性来换取一些代码重复。

如果这对您来说不重要,视图助手也可以使用(查询前端控制器以查找请求是否来自管理或个人资料操作,然后切换)。但对我来说,这种逻辑过于复杂,不适合放在视图中。


太棒了,正是我所需要的 - 我会尝试实现它。 - meder omuraliev

1
为了在网站的不同部分拥有不同的布局/配置,我使用以下模块设置的模块。 模块配置 [编辑]
目录结构:
/application
    /forms
    /models
    /modules
        /admin
            /config
            /contollers
            /layout
            /views
        /default
            /config
            /contollers
            /layout
            /views

模块与视图助手或部分视图助手有何不同? - meder omuraliev
我使用这种方法是因为每个模块都有自己的布局和配置目录,这意味着控制器不会设置替代布局。我发现这也使得通过模块来控制访问更容易。 目录结构: /application /forms /models /modules /admin /config /contollers /layout /views /default /config /contollers /layout /views - piddl0r
呃,那看起来真的很丑啊,我会把它加入到答案中。 - piddl0r

1

如果视图助手很复杂,请使用具体的视图助手。如果它们像<h1>我的标题</h1>这样简单,请使用部分视图助手来呈现模板。


您介意提供一个包含文件名header.phtml和footer.phtml的partial view helpers的结构和示例代码吗?或者任何其他有效的方式也可以。 - meder omuraliev
//头部 <?php echo $this->partial('header.phtml', $optionalArrayWithDataToBeUsedInside);第二个参数,如array('title' => 'my page'),允许您在局部中使用echo $this->title。有关视图助手设置,请参阅手册。 - Tomáš Fejfar

-1

我使用的一种实现方式如下:

在每个布局phtml文件(默认,管理等)中,

我使用:

<?= $this->action('header', 'page', 'default') ?>
<?= $this->layout()->content ?>
<?= $this->action('footer', 'page', 'default') ?>

在我的页面控制器中,我可能有一个名为“headerAction”或“adminHeaderAction”的操作,它什么也不做(或者实际上可以执行特定任务),但返回一个header.phtml(在那里我可以为该布局自定义我的标题信息)。然后,我可以将我的页眉和页脚与内容分开定制。
在我的控制器中,我只需要设置适当的布局即可。
$this->_helper->layout->setLayout('adminLayout');

1
这是错误的,因为动作助手会触发新的请求循环。那会很慢。 - Tomáš Fejfar
同意。action view helper 很坑啊。我希望他们早点把它移除掉 :) http://framework.zend.com/issues/browse/ZF-5840 - Richard Nguyen
1
好观点。我从未考虑过额外的往返(对于每一个)。 - Arthur Frankel
呵呵,没事的,每个人都会犯这样的错误。不过你的 setLayout() 是完全正确的。 - Richard Nguyen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接