У меня была такая же проблема, как у вас. Билет # 5867 в Symfony посвящен этой проблеме, и многие люди потеряли много времени с ним.
В билете некоторые люди дают решения.Вы можете попробовать их, но я не знаю, почему они не сработали в моем случае.
Я получил решение , найденное в этом посте .Это очень полезный пост, который объясняет причину этой ошибки и обходного пути.
В основном, ошибка связана с тем, что при сохранении встроенных форм Symfony вызывает save()
во встроенном объекте, но нево встроенной форме, а save()
в объекте не обновляет связанные таблицы.
Для ее решения необходимо перезаписать //lib/form/doctrine/BaseFormDoctrine.class.php
(или эквивалент Propel, но затем заменить Doctrine for Propel в следующем коде):
Создайте функцию bindEmbeddedForms()
следующим образом:
public function bindEmbeddedForms($embedded_forms, $values)
{
if($this->isValid())
{
foreach ($embedded_forms as $name => $form)
{
$form->isBound = true;
$form->values = $values[$name];
if ($form->embeddedForms)
{
$this->bindEmbeddedForms($form->embeddedForms, $values[$name]);
}
}
}
}
Объявите bind()
функцию, вызывающую своего родителя таким образом:
public function bind(array $taintedValues = null, array $taintedFiles = null)
{
parent::bind($taintedValues, $taintedFiles);
$this->bindEmbeddedForms($this->embeddedForms, $this->getValues());
}
И перезаписайте saveEmbeddedForms()
this way:
public function saveEmbeddedForms($con = null, $forms = null)
{
if (is_null($con))
{
$con = $this->getConnection();
}
if (is_null($forms))
{
$forms = $this->embeddedForms;
}
foreach ($forms as $key => $form)
{
if ($form instanceof sfFormDoctrine)
{
if(method_exists(new $form(), 'doSaveManyToMany'))
{
$form->doSaveManyToMany($con);
}
else
{
$form->getObject()->save($con);
}
$form->saveEmbeddedForms($con);
}
else
{
$this->saveEmbeddedForms($con, $form->getEmbeddedForms());
}
}
}
Затем в вашем классе встроенной формы (в посте это также делается в классе BaseFormDoctrine
, но я думаю, что это чище по-моему), создайте метод doSaveManyToMany
которые сохраняют ваши отношения:
public function doSaveManyToMany($con = null)
{
if (is_null($con))
{
$con = $this->getConnection();
}
$this->object->save($con);
/*
* Save the many-2-many relationship
*/
$this->save***List($con); //Ex: $this->saveAhasBList($con)
}
Некоторые люди говорят, что в комментариях к записи есть проблема, и говорят решение, но это был не мой случай.
Надеюсь, это кому-нибудь поможет, дажеесли мой ответ на довольно старый открытый вопрос.