2010-04-22 5 views
1

J'essaie de créer un élément de formulaire personnalisé qui étend Zend_Form_Element_Text avec un validateur (donc je ne dois pas continuer à configurer le validateur lorsque j'utilise certains éléments). De toute façon, j'ai du mal à lui passer la variable $ maxChars lorsque je l'instancie dans mon formulaire principal. J'ai fourni mon code raccourci ci-dessousPassage de variables à un élément de formulaire Zend personnalisé

Ceci est mon élément personnalisé ci-dessous

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

C'est là que j'instancier mon élément de formulaire personnalisé.

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

Lorsque je tente de passer '100' en utilisant customElement- $> setProperties (100) dans ma forme, il ne marche pas se passer correctement à mon StringLength validateur. Je suppose que c'est parce que le validateur est appelé dans Init? Comment puis-je réparer cela?

Répondre

0

init() est appelée lorsque vous créez un élément, donc avant d'appeler setProperties() et votre $maxChars n'est pas défini alors.

Je vois deux solutions:

1 - Supprimer init() et déplacer addValidator()-setProperties() méthode:

public function setProperties($name, $value) 
{ 
    switch($name) { 
     case 'maxChars': 
      $this->addValidator('StringLength', true, array(0, $value)); 
      break; 
    } 
    return $this; 
} 

2 - Faites ce que vous avez fait à init() dans render() - élément est rendu à la fin.

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

Je pense d'abord que c'est mieux.

+0

Merci mon pote, je ne sais pas pourquoi je n'ai pas pensé à la première solution. La deuxième solution est quelque chose de nouveau pour moi, ils fonctionnent tous les deux bien. acclamations =) – user322003

Questions connexes