2013-10-07 3 views
1

Я создаю галерею изображений, которая должна позволять помечать каждое изображение ключевыми словами. Для обработки тегов я использую FPN/TagBundle (https://github.com/FabienPennequin/FPNTagBundle).Symfony2 form collection -

Я уже построил форму, используя следующие:

// UserAlbumImageType.php 

... 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('description', null, array('label' => 'Description')) 
     //TODO: add tags 
     ->add('tags', null, array(
      'label' => 'Tags', 
      'mapped' => false, 
      'required' => false, 
      'attr' => array(
       'class' => 'tags', 
      ), 
     )) 
     ->add('licenseType', 'entity', array(
      'label' => 'License', 
      'class' => 'VoxCoreBundle:LicenseType', 
     )) 
     ->add('privacyType', null, array('label' => 'Privacy')) 
     ; 
}$builder 
       ->add('images', 'collection', array(
        'type' => new UserAlbumImageType(), 
        'label' => false, 
       )) 
      ; 
      break; 
... 

// UserAlbumType.php 

... 
$builder 
    ->add('images', 'collection', array(
     'type' => new UserAlbumImageType(), 
     'label' => false, 
    )) 
    ; 
    break; 
... 

Как вы можете видеть, свойство метки не отображается. Это связано с тем, что я не хочу писать теги в поле в базе данных, но вместо этого сохраняю их в центральной таблице тегов. И вот в чем проблема.

Когда форма отправлена, я просто звоню $em->persist($userAlbum), который затем сохраняет изменения в объектах UserAlbumImage в коллекции. В это время я хотел бы захватить теги, которые были отправлены через форму, и установить их с помощью менеджера тегов. Я не знаю, где это сделать. В слушателе PostPersist Doctrine? Если это так, мне все равно нужно будет сохранять теги в объекте хотя бы временно, а затем проанализировать их. Есть ли способ лучше?

ответ

0

Если бы я тебя, я бы следовать (как я всегда пытаюсь сделать) шаблон MVC с добавлением хранилищ. Я бы применил метод saveGallery в репозитории для объекта галереи. Это вызвало бы вызов от контроллера (как и рекомендованный mansolux, но вместо этого, имея функциональность магазина в контроллере (неправильная практика, если вы спросите меня), вызовите для него метод репозитория). Метод получит все представленные данные. Сначала он будет хранить все объекты, которые необходимо сохранить перед тегами (галерея, изображения и многое другое). После этого я хотел бы получить хранилище тегов:

$repo = $this->em->getRepository("FPNTagBundle:TagEntityName"); 

Теперь, единственное, что осталось сделать, это сохранить тег с помощью этого хранилища. Вы можете добавить некоторые проверки здравомыслия, чтобы убедиться, что пакет тегов, который вы используете, на самом деле существует, но это то, что вы можете решить.

Надеюсь, это поможет.

0

Почему не в контроллере:

// ... 
$tags = $form->getData()->getTags(); 
foreach($tags as $tag) { 
    $em->persist($tag); 
} 
// ... 

$em->flush(); 
+0

Спасибо за предложение. Это нормально, но, к сожалению, FPNTagBundle требует, чтобы объект (в данном случае UserAlbumImage) сохранялся до того, как теги могут быть сохранены: https://github.com/FabienPennequin/FPNTagBundle#using-tags –

Смежные вопросы