2013-10-07 3 views
0

Je dois modifier un site Web qui utilise différents types pour générer des formulaires. Il est en Bundle/Form/dossier 2 fichiers:Bonnes pratiques à l'aide de formulaires

  • ProductType.php
  • ProductEditType.php

Il fonctionne très bien, le premier est utilisé pour générer la nouvelle forme de produit et le second un le formulaire pour l'éditer.

Près de 95% des deux fichiers sont identiques, donc je suppose qu'il doit exister n'importe quel moyen d'utiliser un type pour générer plus d'un formulaire.

J'ai lu sur la façon de modifier des formes en utilisant des événements de forme, mais je n'ai pas trouvé clairement quelle est la bonne pratique générale à ce sujet.

Merci beaucoup.

Mise à jour

j'ai écrit un abonné de l'événement comme suit.

<?php 
namespace Project\MyBundle\Form\EventListener; 

use Symfony\Component\Form\FormEvent; 
use Symfony\Component\Form\FormEvents; 
use Symfony\Component\EventDispatcher\EventSubscriberInterface; 

/** 
* Description of ProductTypeOptionsSubscriber 
* 
* @author Javi 
*/ 
class ProductTypeOptionsSubscriber implements EventSubscriberInterface 
{ 
    public static function getSubscribedEvents() { 
     return array(FormEvents::PRE_SET_DATA => 'preSetData'); 
} 

public function preSetData(FormEvent $event){ 

    $data = $event->getData(); 
    $form = $event->getForm(); 

    if(!$data || !$data->getId()){ 
     // No ID, it's a new product 
     //.... some code for other options ..... 
     $form->add('submit','submit', 
      array(
       'label' => 'New Produtc', 
       'attr' => array('class' => 'btn btn-primary') 
       )); 
    }else{ 
     // ID exists, generating edit options ..... 
     $form->add('submit','submit', 
      array(
       'label' => 'Update Product', 
       'attr' => array('class' => 'btn btn-primary') 
       )); 
    } 

} 
} 

En ProductType, à l'intérieur buildForm:

$builder->addEventSubscriber(new ProductTypeOptionsSubscriber()); 

Alors voilà tout, il était très facile d'écrire et il fonctionne très bien.

Répondre

0

Vous pouvez lire ce livre de cuisine event subscriber, le premier scénario peut faire pour vous.

Revenant à l'exemple de la documentation ..

Ajoutez les champs que vous voulez d'être ainsi modifié:

$builder->addEventSubscriber(new AddNameFieldSubscriber()); 

Ensuite, créez l'abonné événement de l'événement en entrant votre logique:

// src/Acme/DemoBundle/Form/EventListener/AddNameFieldSubscriber.php 
namespace Acme\DemoBundle\Form\EventListener; 

use Symfony\Component\Form\FormEvent; 
use Symfony\Component\Form\FormEvents; 
use Symfony\Component\EventDispatcher\EventSubscriberInterface; 

class AddNameFieldSubscriber implements EventSubscriberInterface 
{ 
    public static function getSubscribedEvents() 
    { 
     // Tells the dispatcher that you want to listen on the form.pre_set_data 
     // event and that the preSetData method should be called. 
     return array(FormEvents::PRE_SET_DATA => 'preSetData'); 
    } 

    public function preSetData(FormEvent $event) 
    { 
     $data = $event->getData(); 
     $form = $event->getForm(); 

     // check if the product object is "new" 
     // If you didn't pass any data to the form, the data is "null". 
     // This should be considered a new "Product" 
     if (!$data || !$data->getId()) { 
      $form->add('name', 'text'); 
      .... 
      ..... // other fields 
     } 
    } 
} 
+0

Merci, je vais jeter un oeil. – Javi