Zend Framework教程-Zend_Helpers-视图助手-常见的视图助手-其它

视图助手提供了较多的助手,如果想了解这些助手类的使用方法,可以通过找到相应的类,看源代码,来学习使用方法。通过助手的参数名称就可以了解到助手需要传入的值,这里就不再细说了,下面大体按照助手分类来罗列一下常见的视图助手。


一、HTML相关

主要是用来操作,生成form元素的,通常我们使用原生的form元素就可以了,没有必要使用zend提供的方法来生成这些元素。

zend提供的常见生成form元素的方法以及使用举例:

  • fieldset($name, $content, $attribs): 生成一个 XHTML fieldset. 如果 $attribs 包含一个 'legend' 键,它的值将用于 fieldset legend。 Fieldset 将环绕在 $content 周围提供给助手。

  • form($name, $attribs, $content): 生成一个 XHTML 表单。所有 $attribs 转义和解析成表单标签的 XHTML 属性。如果 $content 不以布尔 false 出现,那么内容就是在表单标签内被解析,如果 $content 是布尔 false (缺省),只有开头的表单标签被生成。

  • formButton($name, $value, $attribs): 生成 <button /> 元素;

  • formCheckbox($name, $value, $attribs,$options): 生成 <input type="checkbox" /> 元素。

    缺省地,当没有提供 $value 并且没有 $options,'0' 被假定为未选的值,'1'为选中的值。 如果传递 $value,但没有 $options,选中的值就被假定为传递的值。

    $options 应当是数组。如果数组被索引,第一个值就是选中的值,第二个是未选的值, 所有其它值被忽略。 你也可传递一个带有键为 'checked' 和 'unChecked' 的联合数组。

    如果传递了 $options,如果 $value 匹配选中的值,元素将标记为选中。你也通过传递 一个布尔值给属性 'checked' 来标记元素为选中或未选。

    上述内容可能最好汇总成一些例子: 

    <?php
    // '1' and '0' as checked/unchecked options; not checked
    echo $this->formCheckbox('foo');
    
    // '1' and '0' as checked/unchecked options; checked
    echo $this->formCheckbox('foo', null, array('checked' => true));
    
    // 'bar' and '0' as checked/unchecked options; not checked
    echo $this->formCheckbox('foo', 'bar');
    
    // 'bar' and '0' as checked/unchecked options; checked
    echo $this->formCheckbox('foo', 'bar', array('checked' => true));
    
    // 'bar' and 'baz' as checked/unchecked options; unchecked
    echo $this->formCheckbox('foo', null, null, array('bar', 'baz');
    
    // 'bar' and 'baz' as checked/unchecked options; unchecked
    echo $this->formCheckbox('foo', null, null, array(
        'checked' => 'bar',
        'unChecked' => 'baz'
    ));
    
    // 'bar' and 'baz' as checked/unchecked options; checked
    echo $this->formCheckbox('foo', 'bar', null, array('bar', 'baz');
    echo $this->formCheckbox('foo', null, array('checked' => true), array('bar', 'baz');
    
    // 'bar' and 'baz' as checked/unchecked options; unchecked
    echo $this->formCheckbox('foo', 'baz', null, array('bar', 'baz');
    echo $this->formCheckbox('foo', null, array('checked' => false), array('bar', 'baz');


    对所有情况,标记预先准备一个带有未选的值的隐藏元素。 这样,如果值是未选的,你将仍获得有效的返回到表单的值。

  • formErrors($errors, $options): 生成一个无顺序的 XHTML 列表来显示错误。 $errors 是个字符串或字符串数组;$options 是你想放入开头列表标签的任何属性。

    当通过调用助手中的方法时,你可以指定替代的开头,结尾和分隔符:

    • setElementStart($string); 缺省为 '<ul class="errors"%s"><li>', 其中 %s 是在 $options 中被替换的属性。

    • setElementSeparator($string); 缺省为 '</li><li>'。

    • setElementEnd($string); 缺省为 '</li></ul>'。

  • formFile($name, $value, $attribs): 生成<input type="file" />

  • formHidden($name, $value, $attribs): 生成<input type="hidden" />

  • formLabel($name, $value, $attribs): 生成 <label>设置 for 属性给 $name,实际的标签字符给 $value。 如果 disable 传递给 attribs,什么都不返回。

  • formMultiCheckbox($name, $value, $attribs, $options, $listsep): 生成一个 checkboxes 列表。$options 是个联合数组,可以有任意的深度。$value 可以是单个的值或者是可选的匹配在 $options 数组中的键的一个数组。$listsep 缺省为一个 HTML break ("<br />")。缺省地,这个元素被当作数组,所有 checkboxes 共享同一个名称,并以数组的形式提交。

  • formPassword($name, $value, $attribs): Creates an <input type="password" /> element.

  • formRadio($name, $value, $attribs, $options): 生成一系列<input type="button" />,每个$options数组元素一个,key为radio的值,并且元素的值是radio的标签。

  • formReset($name, $value, $attribs): 生成<input type="reset" />

  • formSelect($name, $value, $attribs, $options): 生成<select>...</select>其中的每个<option>对应于一个$option数组元素。元素的key是option的值,元素的值是option的标签。$value这个值的option默认为选中。

  • formSubmit($name, $value, $attribs): 生成<input type="submit" />

  • formText($name, $value, $attribs): 生成<input type="text" />

  • formTextarea($name, $value, $attribs): 生成<textarea>...</textarea>

  • url($urlOptions, $name, $reset): 基于已命名的路由生成URL字符串。$urlOptions 必须是一个键/值对应的关联数组,用于特定的路由。

  • htmlList($items, $ordered, $attribs): 基于传递给它的 $items 生成无序的和有序的列表。如果 $items 是多维数组,将创建嵌套的列表。

以上helper的使用非常简单,下面是个例子。注意你只需要调用即可,它们会根据需要自己加载并实例化。 

<?php
// 在你的view脚本内部, $this 指向 Zend_View 实例.
//
// 假设你已经为select对应的变量$countries指定一系列option值,
// array('us' => 'United States', 'il' =>
// 'Israel', 'de' => 'Germany').
?>
<form action="action.php" method="post">
    <p><label>Your Email:
        <?php echo $this->formText('email', 'you@example.com', array('size' => 32)) ?>
    </label></p>
    <p><label>Your Country:
        <?php echo $this->formSelect('country', 'us', null, $this->countries) ?>
    </label></p>
    <p><label>Would you like to opt in?
        <?php echo $this->formCheckbox('opt_in', 'yes', null, array('yes', 'no')) ?>
    </label></p>
</form>


以上视图脚本会输出这样的结果: 

<form action="action.php" method="post">
    <p><label>Your Email:
        <input type="text" name="email" value="you@example.com" size="32" />
    </label></p>
    <p><label>Your Country:
        <select name="country">
            <option value="us" selected="selected">United States</option>
            <option value="il">Israel</option>
            <option value="de">Germany</option>
        </select>
    </label></p>
    <p><label>Would you like to opt in?
        <input type="hidden" name="opt_in" value="no" />
        <input type="checkbox" name="opt_in" value="yes" checked="checked" />
    </label></p>
</form>
        


HTML <object> 元素在网页里用于嵌入媒体如 Flash 或 QuickTime。 对象视图助手用最小的代价来帮助嵌入媒体。

有四个初始的对象助手:

  • formFlash 为嵌入 Flash 文件生成 markup。

  • formObject 为嵌入定制对象生成 markup。

  • formPage 为嵌入其它 (X)HTML 页面生成 markup。

  • formQuicktime 为嵌入 QuickTime 文件生成 markup。

所有这些助手使用相似的接口。这样,本文档只包含两个助手的例子。

Example #17 Flash 助手

使用助手嵌入 Flash 到你的页面相当简单。唯一需要的参数是资源 URI。 

<?php echo $this->htmlFlash('/path/to/flash.swf'); ?>


它输出下列 HTML: 

<object data="/path/to/flash.swf" type="application/x-shockwave-flash"
    classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
    codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab">
</object>


另外你可以指定可以和 <object> 一起解析的属性、参数和内容。 这个用 htmlObject 助手来示范。

Example #18 通过传递另外的参数来定制对象

对象助手里的第一个参数总是必需的,它是你想嵌入的资源的 URI。 第二个参数只对 htmlObject 助手是必需的,其它助手对这个参数已经有了正确的值。 第三个参数用来传递属性到对象元素,它只接受带有key-value对的数组,classidcodebase 是这个属性的例子。 第四个参数也用带有key-value对的数组并用它们生成 <param> 元素,你将很快看到一个这样的例子。 最后一个是提供另外的内容给对象的选项。来看一下使用所有参数的例子。 

echo $this->htmlObject(
    '/path/to/file.ext',
    'mime/type',
    array(
        'attr1' => 'aval1',
        'attr2' => 'aval2'
    ),
    array(
        'param1' => 'pval1',
        'param2' => 'pval2'
    ),
    'some content'
);

/*
这将输出:

<object data="/path/to/file.ext" type="mime/type"
    attr1="aval1" attr2="aval2">
    <param name="param1" value="pval1" />
    <param name="param2" value="pval2" />
    some content
</object>
*/


二、URL相关

主要用来获取和生成url 

Zend_View_Helper_BaseUrl:获取根路径

使用方法:

<?php echo $this->baseUrl();?>


例如访问

http://www.localzend.com/helper_demo1/public/index/index


对应的是

/helper_demo1/public

常见用法是在base标签,或者引用外部资源是使用,

<?php echo $this->headScript()
	->appendFile($this->baseUrl().'/ui_1/js/jquery-1.7.1.min.js') 
	->appendFile($this->baseUrl().'/ui_1/js/common.js')	
;?>


Zend_View_Helper_Url:用来生成一个url

class Zend_View_Helper_Url extends Zend_View_Helper_Abstract
{
    /**
     * Generates an url given the name of a route.
     *
     * @access public
     *
     * @param  array $urlOptions Options passed to the assemble method of the Route object.
     * @param  mixed $name The name of a Route to use. If null it will use the current Route
     * @param  bool $reset Whether or not to reset the route defaults with those provided
     * @return string Url for the link href attribute.
     */
    public function url(array $urlOptions = array(), $name = null, $reset = false, $encode = true)
    {
        $router = Zend_Controller_Front::getInstance()->getRouter();
        return $router->assemble($urlOptions, $name, $reset, $encode);
    }
}


参数$urlOptions是个数组:

参数$name默认为空,路由名称

参数$encode是否对内容进行编码


使用方法如下:

<?php echo $this->baseUrl();?>
	<?php echo $this->url(array('action'=>'add','controller'=>'user','module'=>'default'),null,true);?>
	<?php echo $this->url(array('action'=>'add','controller'=>'user'),null,true);?>	
	<?php echo $this->url(array('action'=>'add','controller'=>'user','module'=>'manage'),null,false);?>
	<?php echo $this->url(array('action'=>'add','controller'=>'user','module'=>'manage'),null,true);?>
	<?php echo $this->url(array('action'=>'add','controller'=>'user','username'=>'张三','useremail'=>'a@aa.com'),null,true);?>
输出如下:

/helper_demo1/public/user/add
/helper_demo1/public/user/add
/helper_demo1/public/manage/user/add
/helper_demo1/public/manage/user/add
/helper_demo1/public/user/add/username/%E5%BC%A0%E4%B8%89/useremail/a%40aa.com



三、动作视图助手

    /**
     * Retrieve rendered contents of a controller action
     *
     * If the action results in a forward or redirect, returns empty string.
     *
     * @param  string $action
     * @param  string $controller
     * @param  string $module Defaults to default module
     * @param  array $params
     * @return string
     */
    public function action($action, $controller, $module = null, array $params = array())
    {
        $this->resetObjects();
        if (null === $module) {
            $module = $this->defaultModule;
        }

        // clone the view object to prevent over-writing of view variables
        $viewRendererObj = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
        Zend_Controller_Action_HelperBroker::addHelper(clone $viewRendererObj);

        $this->request->setParams($params)
                      ->setModuleName($module)
                      ->setControllerName($controller)
                      ->setActionName($action)
                      ->setDispatched(true);

        $this->dispatcher->dispatch($this->request, $this->response);

        // reset the viewRenderer object to it's original state
        Zend_Controller_Action_HelperBroker::addHelper($viewRendererObj);


        if (!$this->request->isDispatched()
            || $this->response->isRedirect())
        {
            // forwards and redirects render nothing
            return '';
        }

        $return = $this->response->getBody();
        $this->resetObjects();
        return $return;
    }


Action 视图助手允许视图脚本执行一个特定的控制器Action;在执行之后的响应对象的结果将被返回。有时候特定的Action生成可重用内容或“widget-ized”内容(在页面内生成一个带有特定功能的小面板,类似于Windows Vista的widget,Haohappy注),这时我们就可以使用本功能。

内部调用_forward() 或者转向的Action在此将无效,将返回空字符串。

Action视图助手的API和大部分MVC组件调用控制器动作的方式一样:action($action,$controller, $module = null, array $params = array())$action$controller 是必须的;如果没有指定模块,缺省模块将被使用。

Example #1 动作视图助手的基本用法

例如,假设你有一个CommentController ,为了给当前请求输出评论列表,带一个可被调用的 listAction() 方法: 

<div id="sidebar right">
    <div class="item">
        <?= $this->action('list', 'comment', null, array('count' => 10)); ?>
    </div>
</div>


四、区域助手(Partial Helper)

作用可以认为和smarty中的include类似。

Partial 视图助手被用来在它自己的变量范围内解析特定的模板。主要用法是(解析)可重用的模板片段,你不需要操心变量名的冲突。另外,它们让你从特定的模块指定 partial 视图脚本。

Partial 的兄弟 PartialLoop 视图助手允许传递可迭代数据并为每个条目解析一部分。

Example #2 Partials 的基本用法

partials 的基本用法是在它自己的视图范围内解析一个模板的片段。 

<?php // partial.phtml ?>
<ul>
    <li>From: <?= $this->escape($this->from) ?></li>
    <li>Subject: <?= $this->escape($this->subject) ?></li>
</ul>


你可以这样从视图脚本里调用它: 

<?= $this->partial('partial.phtml', array(
    'from' => 'Team Framework',
    'subject' => 'view partials')); ?>


解析结果如下: 

<ul>
    <li>From: Team Framework</li>
    <li>Subject: view partials</li>
</ul>


Note: 什么是模型(model)?
Partial 视图助手一起使用的模型(即partial()的第二个参数,Haohappy注)可以是下列其中之一:

  • 数组 。如果传递了数组,它应当是联合数组,因为它的 ‘键/值’ 对用作为视图变量的键赋值给视图。

  • 实现了toArray() 方法的对象 。如果被传递的对象有 toArray() 方法,toArray()的结果将被当作视图变量赋值给视图对象。

  • 标准对象 。 任何其它对象将把object_get_vars()的结果(对象的所有公共属性)赋值给视图对象。

如果你的模型是一个对象,你可能想让它 作为对象传递给 partial 脚本,而不是把它系列化成一个数组变量。 你可以通过设置适当的助手的 'objectKey' 属性来完成这个:  
// Tell partial to pass objects as 'model' variable
$view->partial()->setObjectKey('model');

// Tell partial to pass objects from partialLoop as 'model' variable in final
// partial view script:
$view->partialLoop()->setObjectKey('model');


当传递 Zend_Db_Table_Rowsets 给 partialLoop()时这个技术相当有用, 因为你在视图脚本里有全部访问 row 对象的权限,允许你调用它们的方法(如从父或依赖的 rows 获取数据)。

Example #3 使用 PartialLoop 来解析可迭代的(Iterable)的模型

可能你常常会需要在一个循环里使用 partials 来输出相同的内容片段多次,这时你就可以把大块的重复的内容或复杂的显示逻辑放到一个地方。然而这对性能有影响,因为partial助手需要在每个迭代里调用一次。

PartialLoop 视图助手解决了这个问题。 它允许你把迭代条目(实现Iterator的数组或对象)当做模型来传递。它这些把这些条目当作模型迭代、传递给 partial 脚本。在迭代器里的条目可以是 Partial 视图助手允许的任何模型。

让我们看一下下面的 partial 视图脚本: 

<? // partialLoop.phtml ?>
    <dt><?= $this->key ?></dt>
    <dd><?= $this->value ?></dd>


添加下列 "model": 

<?php
$model = array(
    array('key' => 'Mammal', 'value' => 'Camel'),
    array('key' => 'Bird', 'value' => 'Penguin'),
    array('key' => 'Reptile', 'value' => 'Asp'),
    array('key' => 'Fish', 'value' => 'Flounder'),
);
?>


在视图脚本中,你可以这样调用 PartialLoop 助手: 

<dl>
<?= $this->partialLoop('partialLoop.phtml', $model) ?>
</dl>
<dl></dl>
    <dt>Mammal</dt>
    <dd>Camel</dd>

    <dt>Bird</dt>
    <dd>Penguin</dd>

    <dt>Reptile</dt>
    <dd>Asp</dd>

    <dt>Fish</dt>
    <dd>Flounder</dd>

</dl>

Example #4 在其它模块中解析 Partials

有时候 partial 存在于不同的模块(Module)。如果你知道模块的名称,你可以把它当作第二个参数传递给 partial() 或者 partialLoop(),把 $model 作为第三个参数。

例如,如果一个你想用一个在 'list' 模块的 pager partial,就象下面这样来运用: 

<?= $this->partial('pager.phtml', 'list', $pagerData) ?>


这样,你可以重用原来是特别供给其它模块使用的 partials 。所以,在共享的视图脚本路径里放置可重用的 partials 很可能是个好习惯。  


 

五、JSON 助手 

    /**
     * Encode data as JSON, disable layouts, and set response header
     *
     * If $keepLayouts is true, does not disable layouts.
     *
     * @param  mixed $data
     * @param  bool $keepLayouts
     * NOTE:   if boolean, establish $keepLayouts to true|false
     *         if array, admit params for Zend_Json::encode as enableJsonExprFinder=>true|false
     *         this array can contains a 'keepLayout'=>true|false
     *         that will not be passed to Zend_Json::encode method but will be used here
     * @return string|void
     */
    public function json($data, $keepLayouts = false)
    {
        $options = array();
        if (is_array($keepLayouts))
        {
            $options     = $keepLayouts;
            $keepLayouts = (array_key_exists('keepLayouts', $keepLayouts))
                            ? $keepLayouts['keepLayouts']
                            : false;
            unset($options['keepLayouts']);
        }

        $data = Zend_Json::encode($data, null, $options);
        if (!$keepLayouts) {
            require_once 'Zend/Layout.php';
            $layout = Zend_Layout::getMvcInstance();
            if ($layout instanceof Zend_Layout) {
                $layout->disableLayout();
            }
        }

        $response = Zend_Controller_Front::getInstance()->getResponse();
        $response->setHeader('Content-Type', 'application/json', true);
        return $data;
    }


当创建返回 JSON 的视图,设置适当的响应头也非常重要,JSON 视图助手就是来做这个的。另外,缺省地,它关闭(disable)了布局(如果布局是打开(enable)的),因为布局一般不和 JSON 响应一起使用。

JSON 助手设置下列的头: 

Content-Type: application/json


当解析响应来决定如何处理内容,大部分 AJAX 库寻找这个头。

JSON 助手的用法相当简单: 

<?php
<?= $this->json($this->data) ?>
?>


六、翻译助手


在国际化章节简写说明

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页