0

Я работаю над формой в приложении Symfony 2.8.Symfony 2.8 form entity type custom property

У меня есть объект Object, и этот объект может иметь один или несколько SubObjects. Эти объекты SubObjects указаны имуществом id, а также недвижимостью ключ.

По умолчанию значение свойства id используется в HTML (subObject .__ toString()). Я хочу использовать свойство ключ в.

Я не могу найти, как это сделать ...

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 Я не показываю «id» SubObject где угодно. Только «ключ» является «известным свойством» для внешнего мира. Я хотел бы сделать это: form [subObjects] [0] = 7TBF65Dtufbg7ung & form [subObjects] [1] = IBIU76ghh и использовать эти «ключи» для загрузки SubObject из БД и «подключить» их к объекту , Надеюсь, я объяснил это правильно. –

+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

Слушатель событий - это вариант, но я думаю, что это должно быть возможно без пользовательских прослушивателей/трансформаторов. –

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