2013-10-07 4 views
0

Мне нужно изменить веб-интерфейс, который использует разные типы для создания форм. Существует в Bundle/Форма/папке 2 файла:Передовая практика с использованием форм

  • ProductType.php
  • ProductEditType.php

Это работает отлично, первый один используется для создания новой формы продукта, а второй одну форму для ее редактирования.

Почти 95% обоих файлов одинаковы, поэтому я предполагаю, что он должен существовать любым способом использования одного типа для создания более одной формы.

Я читал о том, как изменять формы, используя события формы, но я не нашел четкого представления об общей хорошей практике.

Большое спасибо.

Update

Я написал Абонент события следующим образом.

<?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') 
       )); 
    } 

} 
} 

В ProductType, внутри buildForm:

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

Так что все, что было очень легко писать, и это работает отлично.

ответ

0

Вы можете прочитать эту поваренную книгу event subscriber, первый сценарий может сделать для вас.

Возвращаясь к примеру документации ..

Добавьте поля, которые вы хотите, чтобы они модифицируются таким образом:

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

Затем создать подписчик события события, введя свою логику:

// 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

Спасибо, я посмотрю. – Javi

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