Frage

Ich versuche, ein Formular mit dem Zend_Form Komponente zu bauen, aber die Anzahl der Elemente variiert. Die Informationen für jedes Zend_Form Element werden in einer Datenbank gespeichert (Name, Optionen, Validierer, Filter, usw.).

Die Anwendung arbeite ich an besteht aus Baugutachten, die eine unterschiedliche Anzahl von Fragen enthalten. Jede Frage wird mit unterschiedlichen Anordnungen von Antworten in Verbindung gebracht. Letztlich ist mein Ziel Arrays von Radio / Checkbox Tasten zu bauen, dynamisch, Server-Seite.

Ich suche eine hübsche Weise, meine Form zu erzeugen, aber ich bin der beste Weg, nicht sicher, ob das Modell in der Form zu laden. Sollte das Modell in der Steuerung geladen wird, dann übergibt (irgendwie über einen Parameter?) Direkt an die Form, oder ist es besser das Modell innerhalb des Formulars init () Methode zu laden? Wo ist der beste Ort, um die Logik zu setzen, sollte es in der Form-Klasse sein, oder innerhalb der Steuerung oder innerhalb des Modells?

Meine Idee ist, Formularelement Eigenschaften (Name, Regeln, Filter, etc.) in der Datenbank zu holen, dann durchlaufen und schließlich die Form zu machen. Was halten Sie von diesem Ansatz? Letztlich werden Elemente dynamisch hinzugefügt (Client-Seite), diesmal mit AJAX und JavaScript-Bibliothek (wie jQuery).

Hier sind ein paar nützlichen Links, die ich über Google gefunden, aber ich denke, dass sie alle eine etwas andere Frage als meine Antwort:

Auf den Aufbau dynamischer Formulare, Serverseite:

Auf der Erstellung dynamische Formulare, Client-Seite mit AJAX-Verarbeitung:

War es hilfreich?

Lösung

Sie könnten Zend_Form erweitern.

Zend Form ist nicht guter Ort für Logik, nur Repräsentation bilden.

So laden alle benötigten Elemente-Modell in Controller und sie in die Form in contructor als Parameter übergeben.

Andere Tipps

Ich glaube, ich eine mögliche Lösung gefunden wird, geht es um eine Anordnung von Zend Formelementen vorbei Zend Formular :: __ construct () Methode. Der Konstruktor nimmt eine Reihe von Optionen, einer von ihnen wird als „ Elemente “. Werfen Sie einen Blick auf den Quellcode im Zend Framework Bibliothek.

I codiert eine neue private Methode innerhalb der Steuerung, genannt buildSurveyForm (). Hinweis: das Objekt, als Parameter übergeben, wird aus einer riesigen SQL-Abfrage gebaut mit einem halben Dutzend JOIN-Anweisungen, Daten von einigen Tabellen Abrufen (Umfragen, Fragen, Antworten, etc.) in der Datenbank. Eine der öffentlichen Attribute für diese Klasse besteht aus einer Reihe von Fragen, als Objekte gespeichert (mit öffentlichen Methoden / Attribute als auch, etc.). Das Gleiche gilt für Antworten. Der Code für diese Klassen Gebäude ist ziemlich trivial und aus Thema hier.

Hier ist der Code innerhalb der Umfrage-Controller. Ich kopiert / eingefügt und bearbeitet / gelöscht einige Zeilen es viel klarer zu machen:

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

Die MeineAnw Survey Form Klasse nur eine Schaltfläche zum Senden enthält in der init () -Methode. Die dynamisch generierten Elemente mit dem obigen Code hinzugefügt werden, bevor Sie diese Taste einreichen (die unerwarteten, aber nützlich). Diese Klasse einfach erweitert Zend_Form.

Dann innerhalb Umfrage Controller / Ansicht Aktion:

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

Hinzufügen von Filtern, Validierer und Dekorateure Elemente zu bilden, ist nun trivial. Mein Vorschlag ist ein bisschen schmutzig, aber ich denke, es ist der getan Job bekommt. Ich werde einen neuen Vorschlag hinzufügen, wenn ich etwas elegantere finden. Fühlen Sie sich frei, um verschiedene Antworten / Lösungen zu erstellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top