Заставить Symfony сохранить embedForm - PullRequest
2 голосов
/ 25 января 2011

У меня есть SymfonyForm, у которого есть embedForm. Я хочу сохранить embedForm, если он заполнен, даже если основная форма пуста. Таким образом, пользователь может загрузить столько фотографий, сколько он хочет, для одного объекта foo. Но я не знаю, как заставить Symfony сохранить embedForm?!

Схема

Foo:
 columns:
 title: {type: string(255), notnull: true}

Photo:
 columns:
  foo_id: {type: integer}
  filename: {type: string(255), notnull: true}
  caption: {type: string(255), notnull: true}
 relations:
  Foo:
   alias: Foo
   foreignType: many
   foreignAlias: Photos
   onDelete: cascade

FooPhotoForm:

$photo = new Photo();
$photo->Foo = $this->getObject();
$photoForm = new PhotoForm($photo);
$this->embedForm('newPhoto', $photoForm);

PhotoForm:

$this->useFields(array('filename', 'caption',));
$this->validatorSchema['filename'] = new sfvalidatorFile(...);

Действие:

 protected function processForm(sfWebRequest $request, sfForm $form)
    {
 $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
 if ($form->isValid())
 {
     $cms = $form->save();

 }
 else
 {
     if(caption and filename not empty)
     {
  $form->saveEmbeddedForms();
     }
     else
     {
  $this->getUser()->setFlash('error', 'The item has not been saved due to some errors.', false);
     }
 }

1 Ответ

1 голос
/ 25 января 2011

Принуждение мне кажется, что вы пытаетесь взломать нормальное выполнение, чтобы заставить вещи работать, я действительно не рекомендую вам делать это, но вот несколько вариантов:

  • мой первый подход к этомупроблема заключается в использовании некоторого ajax, чтобы позволить пользователям сохранять определенную деталь, а не отправлять пустую кучу пустых полей.
  • Вам следует изменить действие processForm (общий метод администратора, который заботится о сохранении объектов формы), чтобыИзвлеките информацию embbedForm из запроса, создайте экземпляр формы для встраивания и свяжите информацию запроса (только для формы для встраивания), чтобы можно было выполнить проверку.Если он действителен, сохраните его.

Проверьте код генератора-администратора (хранящийся в кэше) в таких действиях, как создание или обновление, это может помочь вам немного больше представить идею.

...