2015-03-10 3 views
0

В настоящее время я работаю над проектом Symfony2, и я застрял в создании формы. У меня есть следующие настройки:Заполните форму доктрины с элементами динамической формы

<?php 
class Field { 
private $name; 
private $label; 
private $type; 
/** 
* @ORM\OneToMany(targetEntity="Option", mappedBy="field") 
*/ 
private $options; 

.... 
?> 

и

<?php 
class Option { 
private $value; 
private $type; 
/** 
* @var string 
* 
* @ORM\ManyToOne(targetEntity="Field", inversedBy="options") 
* @ORM\JoinColumn(name="field", referencedColumnName="name") 
*/ 
private $field; 

.... 
?> 

Теперь, что я хотел бы сделать, я создаю форму, с «поле» как выпадающий список/опция/radioobutton/checkbox (которая задается полем :: Тип $) и заполните поле его параметрами. Есть идеи?

Редактировать: Что может быть важно: мне не нужна возможность добавлять, удалять или изменять параметры. Они исправляются в базе данных и просто нужно выбирать. Некоторые с mulitple, некоторые без.

Edit2: Просто для уточнения: Я строю свои формы с Symfony формы: У меня есть основной вид типа («Case»), который содержит поля, которые содержат его Опции:

class CaseType extends AbstractType 
{ 
    private $case; 
    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $this->case = $options['data']; 
     $builder 
      ->add('user') 
      ->add('fields', 'collection', array('type' => new FieldType())) 
     ; 

и:

class FieldType extends AbstractType 
{ 

    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 

     $builder->add('options', 'entity', array(
        "class"  => "MyBundle:Option", 
        "property" => "value", 
        "query_builder" => function (EntityRepository $er) { 
         return $er->createQueryBuilder('o', 'Option') 
          ->where('o.field = :f') 
          ->setParameter('f', **type_of_current_field**) 
          ->orderBy('o.value', "ASC"); 
        } 
     )); 

Просто это не работает, как ожидалось ... Во-первых, потому что я не могу получить доступ к> тип и второй-полевого это довольно беспорядок

Edit3: Хорошо, я совершенно не понимаю, почему это делает не работает:

class FieldType extends AbstractType 
{ 

    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 

     $formFactory = $builder->getFormFactory(); 
     $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($formFactory) { 
      $form = $event->getForm(); 
      $data = $event->getData(); 

      $form->add('options', 'entity', array(
        "class"  => "MyBundle:Option", 
        "property" => "value", 
        "multiple" => "true", 
      )); 
     }); 

... >

Это просто дает мое следующее сообщение об ошибке: Предупреждение: недопустимый аргумент, поставляемый для Еогеасп()

Если я не смогу просто проанализировать все варианты для одного поля? Или мой подход совершенно неправильный, и я должен делать это по-другому? Когда я вывожу свои поля, это выглядит так:

Field {#427 ▼ 
    -id: 26 
    -name: "MyField" 
    -label: "field to fill out" 
    -type: "D" 
    -public: 1 
    -options: PersistentCollection {#440 ▼ 
    -snapshot: array:2 [ …2] 
    -owner: Field {#427} 
    -association: array:15 [ …15] 
    -em: EntityManager {#289 …10} 
    -backRefFieldName: "field" 
    -typeClass: ClassMetadata {#401 …} 
    -isDirty: false 
    -initialized: true 
    -coll: ArrayCollection {#397 ▼ 
     -_elements: array:2 [▼ 
     0 => Option {#435 ▼ 
      -id: 91 
      -value: 1 
      -field: Field {#427} 
      -type: "D" 
     } 
     1 => Option {#432 ▼ 
      -id: 92 
      -value: 2 
      -field: Field {#427} 
      -type: "D" 
     } 
     ] 
    } 
    } 
} 
+0

Вы используете двигатель для завивки волос? –

+0

Я использую доктрину и ветку. – strix

+0

Вы подумали об использовании форм [Symfony forms] (http://symfony.com/doc/current/book/forms.html)? – schemar

ответ

0

Довольно простой пример, который вы можете расширить.

{% for f in fields %} 
    {% if f.type == 'select' %} 
     <select> 
     {% for o in f.options %} 
       <option value="{{ o.value }}">{{ o.value }}</option> 
     {% endfor %} 
     </select> 
    {% endif %} 
{% endfor %} 
0

Я нашел решение. Проблема заключалась в том, что Doctrine < 2.5 автоматически загружает все параметры при загрузке полей. Таким образом, мне удалось создать обходной путь:

$formFactory = $builder->getFormFactory(); 
     $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($formFactory) { 
      $form = $event->getForm(); 
      $this->field = $event->getData(); 

      $form->add('options', 'entity', array(
        "class"  => "MyBundle:Option", 
        "property" => "value", 
        'query_builder' => function(EntityRepository $er) { 
         return $er->createQueryBuilder('o') 
          ->where('o.field = :field') 
          ->setParameter('field', $this->field->getName()) 
          ->orderBy('o.value', 'ASC'); 
        }, 
      )); 
     }); 

Более правильным решением было бы ждать Доктрины 2.5, а затем просто использовать новые возможности они предоставляют: выборки = «EAGER» для OneToMany-отношений, но это работает сюда.

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