2009-07-03 11 views
3

Wenn Zend_Form mit finde ich mich viel Controller-Methoden erstellen, die wie folgt aussehen:Bessere Möglichkeiten der Verwendung von Zend_Form in Zend MVC

function editPersonAction() 
{ 
    $model = $this->getPersonModel(); 
    $form = $this->getPersonEditForm(); 
    if ($this->getRequest()->isPost() { 
     $data = $this->getRequest()->getPost(); 
     //$form->populate($data); [removed in edit] 

     if ($form->isValid($data)) { 
      $data = $form->getValues(); 
      $model->setFromArray($data); 
      // code to save model then decide which page to redirect to 
     } 
    } else { 
     $form->populate($model->toArray()); 
    } 
    $this->view->form = $form; 
} 

Die meisten dieser Code ist immer das gleiche, und ich bin es sicher sind bessere Möglichkeiten, dies zu tun. Welche anderen Muster verwenden Menschen mit Zend_Form, um die Menge des verwendeten Standardcodes zu reduzieren?

Antwort

0

Ist $ form-> populate() wirklich notwendig? IIRC ungültige Formulare werden automatisch gefüllt.

+0

danke, ich habe das erste $ form-> populate() entfernt. Der zweite Schritt ist noch erforderlich, um das Formular zunächst aus der Datenbank zu füllen. –

0

Um ehrlich zu sein, habe ich auch ähnliche Aktionen in meinen Controllern. Eine Sache, die ich tue, um das Gewicht in der Steuerung und durch Konvention zu halten, besteht darin, die Validierungsprüfung im Modell durchzuführen. Ich rufe auch das Formularobjekt aus dem Modell um dies zu erleichtern (man könnte dies bereits in Ihrem Controller über Ihre getPersonEditForm Methode tut Also, wenn ich Ihre Aktion geschrieben hatte, es würde wie folgt aussehen:.

function editPersonAction() 
{ 
    $model = $this->getPersonModel(); 
    $form = $this->getPersonEditForm(); 

    if($this->getRequest()->isPost()) 
    { 
     if($model->setFromArray($this->getRequest()->getPost())) 
     { 
      // code to decide which page to redirect to 
     } 
    } 
    else 
    { 
     $form->populate($model->toArray()); 
    } 

    $this->view->form = $form; 
} 

So dann im Modell Methode setFromArray würde ich:

public function setFromArray(array $data) 
{ 
    $form = $this->getRegistrationForm(); 

    if($form->isValid($data)) 
    { 
     // code to save model state 

     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

Zugegeben, es ist nicht wesentlich prägnanter als Ihre bestehende Ansatz ist und ich, wie sie selbst, fühlen sich oft das besser abstrahiert werden könnte

+0

ich würde die Methode in den Modellen validate oder etwas ähnliches nennen, da setFromArray aus meiner Sicht keine richtige Definition scheint –

+0

Ich stimme zu, dass SetFromArray klingt nicht wie ein guter Methodenname, aber validieren schlechter als es nicht ist beschreiben, was mit den Daten passiert (nur dass es zuerst validiert werden muss). Die meisten meiner Modellmethoden beginnen entweder mit "Get", "Add", "Edit" oder "Delete", um einen klaren Hinweis darauf zu geben, was mit den Daten zu tun ist. –

4

ich mag zu halten. so viel wie möglich lich in den Modellen

function editPersonAction() 
{ 
    $model = $this->getPersonModel(); 

    if ($this->getRequest()->isPost() { 
     $data = $this->getRequest()->getPost(); 

     if ($model->validateForm($data)) { 
      // code to save model then decide which page to redirect to 
     } else { 
      // error management 
     } 
    } 

    $this->view->form = $model->getForm(); 
} 

im Modell also dann müsste ich:

public function validateForm(array $data) 
{  
    $form = $this->getForm(); 

    if($form->isValid($data)) 
    { 
     // code to save model state 

     return true; 
    } else { 
     return false; 
    } 
} 

public function getForm($instance = 'default') { 
    if (!isset($this->_forms[$instance])) { 
     $this->_forms[$instance] = new Your_Form_Class();   
     $this->_forms[$instance]->populate($this->toArray()); 
    } 

    return $this->_forms[$instance]; 
} 

Und Sie diese Methoden zu einem abstrakten Modell hinzufügen können, die alle Ihre Anwendungsmodelle erweitern würden, und dann auch nur überschreiben Sie, wenn Sie etwas Besonderes tun müssen.

+0

Ihre Verwendung von Formularobjekten als Array ist aufschlussreich. Das ist etwas, was ich mit meinen Modellen machen könnte, da ich momentan nur Getter für bestimmte Formen habe. +1 –

Verwandte Themen