2016-08-09 11 views
2

Ich habe 2 Einheiten: Tarifa und TarifaPeso (dieser muss 20 Mal in Tarifa erscheinen).Wie man ein Formular mehrmals in Symfony einbettet

Die Beziehung in Tarifa ist:

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

ich einbetten habe das Formular als Symfony2 doc sagt, und alles ist in Ordnung, aber ich will es nicht dinamically tun, es hat nur 20-mal erscheinen. Tarifa ist also eine Form und muss 20 TarifaPeso-Form eingebettet haben.

Wissen Sie, wie das geht? Danke

+0

Anstatt Entity-Klasse "Tarifa" als zugrunde liegende Datenklasse für das Formular zu verwenden, machen Sie ano Dazu zwei Klassen, sagen "[Ihr Bündel]/Form/Model/Tarifa" und "[Ihr Bündel]/Form/Model/TarifaPeso". Dann fügen Sie TarifaPeso 20 Fälle zu Tarifa hinzu und zeigen das Formular an. Wenn das Formular abgeschickt wird, wählen Sie alle Daten aus Tarifa, instanziieren und speichern Sie Ihre Entitäten. Machen Sie einen Service dafür, tun Sie es nicht im Controller. –

Antwort

0

Endlich habe ich diese im Konstruktor des Formulars Klasse Eltern getan (in der Einheit):

$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); 
    } 

mit $ KILOS:

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); 

Auf diese Weise ich die Form ändern mit ein eventListener auf diese Weise:

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

Da Sie eine @ORM\OneToMany Vereinigung unterhalten, sollte Collection Field Type Ihren Zweck lösen. Sie müssen nur 20 Instanzen von TarifaPeso mit Tarifa Entität verknüpfen, bevor Sie das Formular generieren.

See here wie Sie den Sammlungsformtyp einbetten.

Stellen Sie sicher, cascade-persist von Tarifa Entity aktiviert haben für automatisch insert oder updateTarifaPeso Einheiten.

Aus meiner Erfahrung mit Collection Feldtypen. Dies wird hinsichtlich der Datenintegrität schneller und einfacher.

Verwandte Themen