2013-07-22 3 views
0

У меня возникла проблема, когда я пытаюсь сохранить информацию о форме в базе данных. Моя форма кажется недействительной даже после ручной установки идентификатора Театра для каждого театра в выбранной сети. Вот соответствующая часть моего модуля actions.class.php:Что не так с моей формой?

Вот executeCreate():

public function executeCreate(sfWebRequest $request) { 
    $this->form = $this->configuration->getForm(); 
    $this->showing = $this->form->getObject(); 
    $this->processCreateForm($request, $this->form); 
    $this->setTemplate('new'); 
} 

и теперь processCreateForm():

protected function processCreateForm(sfWebRequest $request, sfForm $form) { 
    $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName())); 

    $form_name = $form->getName(); 
    $parameters = $request->getParameter($form_name); 
    $network_id = $parameters['network_id']; 

    $theaters_list = Doctrine_Query::create() 
      [...] 
      ->execute(); 

    foreach ($theaters_list as $theater) { 
     $form->getObject()->setTheaterId($theater->theater_id); 
     $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName())); 

     if ($form->isValid()) { 
      $showing = $form->save(); 
     } else { 
      foreach ($form->getErrorSchema()->getErrors() as $key => $error) { 
       echo '<p>' . $key . ': ' . $error . '</p>'; 
      } 
     } 
    } 
    $this->getUser()->setFlash('update_success', true); 
    $this->setTemplate('new'); 
} 

Вот выход:

Theater_id required output

Спасибо за вашу помощь

+0

Пожалуйста, добавьте вашу форму и схему вашего объекта в вашем посте – sinhix

ответ

2

Есть две странные вещи, происходящие здесь, которые я думаю, сломать свой код.

  1. Вы запустите метод bind() дважды, который может быть сброс ваших значений на объекте.

  2. Я не думаю, что метод getObject() возвращает объект по ссылке.

Итак, когда вы запустите:

$form->getObject()->setX($val); 
    $form->save(); 

затем обновить поле объекта, возвращенного формой, но затем сохранить исходный объект, который по-прежнему привязан к форме.

Попробуйте делать что-то вроде этого:

$myObject = $form->updateObject()->getObject(); 
    $myObject->setX($value); 
    $myObject->save(); 

updateObject() важно, если вы используете форму для редактирования существующего объекта, а не создавать новый. Без этого вы получите старые значения объекта.

Если вы хотите запустить его в цикле, вы можете выполнить только настройку и сохранить часть. Таким образом, вы бы что-то подобное в вашем processCreateForm:

protected function processCreateForm(sfWebRequest $request, sfForm $form) 
{ 
    $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName())); 

    if ($form->isValid()) { //You can check the validity of your form at this point. 

     //Create $theatersList 
     ... 

     $myObject = $form->updateObject(); 

     foreach ($theatersList as $theater) { 
      $myObject->setTheaterId($theater->theater_id); 
      $showing = $myObject->save(); 

      //Do something with $showing 

     } 
    } else { 
     //Print the errors. 
    } 
} 

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

EDIT

Некоторые изменения в коде:

protected function processCreateForm(sfWebRequest $request, sfForm $form) 
{ 
    $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName())); 

    if ($form->isValid()) { //You can check the validity of your form at this point. 

     //Create $theatersList 
     ... 

     $myObject = $form->updateObject(); 
     $myObjectVars = $myObject->toArray(); 

     foreach ($theatersList as $theater) { 

      $myNewObject = new SomeClass(); 
      $myNewObject->fromArray($myObjectVars); 
      $myNewObject->setTheaterId($theater->theater_id); 
      $showing = $myNewObject->save(); 

      //Do something with $showing 

      $myNewObject->free(); 
      unset($myNewObject); 
     } 
    } else { 
     //Print the errors. 
    } 
} 
+0

Спасибо, я действительно забыл, чтобы сбросить 'theater_id' виджет. Я начал с этого, и форма была проверена. Я принял ваш совет и преобразовал все в условие if ($ form-> isValid()) {} '. Спасибо. Однако в таблице уже есть много записей, а первый добавленный кортеж имеет идентификатор 0, я не понимаю, почему, но я думаю, это еще одна проблема! – halpsb

+0

В моей таблице отображения есть идентификатор с автоматическим добавлением, который является скрытым полем в этой форме. Теперь я добавил список театров, что позволило добавить показ только для одного театра. Это прекрасно работает с использованием двух строк внутри 'foreach()', но я все еще не могу заставить его работать для всей Сети. Я считаю, что мне нужно увеличить значение скрытого отображаемого id в 'foreach()' тоже. '$ form-> getObject() -> getId()' работает только после '$ show = $ form-> save()'. Я пытался увеличивать в конце 'foreach', но я получаю сообщение об ошибке? «Нарушение ограничения целостности: 1048 Колонка« театр_ид »не может быть пустым – halpsb

+0

Хм ... Может быть, вам стоит попытаться создать новые объекты перед каждым сохранением. Если я правильно понимаю вашу логику, вы хотите заполнить одну форму, представить действие и на основе этой формы создать столько строк, сколько те те, которые вы найдете. Посмотрите мои изменения на ответ, возможно, это поможет. –

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