Zend framework 将变量传递给自定义Zend表单元素
我正在尝试创建一个自定义表单元素,该元素使用验证器扩展Zend_form_element_文本(因此,在使用某些元素时,我不必一直设置验证器)。无论如何,当我在主窗体中实例化$maxChars变量时,我很难将它传递给它。我在下面提供了我的缩短代码 这是我下面的自定义元素Zend framework 将变量传递给自定义Zend表单元素,zend-framework,zend-form,zend-form-element,Zend Framework,Zend Form,Zend Form Element,我正在尝试创建一个自定义表单元素,该元素使用验证器扩展Zend_form_element_文本(因此,在使用某些元素时,我不必一直设置验证器)。无论如何,当我在主窗体中实例化$maxChars变量时,我很难将它传递给它。我在下面提供了我的缩短代码 这是我下面的自定义元素 class My_Form_Custom_Element extends Zend_Form_Element_Text { public $maxChars public function init() { $thi
class My_Form_Custom_Element extends Zend_Form_Element_Text
{
public $maxChars
public function init()
{
$this->addValidator('StringLength', true, array(0, $this->maxChars))
}
public function setProperties($maxChars)
{
$this->maxChars= $maxChars;
}
}
这是我实例化自定义表单元素的地方。
class My_Form_Abc extends Zend_Form
{
public function __construct($options = null)
{
parent::__construct($options);
$this->setName('abc');
$customElement = new My_Form_Custom_Element('myCustomElement');
$customElement->setProperties(100); //**<----This is where i set the $maxChars**
$submit = new Zend_Form_Element_Submit('submit');
$submit -> setAttrib('id', 'submitbutton');
$this->addElements(array($customElement ,$submit));
}
}
class My\u Form\u Abc扩展了Zend\u Form
{
公共函数构造($options=null)
{
父项::_构造($options);
$this->setName('abc');
$customElement=新的我的表单自定义元素('myCustomElement');
$customElement->setProperties(100);//**setAttrib('id','submitbutton');
$this->addElements(数组($customElement,$submit));
}
}
当我试图在表单中使用$customElement->setProperties(100)传递'100'时,它无法正确地传递给我的StringLength验证器。我想这是因为验证器在Init中被调用了?如何修复此问题?init()
是在创建元素时调用的,因此在调用setProperties()
之前,$maxChars
不会被设置
我看到两种解决办法:
1-删除init()
并将addValidator()
移动到setProperties()
方法:
public function setProperties($name, $value)
{
switch( $name ) {
case 'maxChars':
$this->addValidator('StringLength', true, array(0, $value));
break;
}
return $this;
}
2-执行在render()
中的init()
中所做的操作-元素在最后呈现
public function render()
{
$this->addValidator('StringLength', true, array(0, $this->maxChars))
return parent::render();
}
我认为第一个更好。谢谢,伙计,我不知道为什么我没有想到第一个解决方案。第二种解决方案对我来说是新的,它们都很有效。干杯=)