2016-08-09 4 views
2

У меня есть 2 объекта: Tarifa и TarifaPeso (этот должен появиться 20 раз в форме Тарифа).Как вставить форму несколько раз в Symfony

Соотношение в Тарифе является:

/** 
* @ORM\OneToMany(targetEntity="TarifaPeso", mappedBy="tarifa", cascade={"persist"}) 
*/ 
private $pesos; 

Я встраивать форму, как Symfony2 док говорит, и все в порядке, но я не хочу, чтобы сделать это динамически, он должен появиться только 20 раз. Таким образом, Тарифа является формой и должна содержать 20 форм TarifaPeso.

Вы знаете, как это сделать? Thanks

+0

Вместо того, чтобы использовать класс объектов «Tarifa» в качестве базового класса данных для формы, вы делаете ano два класса, скажем «[ваш комплект]/Форма/Модель/Тарифа» и «[ваш комплект]/Форма/Модель/TarifaPeso». Затем вы добавляете 20 ТарифаПесо в Тарифа и показываете форму. Когда форма отправлена, выберите все данные из Тарифа, создайте экземпляр и сохраните свои объекты. Сделайте сервис для этого, не делайте этого в контроллере. –

ответ

0

Наконец я сделал это в конструкторе родительского класса формы (в сущности):

$this->envios = new \Doctrine\Common\Collections\ArrayCollection(); 
    for ($i = 0; $i < count(self::$KILOS); $i++) { 
     $peso = new TarifaPeso(); 
     $peso->setKilosMaxlim(self::$KILOS[$i]); 
     $this->addPeso($peso); 
    } 

имея $ килограмм:

private static $KILOS = array(1,2,3,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,300,500,1000,1001); 

Таким образом, я могу изменить форму с eventListener таким образом:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('precio', null, array(
      'attr' => array('autofocus' => true), 
      'label' => 'label.precio ' , 
     )); 
    ; 

    $builder->addEventListener(FormEvents::POST_SET_DATA, function (FormEvent $event) 
    { 
     $form = $event->getForm(); 
     $data = $event->getData(); 
     if ($data) { 
      $valor = $data->getKilosMaxlim(); 

      $field = $form->get('precio'); 
      $config = $field->getConfig(); 
      $options = $config->getOptions(); 
      $options['label'] = 'Valor para '.$valor; // change the label 
      $form->add($field->getName(), $config->getType()->getName(), $options); 
     } 
    }); 
} 
2

Поскольку у вас есть поддержка @ORM\OneToMany, Collection Field Type должен решить вашу цель. Вам просто нужно связать 20 экземпляров TarifaPeso с Tarifa Объект перед созданием формы.

See here как вставить тип формы коллекции.

Убедитесь, что cascade-persist включен из Tarifa Entity для автоматического insert или updateTarifaPeso лиц.

Из моего опыта использования Collection типы полей. Это будет быстрее и проще с точки зрения целостности данных.

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