2010-12-09 40 views
0

J'ai des formulaires qui, pour certaines raisons, doivent être instanciés dans les différents modules bootstraps. Mais dans ces formes, je veux utiliserLa vue d'accès fonctionne dans Zend_Form

$this->setAction($this->getView()->url(array('controller' => 'foo', 'action' => 'bar'))); 

dans le constructeur. Mais puisque l'URL de viewhelper n'est pas encore accessible depuis que je suis dans le bootstrap, y a-t-il un peu autour de ça? Ce que je reçois maintenant est

Fatal error: Uncaught exception 'Zend_Controller_Router_Exception' with message 'Route default is not defined' 

sur cette ligne. Je n'ai pas de routes personnalisées, donc je n'utilise que le routeur et les routes par défaut.

Répondre

0

J'ai décidé de changer d'approche et de faire en sorte que la classe qui gère tous les formulaires accepte les chaînes de formulaires au lieu des formulaires.

static public function registerForm($formClassName, $formName) { 
    self::$_forms[$formName] = $formClassName; 
} 

Ensuite, je crée la fonction pour obtenir un formulaire ou toutes les formes de la classe comme si pour chaque formulaire disponible

public function getForm($name) { 
    if(empty(self::$_forms[$name])) { 
     throw new Core_Form_Store_Exception; 
    } 
    // If the for is instanciated we return it 
    else if(self::$_forms[$name] instanceof Zend_Form) { 
     return self::$_forms[$name]; 
    } 
    else { 
     // Instanciate the class and return it 
     $form = new self::$_forms[$name]; 
     self::$_forms[$name] = $form; 
     return $form; 
    } 
    } 

getForms() appelle seulement getForm(). Je me suis fatigué d'imiter un peu l'interface du Zend_Form normal quand il s'agit des noms de fonctions et les arguments d'ordre sont passés. Maintenant je l'ai fonctionné et en prime je n'instancie aucune forme jusqu'à ce que j'en ai besoin. Et si je demande seulement un formulaire spécifique de la classe de magasin seulement ce formulaire est instancié et enregistré pour l'accès futur.

+0

Essentiellement un registre de formulaires, hein? Cool. Au moins, cela signifie que vous n'avez pas besoin d'instancier les formulaires aussi tôt que vous l'avez suggéré dans la question initiale. Félicitations! –

+0

Accepte ma propre réponse puisque je pense que c'est en fait la meilleure façon de gérer ma situation. Si vous voulez vraiment passer en revue mon idée initiale, vous devriez essayer l'idée de David, je n'ai pas eu le temps de le tester puisque j'avais déjà construit ma solution. – inquam

2

Si vous avez vraiment besoin d'instancier les formulaires si tôt, alors peut-être une possibilité est l'ordre des initialisations dans votre Bootstrap.

Dans la méthode Bootstrap où vous instanciez vos formulaires, assurez-vous simplement d'amorcer la vue en premier. Ensuite, récupérez l'objet de vue et transmettez-le au formulaire lors de l'instanciation.

Quelque chose comme:

protected function _initForms() 
{ 
    $this->bootstrap('view'); 
    $view = $this->getResource('view'); 
    $form = new My_Form($view); 
    // ...   
} 

Ensuite, dans votre formulaire, vous pouvez faire quelque chose comme:

public function __construct($view) 
{ 
    $this->setView($view); 
} 

public function init() 
{ 
    // set the action 
    $this->setAction($this->getView()->url(array(
     'controller' => 'foo', 
     'action'  => 'bar', 
    ))); 

    // create your form elements 
    // ... 

} 

Whaddya pense?

+0

Je ne voulais pas faire appliquer les modules à venir d'avoir à inclure quoi que ce soit à son constructeur de ces formes. Mais cela aurait pu fonctionner. J'ai essayé de faire en sorte que la vue soit amorcée en premier et que l'on obtienne la vue via le singleton. Et la vue semble fonctionner correctement, le problème est que les routes ne sont pas instanciées et que l'aide d'url ne fonctionnera pas. J'ai retravaillé mon idée initiale et posté ma solution actuelle ici. – inquam

0

Que diriez-vous de définir l'action de la vue lors du rendu sous la forme, par exemple

<?php echo $this->form->setAction($this->url(array(
      'controller' => 'foo', 
      'action'  => 'bar' 
    ))) ?> 
+0

Les formes des autres modules seraient "inconnues" à la classe de gestion, de sorte que la définition de l'action au moment de l'appel ne serait pas possible. – inquam