0

我正在Symfony 2.8应用程序中处理表单。Symfony 2.8表单实体类型定制属性

我有一个实体对象,该实体可以有一个或多个子对象。 这些子对象由属性ID标识,但也由属性密钥标识。

默认情况下,在HTML(subObject .__ toString())中使用id属性中的值。我想使用属性中的

我似乎无法找到如何做到这一点?

PS:我不能使用子对象的__toString()方法,因为这是已经在使用一些其他的目的?

想法将不胜感激。

<?php 

namespace My\Bundle\ObjectBundle\Form\Type\Object; 

use Symfony\Bridge\Doctrine\Form\Type\EntityType; 
use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\Extension\Core\Type\TextType; 
use Symfony\Component\Form\FormBuilderInterface; 

class ObjectType extends AbstractType 
{ 
    /** 
    * @param FormBuilderInterface $builder 
    * @param array    $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('code', TextType::class, [ 
       'required' => true, 
      ]) 
      ->add('subObjects', EntityType::class, [ 
       'class' => 'My\Bundle\ObjectBundle\Entity\SubObject', 
       'multiple' => true, 
      ]) 
    } 
} 
+0

我不明白你想用钥匙做什么,你能提供一个你想要实现的例子吗? – Richard

+0

@Richard我没有在任何地方显示SubObject的“id”。只有“钥匙”是对外界的“已知财产”。我想要做的是做到这一点:form [subObjects] [0] = 7TBF65Dtufbg7ung&form [subObjects] [1] = IBIU76ghh并使用这些“键”从DB加载SubObject并将它们“连接”到Object 。 我希望我已经解释清楚了.. –

+0

我明白了。根据你的逻辑标准写一个表单监听器来填充subObjects集合可能是最好的。 – Richard

回答

1

我抓住了一个快速的伪代码,我该如何在听众中这样做,希望我能理解你在做什么。无论如何,这是一个普遍的方法。

class ResolveSubObjectSubscriber implements EventSubscriberInterface { 

    /** @var EntityManager */ 
    private $entityManager; 

    public function __construct(FormFactoryInterface $factory, EntityManager $entityManager) { 

     $this->factory = $factory; 
     $this->entityManager = $entityManager; 
    } 

    public static function getSubscribedEvents() { 
     return array(FormEvents::POST_SET_DATA => 'resolveSubObject'); 
    } 

    /** 
    * Resolve sub objects based on key 
    * 
    * @param FormEvent $event 
    */ 
    public function resolveSubObject(FormEvent $event) { 

     $data = $event->getData(); 
     $form = $event->getForm(); 

     // don't care if it's not a sub object 
     if (!$data instanceof SubObject) { 
      return; 
     } 

     /** @var SubObject $subObject */ 
     $subObject = $data; 

     // here you do whatever you need to do to populate the object into the sub object based on key 

     $subObjectByKey = $this->entityManager->getRepository('SomeRepository')->findMySubObject($subObject->getKey()); 
     $subObject->setObject($subObjectByKey); 
    } 
} 
+0

一个事件监听器确实是一个选项,但我认为这应该是可能的,没有自定义监听器/变压器。 –