2013-07-22 39 views
0

我在尝试将表单的信息保存到数据库时遇到问题。即使在选定的网络中为每个影院手动设置剧院ID之后,我的表单似乎仍然无效。 这里是我的模块的的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小部件,因为它不应该由用户设置,并且不必是表单的一部分验证。

编辑

一些修改代码:

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()){}'条件中。谢谢。然而,该表已经有很多记录,第一个新添加的元组的ID为0,我不明白为什么,但我想这是另一个问题! – halpsb

+0

我的显示表格具有自动递增的ID,这是该窗体中的隐藏字段。我现在添加了一个剧院列表,只能为一个影院添加一个显示。这完美地使用了'foreach()'中的2行,但我似乎无法使它适用于整个网络。我相信我必须在'foreach()'中增加隐藏的显示id的值。 '$ form-> getObject() - > getId()'只能在'$ showing = $ form-> save()'之后生效。我试着在'foreach'结尾增加,但是我得到一个错误? '完整性约束违规:1048'theater_id'列不能为空' – halpsb

+0

嗯......也许你应该尝试在每次保存前创建新的对象。如果我正确理解你的逻辑,你想填写一个表格,提交一个行动,并根据这个表格创建与你找到的剧院一样多的行。看到我的编辑回答,也许这将有所帮助。 –