2

所以我有一个关于 Zend 框架在布局方面的一般代码组织的问题。

我的布局基本上是这样的:

(LAYOUT.PHTML)

<div id='header'>
<?= $this->Layout()->header ?>
</div>

<div id='main'>
<?= $this->Layout()->main ?>
</div>

<div id='footer'>
<?= $this->Layout()->footer ?>
</div>

等等等等。现在,为了使页眉中的代码与主代码和页脚代码分开,我为视图创建了一个文件夹,其中包含 header.phtml、main.phtml、footer.phtml。然后我使用此代码将 header.phtml 的内容分配给 $this->layout()->header:

(INDEX.PHTML)

$this->Layout()->header = file_get_contents('index/header.phtml');
$this->Layout()->main = file_get_contents('index/main.phtml');
$this->Layout()->footer = file_get_contents('index/footer.phtml');

那工作得很好,但我已经到了不想让 main 成为静态 HTML 的地步。我希望能够用 PHP 插入一些值。因此,在 indexAction 的控制器中,我希望能够从我的数据库中加载并将值放入 index/main.phtml。有没有办法在不重组我的网站的情况下做到这一点?

如果没有,有没有办法做到这一点,以便我可以拥有:

  1. 将代码放入布局的不同部分的能力,例如 Layout()->header、Layout->footer。

  2. 将这些部分分成不同的文件,以便于查找和组织它们,例如我的 index/footer.phtml、index/main.phtml 等。

  3. 不必将该代码不必要地放入引号中以将其转换为字符串以将其传递给 Layout()->header 等。

非常感谢你们的帮助。

-伊森

4

5 回答 5

1

这是一个想法:

  • 分配 layout()->header 文件名而不是内容。
  • 把你的代码放在这个文件中
  • 在你的布局文件中,include() 或 require() 布局->header()。

由于您的布局页眉/页脚现在已解析,您可以像使用视图一样使用它们。

于 2009-06-17T19:23:02.173 回答
1

->headerin$this->layout()->header响应段。$this->_helper->viewRenderer->setResponseSegment('header');您可以在操作中使用渲染部分响应。

于 2009-06-18T11:55:12.380 回答
1

如果你使用

$this->layout()->header = $this->render('index/header.phtml');

它甚至会使用视图,因此在呈现标题时保留定义的所有变量。

我建议使用类似的东西

<?php echo ($header = $this->layout()->header)? 
      $header : $this->render('headerDefault.phtml'); ?>

在您的布局文件中 - 如果视图脚本没有覆盖它,它将呈现布局文件夹中的默认标题。

于 2009-08-12T18:10:49.023 回答
0

您是否尝试过查看视图助手。它们是将视图逻辑结构化为可重用和模块化代码的一种方式。在这种情况下,您将使用视图助手来生成每个所需的段。所以你的示例视图脚本看起来像

$this->Layout()->header = $this->header();
$this->Layout()->main = $this->main();
$this->Layout()->footer = $this->footer();

使用视图助手而不是 include 和 require 语句的好处是所有文件处理和名称解析都由框架处理。该手册包含有关如何设置路径和使用示例等的更多信息。

于 2009-06-17T20:12:36.597 回答
0

帮手很好。另一个选项与上面类似,将文件名放在页眉/页脚中 - 将模板名称和 use$this->render($this->layout()->header))等放在一起。这就像上面的 include/require 一样,但更加一致。

于 2009-06-17T22:35:28.433 回答