先来个常用的练练手,高深的自己啄木吧、
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
助手代码的例子:
<?php class 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)
方法,如下:
<?php class 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" ');?>
是不是可以写点程序,去练练手了!遵循规则,就不会吃大亏。