У меня есть форма, которая представляет один объект ответа (это стандартная сгенерированная 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?
Я считаю, что ваш BbQuestionAnswersForm расширяет неправильный объект. Он должен расширять BaseFormDoctrine или, возможно, BaseBbQuestionAnswersForm, если вы используете среду правильно.
Изменить: Просто заметил, что вы используете Propel, но это должно быть то же самое. Пытаться:
class BbQuestionAnswersForm extends BaseBbQuestionAnswersForm
и менее вероятно:
class BbQuestionAnswersForm extends BaseFormPropel
Метод сохранения должен выглядеть так:
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;
}