Zend Framework 定义了一个通用的 placeholder() 视图帮助器你可以用来定制你所需要的占位符。它也提供大量专门的经常所需功能的占位符应用,例如指定 DocType 声明,文档的标题,以及更多。
所有的占位符在总体上运行是一致的。他们是容器,这样以便你能把它们当作收集物来执行。使用它们,你可以做到:
典型的,你不用参数就可以调用这个帮助器,它将返回一个你可以操作的容器。然后你可以输出这个容器来呈现它,或者调用它的方法来配置和填充它。如果容器是空的,呈现它会简单的返回一个空的字符串;否则,内容将会根据你配置的规则被合并。
举例说明,让我们创建一个由一些块内容组成的横幅。你极可能提前知道各个块的结构,让我们假设此例中它看起来是这样的:
<div class="sidebar"> <div class="block"> <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus consectetur aliquet odio ac consectetur. Nulla quis eleifend tortor. Pellentesque varius, odio quis bibendum consequat, diam lectus porttitor quam, et aliquet mauris orci eu augue. </p> </div> <div class="block"> <ul> <li><a href="/some/target" mce_href="some/target">Link</a></li> <li><a href="/some/target" mce_href="some/target">Link</a></li> </ul> </div> </div>
基于控制器和行为,内容会有所不同,但是结构是一样的。这我们首先为我们的 bootstrap 以一种资源方法来建立横幅。
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { // ... protected function _initSidebar() { $this->bootstrap('View'); $view = $this->getResource('View'); $view->placehloder('sidebar') // "prefix" -> markup to emit once before all items in collection ->setPrefix("<div class=/"sidebar/">/n <div class=/"block/">/n") // "separator" -> markup to emit between items in a collection ->setSeparator("</div>/n <div class=/"block/">/n") // "postfix" -> markup to emit once after all items in a collection ->setPostfix("</div>/n</div>"); } // ... }
上面定义了一个占位符,横幅,没有事物。但是它按照我们的要求创建了这个占位符基本的标记结构。
现在,这我们假设全部行为的用户控制器,我们想在顶部出现一个包括一些信息的块。我们可以通过两种方法来完成:(a)我们可以在控制器的 preDispatch() 方法上增加内容,或者(b)我们可以从 preDispatch() 方法内部中呈现一个视图脚本。我们使用(b)计划,因为它遵循一个更多合适的注意力分离(把和视图相关的逻辑和功能留在一个视图脚本内)。
我们会这个视图脚本命名为 user/_sidebar.phtml,用以下内容填满它:
<?php $this->placeholer('sidebar')->captureStart() ?> <h4>User Administration</h4> <ul> <li><a href="<?php $this->url(array('action' => 'list')) ?>"> List</a></li> <li><a href="<?php $this->url(array('action' => 'create')) ?>"> Create</a></li> </ul> <?php $this->placeholder('sidebar')->captureEnd() ?>
以上的例子使用了占位符的内容采集功能。默认的,内容被当作一个新事物附加到容器内,让我们合并内容。这个例子为了创建标记,使用了视图帮助器和静态 HTML,内容然后被采集然后附加进占位符本身。
为了唤醒以上视图脚本,我们要把以下内容写进我们的 preDispatch() 方法中:
class UserController extends Zend_Controller_Action { // ... public function preDispatch() { // ... $this->view->render('user/sidebar.phtml'); // ... } // ... }
注意我们没有采集被呈现的值,这没有必要,因为那个视图整个正在被采集进一个占位符内。
现在,让我们假设我们的在同一个控件器中的 视图 行为需要呈现一些信息。在 user/view.phtml 视图脚本中,我们可能有以下的代码片断:
$this->placeholder('sidebar') ->append('<p>User: ' . $this->escape($this->username) . '</p>');
这个例子使用了 append() 方法,把一些简单的标记传递给它来合并。
最后,让我们修改我们的模板视图,并让它呈现占位符:
<html> <head> <title>My Site</title> </head> <body> <div class="content"> <?php echo $this->layout()->content ?> </div> <?php echo $this->placeholder('sidebar') ?> </body> </html>
对于没有被横幅占位符填充的控制器和行为而言,不会输出内容,而对于被填充的而言,然而,输出占位符将会按照我们在 bootstrap 中制定的规则,我们在整个应用程序内合并的内容来呈现内容。对于 /user/view 行为这个个案,个假设一个用户名为 matthew,我们将按照以下来获得横幅的内容(为了易于阅读,已经做了格式化):
<div class="sidebar"> <div class="block"> <h4>User Administration</h4> <ul> <li><a href="/user/list" mce_href="user/list">List</a></li> <li><a href="/user/create" mce_href="user/create">Create</a></li> </ul> </div> <div class="block"> <p>User: matthew</p> </div> </div>
通过结合占位符和模板脚本,你可以做大量的事情;尝试它们,阅读相关章节来获取更多信息。