2014-02-03 5 views
1

Возможно, есть совершенно другой и лучший подход к тому, что мне нужно, но вот моя ситуация и любые комментарии/предложения приветствуются. У меня есть Entity с:Symfony2 Форма Коллекция 3-го уровня не отображается

/** 
* @var string 
* @ORM\Column(name="title", type="string", length=255, nullable=true) 
*/ 
protected $title; 

/** 
* @var string 
* @ORM\Column(name="description", type="string", length=1024, nullable=true) 
*/ 
protected $description; 

/** 
* @var string 
* @ORM\Column(name="extra_data", type="json_array", nullable=true) 
*/ 
protected $extraData; 

Уведомление $extraData - это все об этом json_array.

У меня есть FormType:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder->add('items', 'collection', array(
     'type' => new ItemType(), 
     'allow_add' => true, 
     'by_reference' => false, 
     'allow_delete' => true, 
     'options' => array(
      'em' => $options['em'], 
     ) 
    )); 
} 


public function getName() 
{ 
    return 'form'; 
} 

ItemType:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('title', 'text', array(
      'label' => false, 
      'required' => false, 
     )) 
     ->add('description', 'textarea', array(
      'label' => false, 
     )) 
     ->add('extra_data', 'collection', array(
      'type' => new ItemExtraDataType(), 
      'required' => false, 
      'allow_add' => false, 
      'by_reference' => false, 
      'allow_delete' => false, 
     )); 
} 

public function getName() 
{ 
    return 'item'; 
} 

ItemExtraDataType:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder->add('field1', 'text', array(
      'required' => false, 
     )) 
     ->add('field2', 'text', array(
      'required' => false, 
     )); 
} 

public function getName() 
{ 
    return 'item_extra_data'; 
} 

В Twig:

<form method="post" action="" id="form"> 
{% for item in form.items %} 
    {{ form_row(item.title) }} 
    {{ form_row(item.description) }} 
    {{ form_row(item.extra_data) }} 
    {{ form_rest(item) }} 
{% endfor %} 
{{ form_rest(form) }} 
</form> 

Также попробовал:

{% for field, value in item.extra_data %} 
{{ form_row(value) }}<br><br> 
{% endfor %} 

А также попытался просто оставить {{ form_rest(item) }}, но никаких изменений.

Так field1 и field2 никогда не распечатывается. Я не могу ввести значения для этих полей массива JSON. Может быть, я использую это неправильно? Также мне интересно, как работает это поле json_array.

P.S. Использование Symfony 2.3.7

ответ

0

Bellow Я оставляю старый ответ, который работал на меня, пока мне не пришлось реализовать более сложный json_array. Вот как это должно быть сделано:

ItemType:

->add('extra_data', new ItemExtraDataType(), array(
    'label' => false, 
    'required' => false, 
)) 

ItemExtraDataType:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('field1', 'text', array(
      'required' => false, 
      'label' => false, 
     )) 
     ->add('field2', 'text', array(
      'required' => false, 
      'label' => false, 
     )) 
     ->add('field3', 'choice', array(
      'choices' => MyChoices::getReadables(), 
      'empty_value' => 'empty', 
      'required' => false, 
      'label' => false, 
     )) 
    ; 
} 

public function getParent() 
{ 
    return 'form'; 
} 

Twig шаблона:

{{ form_row(item.extra_data) }} 

Так что теперь все работает, как ожидалось.



Старый ответ

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

Entity:

/** 
* @param array $extra_data 
* @return Entity 
*/ 
public function setExtraData(array $extra_data) 
{ 
    $this->extraData = $extra_data; 
    return $this; 
} 

/** 
* @return array 
*/ 
public function getExtraData() 
{ 
    $rs = $this->extraData; 
    return $rs ?: array('field1' => '', 'field2' => ''); 
} 

ItemType (обратите внимание на type параметров):

->add('extra_data', 'collection', array(
    'type' => 'text', 
    'label' => false, 
    'required' => false, 
    'allow_add' => false, 
    'by_reference' => false, 
    'allow_delete' => false, 
)) 

Twig шаблона:

{% for field, data in item.extra_data %} 
    {{ form_row(data, {'attr':{'placeholder':'extra_data.' ~ field}}) }} 
{% endfor %} 

Оба поля распечатаны и сохранены без каких-либо проблем.

+0

Так что это не работает для меня больше, потому что теперь мне нужно 'field3' в extra_data как' choice' type – CRONUS