Domanda

Sto cercando di creare un modulo utilizzando il componente Zend_Form, ma il numero di elementi varia. Le informazioni per ciascun elemento Zend_Form sono archiviate in un database (nome, opzioni, validatori, filtri, ecc.).

L'applicazione a cui sto lavorando consiste nella creazione di sondaggi che contengono un numero variabile di domande. Ogni domanda è associata a matrici diverse di risposte. Alla fine il mio obiettivo è quello di costruire array di pulsanti radio / checkbox, dinamicamente, lato server.

Sto cercando un modo carino per generare il mio modulo, ma non sono sicuro del modo migliore per caricare il modello all'interno del modulo. Il modello deve essere caricato nel controller e poi passato (in qualche modo, tramite un parametro?) Direttamente al modulo, oppure è meglio caricare il modello nel metodo Form init ()? Qual è il posto migliore per inserire la logica, dovrebbe essere all'interno della classe del modulo, o all'interno del controller o all'interno del modello?

La mia idea è di recuperare le proprietà degli elementi del modulo (nome, regole, filtri, ecc.) nel database, quindi iterare e infine rendere il modulo. Cosa ne pensi di questo approccio? Alla fine, gli elementi verranno aggiunti dinamicamente (lato client), questa volta, utilizzando AJAX e una libreria JavaScript (come jQuery).

Ecco un paio di link utili che ho trovato tramite Google, ma penso che tutti rispondano a una domanda leggermente diversa dalla mia:

Nella creazione di moduli dinamici, lato server:

Sulla creazione di moduli dinamici, lato client, con elaborazione AJAX:

È stato utile?

Soluzione

Potresti estendere Zend_Form.

Il modulo Zend non è un buon posto per la logica, ma solo la rappresentazione del modulo.

Quindi, carica tutti gli elementi necessari usando il modello nel controller e passali al form in contructor come parametri.

Altri suggerimenti

Penso di aver trovato una possibile soluzione, implica il passaggio di una matrice di elementi Zend Form al metodo Zend Form :: __ construct () . Il costruttore accetta una serie di opzioni, una delle quali è chiamata " elementi " ;. Dai un'occhiata al codice sorgente all'interno della libreria Zend Framework.

Ho codificato un nuovo metodo privato all'interno del controller, chiamato buildSurveyForm (). Nota: l'oggetto, passato come parametro, viene creato da un'enorme query SQL con una mezza dozzina di istruzioni JOIN, che recupera i dati da alcune tabelle (sondaggi, domande, risposte, ecc.) All'interno del database. Uno degli attributi pubblici per questa classe è costituito da una serie di domande, memorizzate come oggetti (anche con metodi / attributi pubblici, ecc.). Lo stesso per le risposte. Il codice per la creazione di queste classi è piuttosto banale e fuori tema qui.

Ecco il codice all'interno del controller dell'indagine. Ho copiato / incollato e modificato / lasciato cadere alcune righe per renderlo molto più chiaro:

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 Modulo sondaggio MyApp contiene solo un pulsante Invia all'interno del metodo init (). Gli elementi generati dinamicamente con il codice sopra sono aggiunti PRIMA di questo pulsante di invio (che è inaspettato, ma utile). Questa classe estende semplicemente Zend_Form.

Quindi, all'interno del controller del sondaggio / azione di visualizzazione:

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

L'aggiunta di filtri, validatori e decoratori per formare elementi è ora banale. La mia proposta è un po 'sporca, ma penso che abbia fatto il lavoro. Aggiungerò una nuova proposta se trovo qualcosa di più elegante. Sentiti libero di pubblicare diverse risposte / soluzioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top