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

一個事件監聽器確實是一個選項,但我認爲這應該是可能的,沒有自定義監聽器/變壓器。 –