Question

J'essaie de créer une fiche à l'aide du composant Zend_Form, mais le nombre d'éléments varie. Les informations pour chaque élément Zend_Form sont stockées dans une base de données (nom, options, validateurs, filtres, etc.).

L’application sur laquelle je travaille consiste à créer des enquêtes contenant un nombre variable de questions. Chaque question est associée à différents tableaux de réponses. En fin de compte, mon objectif est de construire des tableaux de boutons radio / cases à cocher, de manière dynamique, côté serveur.

Je cherche un joli moyen de générer mon formulaire, mais je ne suis pas sûr du meilleur moyen de charger le modèle dans le formulaire. Le modèle doit-il être chargé dans le contrôleur puis passé (d'une manière ou d'une autre, via un paramètre?) Directement au formulaire, ou vaut-il mieux charger le modèle dans la méthode Form init ()? Où est le meilleur endroit pour mettre la logique, devrait-elle être dans la classe de formulaire, dans le contrôleur ou dans le modèle?

Mon idée est de récupérer les propriétés des éléments de formulaire (nom, règles, filtres, etc.) dans la base de données, puis de les itérer et enfin de rendre le formulaire. Que pensez-vous de cette approche? Finalement, les éléments seront ajoutés dynamiquement (côté client), cette fois, en utilisant AJAX et une bibliothèque JavaScript (telle que jQuery).

Voici quelques liens utiles que j'ai trouvés via Google, mais je pense qu'ils répondent tous à une question légèrement différente de la mienne:

Lors de la création de formulaires dynamiques, côté serveur:

Lors de la création de formulaires dynamiques, côté client, avec traitement AJAX:

Était-ce utile?

La solution

Vous pouvez étendre Zend_Form.

La forme en Zend n’est pas un bon endroit pour la logique, mais seulement pour la représentation sous forme.

Donc, chargez tous les éléments nécessaires en utilisant model dans controller et transmettez-les à la fiche dans le constructeur en tant que paramètres.

Autres conseils

Je pense avoir trouvé une solution possible. Elle consiste à transmettre un tableau d'éléments Zend Form à la méthode Zend Form :: __ construct () . Le constructeur prend un tableau d’options, l’une d’elles s'appelle " éléments ". Regardez le code source dans la bibliothèque Zend Framework.

J'ai codé une nouvelle méthode privée dans le contrôleur, appelée buildSurveyForm (). Remarque: l'objet, passé en tant que paramètre, est construit à partir d'une énorme requête SQL avec une demi-douzaine d'instructions JOIN, qui récupèrent les données de quelques tables (enquêtes, questions, réponses, etc.) dans la base de données. L'un des attributs publics de cette classe consiste en un tableau de questions, stockées sous forme d'objets (avec les méthodes / attributs publics également, etc.). Même chose pour les réponses. Le code pour construire ces classes est assez trivial et hors sujet ici.

Voici le code dans le contrôleur de sondage. J'ai copié / collé et édité / supprimé quelques lignes pour le rendre beaucoup plus clair:

private function buildSurveyForm(MyApp_Object_Survey $survey)
{
    foreach ($survey->questions as $question)
    {
        $element = new Zend_Form_Element_MultiCheckbox($question->order);
        $element->addMultiOptions($question->getAnswersLabels());
        $element->setName($question->order);
        $element->setLabel($question->title);

        $elements[] = $element;
    }

    // Here's the trick :
    $formOptions = array('elements' => $elements);

    $surveyForm = new MyApp_Survey_Form($formOptions);

    $urlHelper = $this->_helper->getHelper('url');
    $surveyForm->setAction($urlHelper->url(array(
            'controller' => 'survey',
            'action' => 'vote'),
        'default'
    ));
    $surveyForm->setMethod('post');

    $this->_forms['survey'] = $surveyForm;

    return $this->_forms['survey'];
}

La classe Enquête MyApp ne contient qu'un bouton Envoyer dans la méthode init (). Les éléments générés dynamiquement avec le code ci-dessus sont ajoutés AVANT ce bouton d'envoi (ce qui est inattendu, mais utile). Cette classe étend simplement Zend_Form.

Ensuite, dans le contrôleur d'enquête / l'action d'affichage:

public function viewAction()
{
    $surveyModel =    $this->_model['survey'];
    $survey =        $surveyModel->getFullSurvey($this->_getParam('id'));
    $survey =        new MyApp_Object_Survey($survey);
    // Calls above private method :
    $surveyForm =    $this->buildSurveyForm($survey);

    $this->view->assign(array(
         'surveyForm' => $surveyForm,
    ));
}

Ajouter des filtres, des validateurs et des décorateurs pour former des éléments est désormais une tâche triviale. Ma proposition est un peu sale, mais je pense que le travail est fait. J'ajouterai une nouvelle proposition si je trouve quelque chose de plus élégant. N'hésitez pas à poster différentes réponses / solutions.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top