程序员人生 网站导航

Zend Framework教程-Zend_Helpers-视图助手-创建自己的视图助手

栏目:ZendFramework时间:2014-01-10 14:39:38

先来个常用的练练手,高深的自己啄木吧、


1.我们知道zend默认会自动注册/views/helpers下的助手。如果不在这个目录下,那就需要addHelperPath之类的东西来加载指定的路径

2.根据上上一节,说的通常是继承Zend_View_Helper_Abstract,这个是必须的。然后类的前缀要求是Zend_View_Helper_。这个的唯一好处就是是zend默认命名空间,不需要定义。如果你不用Zend_View_Helper_也可以,那就需要注册了。所以没必要大费周折。所以就用Zend_View_Helper_前缀即可。


来,贴点文档说明“

--------------------------------------------------

编写自定义的助手类很容易,只要遵循以下几个原则即可:

  • helper的类名最后部分必须是helper的名称,并使用混合大小写字格式。例如,你在写一个名为“specialPurpose”的类,类名将至少是"SpecialPurpose",另外你还应该给类名加上前缀,建议将“View_Helper”作为前缀的一部份:“My_View_Helper_SpecialPurpose”。(注意大小写)你将需要将前缀(包含或不包含下划线)传递给addHelperPath()setHelperPath()

  • 类中必须有一个public的方法,该方法名与helper类名相同。该方法将在你的模板调用"$this->specialPurpose()"时执行。在我们的“specialPurpose”例子中,相应的方法声明可以是“public function specialPurpose()”。

  • 一般来说,助手类不应该echo或print或有其它形式的输出。它只需要返回值就可以了。返回的数据应当被转义。

  • 类文件的命名应该是助手类的名称,比如在"specialPurpose"例子中,文件要存为“SpecialPurpose.php”。

把助手类的文件放在你的助手路径下, Zend_View就会自动加载,实例化,持久化,并执行。

下面是一个SpecialPurpose 助手代码的例子:

<?phpclass My_View_Helper_SpecialPurpose{    protected $_count = 0;    public function specialPurpose()    {        $this->_count++;        $output = "I have seen 'The Jerk' {$this->_count} time(s).";        return htmlspecialchars($output);    }}        

在视图代码中,可以调用 SpecialPurpose 助手任意次。它将被实例化一次,并且会在Zend_View实例的生命周期内持久存在。

<?php// remember, in a view script, $this refers to the Zend_View instance.echo $this->specialPurpose();echo $this->specialPurpose();echo $this->specialPurpose();        

输出结果如下所示:

I have seen 'The Jerk' 1 time(s).I have seen 'The Jerk' 2 time(s).I have seen 'The Jerk' 3 time(s).        

有时候需要访问调用Zend_View 对象-例如,如果需要使用已指定的编码字符集,或想解析其它视图脚本作为助手的一部分。为了访问视图对象,助手类应该有一个setView($view) 方法,如下:

<?phpclass My_View_Helper_ScriptPath{    public $view;    public function setView(Zend_View_Interface $view)    {        $this->view = $view;    }    public function scriptPath($script)    {        return $this->view->getScriptPath($script);    }}        

如果助手类有一个 setView() 方法,它将在助手类第一次实例

--------------------------------------------

创建助手的应用举例

写一个很挫的部门select控件

1;创建类文件:/views/helpers/DepartmentSelect.php

2.类代码如下:

 

<?php/**  * Helper *   *//**  * DepartmentSelectHelper *   */class Zend_View_Helper_DepartmentSelect extends Zend_View_Helper_Abstract{	private $_departmentModel;   /**    * 获取部门列表    * @param string $id    * @param string $default    * @param array $attr    * @return string    */    public function departmentSelect ($id,$default=null,$html=null)    {    	$this->_departmentModel = new Model_DepartmentModel ();    	$department = $this->_departmentModel->getList();           	$select_str = PHP_EOL.'<select id="'.$id.'" name="info['.$id.']" '.$html.'>'.PHP_EOL;    	$opton_str = '';    	foreach ($department['result'] as $ky=>$val){    		$opton_str .= sprintf('<option value="%s" '. ( $default==$val['dep_id'] ? 'selected' : '' ).'>%s</option>'.PHP_EOL,$val['dep_id'],$val['dep_name']);    	}    	$select_str .= $opton_str.PHP_EOL;;    	$select_str .= '</select>'.PHP_EOL;    	return $select_str;    }}

3.view,phtml中的使用方法是:

无默认值

<?php  echo $this->departmentSelect('user_department',null,' class="select" ');?>

有默认值

<?php  echo $this->departmentSelect('user_department',$this->data['user_department'],' class="select" ');?>


是不是可以写点程序,去练练手了!遵循规则,就不会吃大亏。



------分隔线----------------------------
------分隔线----------------------------

最新技术推荐