Zend_Form中的元数据和属性
admin
- 2 minutes read - 417 wordsZend_Form_Element 处理广泛的属性和元素元数据,基本属性包括:
name: 元素名,使用
setName()和getName()访问器。label: 元素标签,使用
setLabel()和getLabel()访问器。order: 在表单中出现的元素的索引,使用
setOrder()和getOrder()访问器。value: 当前元素的值,使用
setValue()和getValue()访问器。description: 元素的描述,常用于提供工具提示或 javascript 上下文提示,描述元素的意图,使用
setDescription()和getDescription()访问器。required: 当执行表单校验时,指示元素是否必需的标志,使用
setRequired()和getRequired()访问器,缺省为 false。allowEmpty: 指示可选的元素是否应该校验空值的标志,当为 true,并且要求的标志为 false,空值就不传递给校验器链,并假定为 true。使用
setAllowEmpty()和getAllowEmpty()访问器,缺省为 true。autoInsertNotEmptyValidator: 当元素是必需时,指示是否插入一个 ‘NotEmpty’ 校验器。缺省地,这个标志为 true,用
setAutoInsertNotEmptyValidator($flag)来设置该标志并用autoInsertNotEmptyValidator()来确定它的值。
表单元素可能要求另外的元数据。例如,对于 XHTML 表单元素,你可能想指定属性如类或 id,有一组访问器来完成它:
setAttrib($name, $value): 添加属性
setAttribs(array $attribs): 像 addAttribs() 一样,但重写
getAttrib($name): 读取一个单个的属性值
getAttribs(): 以键/值对读取所有属性
然而大多数时候,你可以把它们当作对象属性来访问,因为 Zend_Form_Element 利用重载来简便访问它们:
<?php
// Equivalent to $element->setAttrib('class', 'text'):
$element->class = 'text;
?>
缺省地,在解析过程中所有属性传递给由元素使用的视图助手,并当作该元素标签的 HTML 属性来解析。
23.3.6. 标准元素
Zend_Form 带有许多标准元素,请阅读 标准元素 一章有全部细节。
23.3.7. Zend_Form_Element 方法
Zend_Form_Element 有许多许多方法。下面是一个快速概要,按类分组:
配置:
setOptions(array $options)setConfig(Zend_Config $config)I18n:
setTranslator(Zend_Translate_Adapter $translator = null)getTranslator()setDisableTranslator($flag)translatorIsDisabled()属性:
setName($name)getName()setValue($value)getValue()getUnfilteredValue()setLabel($label)getLabel()setDescription($description)getDescription()setOrder($order)getOrder()setRequired($flag)getRequired()setAllowEmpty($flag)getAllowEmpty()setAutoInsertNotEmptyValidator($flag)autoInsertNotEmptyValidator()setIgnore($flag)getIgnore()getType()setAttrib($name, $value)setAttribs(array $attribs)getAttrib($name)getAttribs()插件加载器和路径:
setPluginLoader(Zend_Loader_PluginLoader_Interface $loader, $type)getPluginLoader($type)addPrefixPath($prefix, $path, $type = null)addPrefixPaths(array $spec)校验:
addValidator($validator, $breakChainOnFailure = false, $options = array())addValidators(array $validators)setValidators(array $validators)getValidator($name)getValidators()removeValidator($name)clearValidators()isValid($value, $context = null)getErrors()getMessages()过滤器:
addFilter($filter, $options = array())addFilters(array $filters)setFilters(array $filters)getFilter($name)getFilters()removeFilter($name)clearFilters()解析:
setView(Zend_View_Interface $view = null)getView()addDecorator($decorator, $options = null)addDecorators(array $decorators)setDecorators(array $decorators)getDecorator($name)getDecorators()removeDecorator($name)clearDecorators()render(Zend_View_Interface $view = null)
23.3.8. 配置
Zend_Form_Element 的构造器接受选项数组或包含选项的 Zend_Config 的对象,它也可以用 setOptions() 或 setConfig() 来配置。一般来说,命名键如下:
如果 ‘set’ + 键指向
Zend_Form_Element方法,那么提供的值就传递给这个方法。否则,这个值就用来设置属性。
该规则的例外包括如下:
prefixPath将传递给addPrefixPaths()下面的设置器不能用这个办法:
setAttrib(通过setAttribs来工作)setConfigsetOptionssetPluginLoadersetTranslatorsetView
这里是一个例子,为每个配置数据类型传递配置的配置文件:
[element]
name = "foo"
value = "foobar"
label = "Foo:"
order = 10
required = true
allowEmpty = false
autoInsertNotEmptyValidator = true
description = "Foo elements are for examples"
ignore = false
attribs.id = "foo"
attribs.class = "element"
onclick = "autoComplete(this, '/form/autocomplete/element')" ; sets 'onclick' attribute
prefixPaths.decorator.prefix = "My_Decorator"
prefixPaths.decorator.path = "My/Decorator/"
disableTranslator = 0
validators.required.validator = "NotEmpty"
validators.required.breakChainOnFailure = true
validators.alpha.validator = "alpha"
validators.regex.validator = "regex"
validators.regex.options.pattern = "/^[A-F].*/$"
filters.ucase.filter = "StringToUpper"
decorators.element.decorator = "ViewHelper"
decorators.element.options.helper = "FormText"
decorators.label.decorator = "Label"
23.3.9. 定制元素
通过继承 Zend_Form_Element 类,你可以生成自己的定制元素,这样做的原因是:
共享通用的校验器和/或过滤器的元素
有定制装饰器功能的元素
有两个方法一般用来扩展元素: init() 可为元素添加定制的初始化逻辑; loadDefaultDecorators() 可用于设置一个用于元素的缺省装饰器的列表。
用例子来说明,你在一个表单里生成的所有文本元素需要用 StringTrim 来过滤、用通用的规则表达式来校验,并且你想用你生成的定制的装饰器来显示它们,’My_Decorator_TextItem’。另外,你有许多想指定的标准属性,包括 ‘size’、 ‘maxLength’ 和 ‘class’。你可以定义这样的元素如下:
<?php
class My_Element_Text extends Zend_Form_Element
{
public function init()
{
$this->addPrefixPath('My_Decorator', 'My/Decorator/', 'decorator')
->addFilters('StringTrim')
->addValidator('Regex', false, array('/^[a-z0-9]{6,}$/i'))
->addDecorator('TextItem')
->setAttrib('size', 30)
->setAttrib('maxLength', 45)
->setAttrib('class', 'text');
}
}
?>
你接着可以通知表单对象关于元素的前缀路径并开始生成元素:
<?php
$form->addPrefixPath('My_Element', 'My/Element/', 'element')
->addElement('foo', 'text');
?>
‘foo’ 元素现在是 My_Element_Text 类型并展示你描画的行为。
当继承 Zend_Form_Element 时你想 override 的另一个特殊方法是 loadDefaultDecorators()。这个方法有条件地为你的元素加载一组缺省装饰器,你可能想在你的继承类里替换你自己的装饰器。
<?php
class My_Element_Text extends Zend_Form_Element
{
public function loadDefaultDecorators()
{
$this->addDecorator('ViewHelper')
->addDecorator('DisplayError')
->addDecorator('Label')
->addDecorator('HtmlTag', array('tag' => 'div', 'class' => 'element'));
}
}
?>
有许多办法定制元素。别忘了阅读 Zend_Form_Element API 文档来获知所有的可用方法。