2009-07-03 3 views
3

При использовании Zend_Form я считаю себя создает много методов контроллера, которые выглядят так:Лучшие способы использования Zend_Form в 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; 
} 

Большая часть этого кода всегда то же самое, и я уверен, это лучшие способы сделать это. Какие еще шаблоны люди используют с Zend_Form, чтобы сократить количество используемого кода шаблона?

ответ

0

Is $ form-> populate() действительно необходимо? Недействительные формы IIRC будут заполнены автоматически.

+0

спасибо, я удалил первую $ form-> populate(). Второй из них по-прежнему необходим для первоначального заполнения формы из базы данных. –

0

Если честно, у меня есть аналогичные действия в моих контроллерах. Одна вещь, которую я делаю, чтобы удержать вес в контроллере и в качестве соглашения, заключается в проверке проверки в модели. Я также называю объект формы от модели, чтобы облегчить это (возможно, уже будет делать это с помощью вашего метода getPersonEditForm в контроллере Так что, если я написал свои действия, это будет выглядеть следующим образом:.

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

Итак в методе модели setFromArray я бы:

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

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

     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

Правда, это не значительно более кратким, чем существующий подход, и я, как и вы, часто чувствуют это может быть лучше, отведенной

+0

Я бы назвал метод в моделях validate или что-то подобное, так как setFromArray не кажется правильным определением, по крайней мере, с моей точки зрения –

+0

Я согласен, что setFromArray не звучит как хорошее имя метода, однако, подтвердите свою достоверность, поскольку это не так описывая, что происходит с данными (только чтобы он был сначала проверен). Большинство методов моей модели начинаются с «get», «add», «edit» или «delete», поэтому дается четкое указание на то, что нужно делать с данными. –

4

Я хотел бы сохранить. столько, сколько pos sible в моделях

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

Итак, в модели я бы:

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

Кроме того, вы можете добавить эти методы к абстрактной модели, что все ваши модели приложений будет расширяться, а затем только перезаписать когда вам нужно сделать что-то особенное.

+0

Ваше использование хранения объектов формы в виде массива является проницательным. Это то, что я могу сделать с моими моделями, поскольку в настоящее время у меня есть только получатели для конкретных форм. +1 –

Смежные вопросы