Zend Framework1-Zend_Layout 配置选项

来源:互联网 发布:阿拉比卡咖啡豆 知乎 编辑:程序博客网 时间:2024/05/29 16:54

Zend_Layout 配置选项

Zend_Layout有多种配置选项。这些都可以用调用适当的访问器来设置,传递数组或Zend_Config对象给构造器或startMvc(),传递选项数组给setOptions(),或传递Zend_Config对象给to setConfig()。

    layout:被使用的布局。使用当前变形器来解析提供给合适的布局视图脚本的名称。缺省地,这个值是'layout'并解析为'layout.phtml'。访问器是setLayout() 和 getLayout()。

    layoutPath: 布局视图脚本的基本路径。访问器是setLayoutPath() 和 getLayoutPath()。

    contentKey: 用于缺省内容(和MVC一起使用)的布局变量。缺省值是'content'。访问器是setContentKey() 和 getContentKey()。

    mvcSuccessfulActionOnly: 当使用MVC,当动作抛出一个异常并且这个标志为true,布局将不被解析(这是为了防止当ErrorHandler plugin 在使用时,布局被双重解析)。缺省地,这个标记是true。访问器是setMvcSuccessfulActionOnly() 和 getMvcSuccessfulActionOnly()。

    view: 当解析时使用的视图对象。当和MVC一起使用时,如果没有视图对象被显式传递,Zend_Layout 将尝试使用用the ViewRenderer 注册的视图对象。访问器是setView() 和 getView()。

    helperClass: 当和MVC组件一起使用Zend_Layout 时的动作助手。 缺省是 Zend_Layout_Controller_Action_Helper_Layout。访问器是 setHelperClass() 和 getHelperClass()。

    pluginClass: 当和MVC组件一起使用Zend_Layout 时的前端控制器插件类。缺省是 Zend_Layout_Controller_Plugin_Layout。访问器是 setPluginClass() 和 getPluginClass()。

    inflector: 当解析布局名给布局视图脚本路径时的变形器;参见 Zend_Layout 变形器文档有更多细节 。访问器是 setInflector() 和 getInflector()。

    Note: 助手类和插件类必须传递给startMvc()

    为了helperClass和pluginClass设置有效,它们必须作为选项传递给startMvc();如果以后设置,它们就没有影响。


范例

下面的例子假定使用$options数组和$config对象:

<?php
$options = array(
    'layout'     => 'foo',
    'layoutPath' => '/path/to/layouts',
    'contentKey' => 'CONTENT',           // ignored when MVC not used
);
?>
<?php
/**
[layout]
layout = "foo"
layoutPath = "/path/to/layouts"
contentKey = "CONTENT"
*/
$config = new Zend_Config_Ini('/path/to/layout.ini', 'layout');
?>

Example #1 传递选项给构造器或startMvc()

为了配置Zend_Layout实例,构造器和startMvc() 静态方法都可以接受选项数组或带有选项的Zend_Config 对象。

首先,看一下传递数组:

<?php

// Using constructor:
$layout = new Zend_Layout($options);

// Using startMvc():
$layout = Zend_Layout::startMvc($options);
?>

现在使用配置对象:

<?php

$config = new Zend_Config_Ini('/path/to/layout.ini', 'layout');

// Using constructor:
$layout = new Zend_Layout($config);

// Using startMvc():
$layout = Zend_Layout::startMvc($config);

?>

基本上,这是定制Zend_Layout实例的最简单的方法。


Example #2 使用setOption() 和 setConfig()

有时候在Zend_Layout 对象初始化以后才需要配置;setOptions() 和 setConfig()让你快速而起容易地来做:

<?php
// Using an array of options:
$layout->setOptions($options);

// Using a Zend_Config object:
$layout->setConfig($options);

?>

然而要注意特定的选项,如pluginClass 和 helperClass,当用这个方法传递,将没有效果;它们需要传递给构造器或者startMvc() 方法。

Example #3 使用访问器

最后,通过访问器来配置Zend_Layout 实例。所有的访问器实现一个流畅的接口,意味这它们的调用可能被链接:

<?php
$layout->setLayout('foo')
       ->setLayoutPath('/path/to/layouts')
       ->setContentKey('CONTENT');
?>


####################################################################################################


Zend_Layout有两个基本用例:带有Zend Framework MVC和不带。

布局脚本

在两种情况下都需要创建布局脚本。布局脚本简单地使用Zend_View(或者无论哪种你在使用的视图实现)。布局变量用Zend_Layout placeholder 注册,可以通过占位符助手或者通过布局助手从布局对象的对象属性里获取。

如下例:
<!DOCTYPE html
    PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>My Site</title>
</head>
<body>
<?php
    // fetch 'content' key using layout helper:
    echo $this->layout()->content;

    // fetch 'foo' key using placeholder helper:
    echo $this->placeholder('Zend_Layout')->foo;

    // fetch layout object and retrieve various keys from it:
    $layout = $this->layout();
    echo $layout->bar;
    echo $layout->baz;
?>
</body>
</html>

因为Zend_Layout使用Zend_View来解析,你也可以使用任何视图助手注册,并也可以访问任何先前分配的视图变量。特别有用的是各种各样的占位符助手,因为它允许为如 <head>节(section)、导航(navigation)等区域获取内容:

<!DOCTYPE html
    PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <?= $this->headTitle() ?>
    <?= $this->headScript() ?>
    <?= $this->headStyle() ?>
</head>
<body>
    <?= $this->render('header.phtml') ?>

    <div id="nav"><?= $this->placeholder('nav') ?></div>

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

    <?= $this->render('footer.phtml') ?>
</body>
</html>

和Zend Framework MVC一起使用 Zend_Layout

Zend_Controller通过前端控制器插件 和 动作控制器助手 提供了一组丰富的扩展函数。Zend_View 也有助手。当和(Zend Framework)MVC组件一起使用时,Zend_Layout 利用这些多种扩展点。

Zend_Layout::startMvc()创建一个带有任何你提供给它的可选配置的Zend_Layout的实例。接着它注册一个前端控制器插件,一旦派遣循环完成,这个插件就解析带有任何应用程序内容的布局,并且注册一个动作助手允许从动作控制器来访问布局对象。

另外,可以任何时候用布局视图助手从视图脚本抓取布局实例。

首先,来看看如何初始化Zend_Layout来和MVC一起使用:

<?php
// In your bootstrap:
Zend_Layout::startMvc();
?>

startMvc() 可以带一个可选的数组或Zend_Config 对象来定制实例;这些选项详见Zend_Layout 配置选项 。

在动作控制器里,你可以把布局实例作为一个动作助手来访问:

<?php
class FooController extends Zend_Controller_Action
{
    public function barAction()
    {
        // disable layouts for this action:
        $this->_helper->layout->disableLayout();
    }

    public function bazAction()
    {
        // use different layout script with this action:
        $this->_helper->layout->setLayout('foobaz');
    };
}
?>

在视图脚本里,可以通过layout视图助手来访问布局对象。这个视图助手和其它的有细微的区别:不带参数,返回一个对象而不是一个字符串值。这允许在布局对象里立即调用方法:

<?php $this->layout()->setLayout('foo'); // set alternate layout ?>

在任何时候,通过getMvcInstance() 静态方法获取和MVC一起注册的Zend_Layout的实例:

<?php
// Returns null if startMvc() has not first been called
$layout = Zend_Layout::getMvcInstance();
?>

最后,Zend_Layout 的前端控制器插件有一个除解析布局外的重要特征:它从响应对象获取所有被命名的段(segments)并分配它们为布局变量,分配‘default’段给变量‘content’。这允许访问应用程序内容和在视图脚本里解析。

作为例子,让代码首先点击FooController::indexAction() ,它解析一些内容到缺省的响应段,并接着转发给NavController::menuAction() ,它解析内容给'nav'响应段。

最后,转发给CommentController::fetchAction() 并取得一些注释,但是也解析那些给缺省响应段(追加内容给那个段)。视图脚本可以接着分别解析:

<body>
    <!-- renders /nav/menu -->
    <div id="nav"><?= $this->layout()->nav ?></div>

    <!-- renders /foo/index + /comment/fetch -->
    <div id="content"><?= $this->layout()->content ?></div>
</body>

当和动作堆栈 动作助手 和 插件一起协同使用时,这个特性特别有用,通过循环可以设置一个动作堆栈,这样就创建一个部件化的页面。


使用Zend_Layout做为独立的组件

做为独立组件,Zend_Layout不提供和MVC一起使用那样的方便和更多的功能。然而,它仍有两个主要优点:

    布局变量范围

    从其它视图脚本分离视图脚本布局

当用作独立组件,简单地初始化布局对象,使用不同的访问器来设置状态、设置变量为对象属性和解析布局:

<?php
$layout = new Zend_Layout();

// Set a layout script path:
$layout->setLayoutPath('/path/to/layouts');

// set some variables:
$layout->content = $content;
$layout->nav     = $nav;

// choose a different layout script:
$layout->setLayout('foo');

// render final layout
echo $layout->render();
?>

尝试一下布局

有时候百闻不如一见。下面是一个布局脚本例子来展示它是如何工作的。

zend.layout.quickstart.example.png

基于所设置的CSS文件,实际元素的顺序可能不同;例如:如果使用绝对位置,导航稍后显示在文档种,但仍在顶部;对于sidebar或header同样适用,然而实际的显示内容的机制保持相同。


最后实例解释

zend_layout作用第一步:在application.ini中配置layout路径,[production]下加入:

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

resources.layout.layout = "layout"

文件结构如下:

zend文件结构

第二步:建立相关文件

layout.phtml文件:

  1. <!-- -->
  2. <?php echo $this->render('header.phtml');?>
  3. <!--来一个布局变量-->
  4. <?php echo $this->layout()->nav;?>
  5. <!--默认的,$content 变量被应用程序的视图脚本呈现内容填充。-->
  6. <?php echo $this->layout()->content;?>
  7. <?php echo $this->render('footer.phtml');?>

header.phtml文件:

  1. <html>
  2. <head>
  3. <title>这是title</title>
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  5. </head>
  6. <body>

nav.phtml文件:

  1. <div id="nav" style="margin:20px 0;background-color: red;">
  2. 这是导航
  3. </div>

footer.phtml文件:

  1. <div id="footer" style="background-color: #EEEEEE; height: 30px;">
  2. 这是footer
  3. </div>
  4. </body>
  5. </html>

第三步:在动作控制器中:

  1. <?php
  2. //@blog<http://www.phpddt.com>
  3. require_once APPLICATION_PATH.'/models/Article.php';
  4. require_once 'BaseController.php';
  5. require_once 'Zend/Layout.php';
  6. class IndexController extends BaseController
  7. {
  8. public function init()
  9. {
  10. parent::init();
  11. //set layout
  12. $layout = new Zend_Layout();
  13. $layout->nav = $this->view->render('layouts/nav.phtml');
  14. $layout->setLayout('layout');
  15. }
  16. //这里的内容到$this->layout()->content中
  17. public function indexAction()
  18. {
  19. $a = new Article();
  20. $res = $a->fetchAll()->toArray();
  21. $this->view->res = $res;
  22. $this->render('index');
  23. }
  24. }

通过访问,你可以看到,zend已经为你加载了全部内容.



0 0
原创粉丝点击