将变量传递给自定义Zend表单元素

时间:2010-04-22 09:17:22

标签: zend-framework zend-form zend-form-element

我正在尝试创建一个自定义表单元素,该元素使用验证器扩展Zend_Form_Element_Text(因此,当我使用某些元素时,我不必继续设置验证器)。无论如何,当我在我的Main表单中实例化它时,我无法将$ maxChars变量传递给它。我在

下面提供了缩短的代码

这是我的自定义元素

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));
}
}

当我尝试在我的表单中使用$ customElement-&gt; setProperties(100)传递'100'时,它不会正确传递给我的StringLength验证器。我认为是因为验证器在Init中被调用了?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

创建元素时会调用

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 - 你在init() render()中所做的事情 - 在最后呈现了元素。

public function render()
{
    $this->addValidator('StringLength', true, array(0, $this->maxChars))
    return parent::render();
}

我认为首先是更好的。