Как сохранить встроенные формы в Symfony 1?

У меня есть форма, которая представляет один объект ответа (это стандартная сгенерированная propel форма, я не сильно изменил там только некоторые правила проверки) и другая форма, представляющая набор кода ответов, как показано ниже:

class BbQuestionAnswersForm extends sfForm {

public function __construct($defaults = array(), $options = array(), $CSRFSecret = null) {
parent::__construct($defaults, $options, $CSRFSecret);
}

public function configure() {
if (!$questions = $this->getOption('questions')) {
throw new InvalidArgumentException('The form need array of BbExamQuestion objects.');
}
if (!$taker = $this->getOption('taker')) {
throw new InvalidArgumentException('The form need BbExamtaker object.');
}
if (!$user = $this->getOption('questions')) {
throw new InvalidArgumentException('The form need sfGuardUser object.');
}

foreach($questions as $question) {
$answer = new BbExamAnswer();
$answer->setBbExamQuestion($question);
$answer->setBbExamTaker($taker);
$answer->setCreatedBy($user);
$answer->setUpdatedBy($user);
$form = new BbExamAnswerForm($answer, array('question' => $question));

$this->embedForm($question->getId(), $form);
}

$this->widgetSchema->setNameFormat('solve[%s]');
}
}

Все (проверка, отображение) отлично работает с этой формой, пока я не попытаюсь ее сохранить. Часть действия, которая пытается сохранить форму:

...
$this->form = new BbQuestionAnswersForm(null, array('questions' => $this->questions, 'taker' => $this->taker, 'user' => $this->getUser()->getGuardUser()));
if($request->isMethod('post')) {
$this->form->bind($request->getParameter($this->form->getName()));
if($this->form->isValid()) {
if($this->form->save()) {
$this->getUser()->setFlash('success', 'Save goes fine.');
$this->redirect($this->generateUrl('@bb'));
} else {
$this->getUser()->setFlash('error', 'Upps an error occurred.');
}
}
}

Когда я отправляю правильную форму, я получаю сообщение об ошибке «Вызов неопределенного метода BbQuestionAnswersForm :: save ()».

Я пытался написать этот метод так:

public function save() {
$conn = Propel::getConnection(ZlecPeer::DATABASE_NAME);
$conn->beginTransaction();
try{
foreach($this->getEmbeddedForms() as $form) {
$form->save();
}
$conn->commit();
} catch(Exception $e) {
$conn->rollback();
echo 'upps something goes wrong';
die($e->getMessage());
return false;
}
return true;
}

но это не работает, я получаю исключение без каких-либо сообщений.

Что я делаю не так, как заставить работать метод save?

0

Решение

Я считаю, что ваш BbQuestionAnswersForm расширяет неправильный объект. Он должен расширять BaseFormDoctrine или, возможно, BaseBbQuestionAnswersForm, если вы используете среду правильно.

Изменить: Просто заметил, что вы используете Propel, но это должно быть то же самое. Пытаться:

class BbQuestionAnswersForm extends BaseBbQuestionAnswersForm

и менее вероятно:

class BbQuestionAnswersForm extends BaseFormPropel
0

Другие решения

Метод сохранения должен выглядеть так:

public function save($con = null) {
if (null === $con) {
$con = Propel::getConnection(BbExamAnswerPeer::DATABASE_NAME);
}
$con->beginTransaction();
try{
foreach($this->embeddedForms as $name => $form) {
if(!isset($this->values[$name]) || !is_array($this->values[$name])) {
continue;
}
if($form instanceof sfFormObject) {
$form->updateObject($this->values[$name]);
$form->getObject()->save($con);
$form->saveEmbeddedForms($con);
} else {
throw new Exception('Embedded form should be an instance of sfFormObject');
}
}
$con->commit();
} catch(Exception $e) {
$con->rollBack();
throw $e;
return false;
}

return true;
}
0

По вопросам рекламы [email protected]