2010-04-22 2 views
1

Я пытаюсь создать пользовательский элемент формы, который расширяет Zend_Form_Element_Text с помощью валидатора (поэтому мне не нужно продолжать настраивать валидатор, когда я использую определенные элементы). Во всяком случае, мне трудно передать переменную $ maxChars, когда я создаю экземпляр в моей основной форме. Я предоставил мой сокращенный код нижеПередача переменных в пользовательский элемент формы Zend

Это мой пользовательский элемент ниже

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

Когда я пытаюсь передать '100', используя $ customElement-> setProperties (100) в моей форме, он не получает должным образом передается моей StringLength валидатора. Я предполагаю, что это потому, что валидатор вызван в Init? Как я могу это исправить?

ответ

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

Я думаю сначала лучше один.

+0

Спасибо, я не знаю, почему я не думал о первом решении. Второе решение - это что-то новое для меня, но они оба работают хорошо. приветствия =) – user322003

Смежные вопросы