Коллекция типов форм Symfony 2, изменение метки для каждого нового свойства из модели - PullRequest
3 голосов
/ 12 января 2012

У меня есть 4 сущности: Product, ProductFeatures, Goods, GoodsFeaturesValue и отношения между ними.Я добавляю немного Features для Product, а затем хочу создать форму со статическими полями Goods + несколько новых Features из Product для этого Goods.Значения для каждого Goods сохраняются в GoodsFeaturesValue.

Как построить эту форму "symfony way"?

ОБНОВЛЕНО

Я использую коллекцию для других Features, и это прекрасно работает, но как я могу установить меткуProductFeatures отношение для каждого значения?Я могу сделать это, когда рендер храмовник, но это плохо:)?

//GoodsFormType class
public function buildForm(FormBuilder $builder, array $options)
{
    $builder
            ->add('name')
            //other property...
            ->add('values', 'collection', array(
                'required' => true,
                'type' => new GoodsFeaturesValueFormType(),
                'allow_add' => false,
                'allow_delete' => false,
                'by_reference' => false,
            ))
    ;
}

//GoodsFeaturesValueFormType
    public function buildForm(FormBuilder $builder, array $options)
{
    $builder
            ->add('value', 'text')
    ;
}
  //controller
  public function saveAction($id)
{
    $em = $this->getDoctrine()->getEntityManager();
    $product = $em->getRepository('ShopCoreBundle:Product')->find($id);

    if (!$product)
        throw $this->createNotFoundException(sprintf('Product with id %s not found', $id));

    $features = $em->getRepository('ShopCoreBundle:ProductFeatures')->findByProduct($id);
    $goods = new Goods();
    $goods->setProduct($product);

    foreach ($features as $feature) {
        $entity = new GoodsFeaturesValue();
        $entity->setFeatures($feature);
        $entity->setGoods($goods);
        $entity->setProduct($product);
        $goods->addGoodsFeaturesValue($entity);
    }

    $request = $this->getRequest();

    $form = $this->createForm(new GoodsFormType(), $goods);
    $form->bindRequest($request);

    if ($form->isValid()) {
        $em->persist($goods);
        $em->flush();
        return $this->redirect($this->generateUrl('core_product_index'));
    }



    return array(
        'form' => $form->createView(),
        'goods' => $goods,
        'product' => $product,
        'features' => $features,
    );
}

Ответы [ 2 ]

2 голосов
/ 04 сентября 2012

Это именно то, что я хотел для динамического атрибута. Вы можете использовать FormEvent и EventSubscriber, чтобы сделать это как динамическую форму создания. http://symfony.com/doc/master/cookbook/form/dynamic_form_generation.html

Итак, в классе GoodsFeaturesValueFormType вы создаете новый EventSubscriber и с помощью preSetData устанавливаете метку с данными.

ОБНОВЛЕНИЕ : Symfony по умолчанию ResizeFormListener не передает ему значение, так как это будет ошибкой. Чтобы поддержать это, измените ResizeFormListener (какая коллекция используется), как показано ниже

[before]
    91         // Then add all rows again in the correct order                                                            
    92         foreach ($data as $name => $value) {                                                                       
    93             $form->add($this->factory->createNamed($this->type, $name, null, array_replace(array(                  
    94                 'property_path' => '['.$name.']',                                                                  
    95             ), $this->options)));
    96         }   

[modified]
    91         // Then add all rows again in the correct order                                                            
    92         foreach ($data as $name => $value) {                                                                       
    93             $form->add($this->factory->createNamed($this->type, $name, $value, array_replace(array(                  
    94                 'property_path' => '['.$name.']',                                                                  
    95             ), $this->options)));
    96         }   
0 голосов
/ 12 января 2012

Можно попробовать использовать Тип поля коллекции , простой пример: http://symfony.com/doc/current/reference/forms/types/collection.html#adding-and-removing-items

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...