Zend_Form中的元数据和属性
By 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
来工作)setConfig
setOptions
setPluginLoader
setTranslator
setView
这里是一个例子,为每个配置数据类型传递配置的配置文件:
[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 文档来获知所有的可用方法。