使用eventListener Symfony在表单中添加字段

时间:2017-01-24 14:47:59

标签: php forms symfony

我需要一些帮助来了解如何使用Symfony的eventListener。 所以,我在我的索引中有两个按钮“添加新书来销售”和“添加新书来交易”以指导相同形式的BookType。 我的问题是:如果点击“添加新书出售”路径=>在表单中添加价格字段。 我为我的项目尝试了this,但它仍然无效。 我还为BookType构建了一个personnal表单。

这里是BookType表单的代码:

    public function buildForm(FormBuilderInterface $builder, array $options)  {

        $builder->add('titreOuvrage',TextType::class,array('label'=>'Nom de l\'ouvrage','attr'=>array('class'=>'form-control')))
                ->add('resumeOuvrage',TextareaType::class,array('label'=>'Résumé de l\'ouvrage','attr'=>array('class'=>'form-control')))
                ->add('auteur', CollectionType::class, array('entry_type'=>AuteursType::class, 'allow_add'=>true, 'allow_delete'=>true))
                ->add('editeur',EntityType::class,array('label'=>'Sélectionnez l\'éditeur','attr'=>array('class'=>'form-control'),'class'=>'SB\MainBundle\Entity\Editeurs','choice_label'=>'libelle_editeur'))
                ->add('etat',EntityType::class,array('label'=>'Cochez l\'état dans lequel se trouve votre ouvrage','class'=>'SB\MainBundle\Entity\EtatsOuvrages','choice_label'=>'libelle_etat','expanded'=>true))
                ->add('categorie',EntityType::class,array('label'=>'Selectionnez une catégorie','attr'=>array('class'=>'form-control'),'class'=>'SB\MainBundle\Entity\Categories','choice_label'=>'libelle_categorie'))
                ->add('genre',EntityType::class,array('label'=>'Cochez un ou plusieurs genre','class'=>'SB\MainBundle\Entity\Genres','choice_label'=>'libelle_genre','multiple'=>true,'expanded'=>true))
//                ->add('photosOuvragePath')
                ->add('photosOuvrageFile',FileType::class,array('label'=>'Ajouter des photos'))
                ->add('statutOuvrage',EntityType::class,array('label'=>'Que voulez-vous faire de l\'ouvrage','attr'=>array('class'=>'form-control'),'class'=>'SB\MainBundle\Entity\StatutsOuvrages','choice_label'=>'libelle_statut'));
        // doc : http://symfony.com/doc/2.8/form/dynamic_form_modification.html#form-events-underlying-data
        $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event, Request $request) {
            //$prix = $event->getData();
            $form = $event->getForm();
            $route = $request->attributes->get('sb_main_create_ouvrage_vente');
            // on va afficher le champ du prix seulement si on est dans le formulaire de vente
            if ($route) {
                $form->add('prixOuvrage',
                            TextType::class,
                            array('label'=>'Entrez le prix de vente','attr'=>array('class'=>'form-control')));
            }
        })
        ;
    }

另外,如果它不起作用,我想知道如何在控制器函数中为set book =>设置默认值。如果点击“添加新书出售”路径并预订=>交易,如果点击“添加新书交易”路径。

2 个答案:

答案 0 :(得分:0)

您可以在options数组中放置一个属性并在buildForm中读取它:

class BookType
{
    public function buildForm(FormBuilderInterface $builder, array $options)  {

        $builder->add('titreOuvrage',TextType::class,array('label'=>'Nom de l\'ouvrage','attr'=>array('class'=>'form-control')))
            ->add('resumeOuvrage',TextareaType::class,array('label'=>'Résumé de l\'ouvrage','attr'=>array('class'=>'form-control')))
            ->add('auteur', CollectionType::class, array('entry_type'=>AuteursType::class, 'allow_add'=>true, 'allow_delete'=>true))
            ->add('editeur',EntityType::class,array('label'=>'Sélectionnez l\'éditeur','attr'=>array('class'=>'form-control'),'class'=>'SB\MainBundle\Entity\Editeurs','choice_label'=>'libelle_editeur'))
            ->add('etat',EntityType::class,array('label'=>'Cochez l\'état dans lequel se trouve votre ouvrage','class'=>'SB\MainBundle\Entity\EtatsOuvrages','choice_label'=>'libelle_etat','expanded'=>true))
            ->add('categorie',EntityType::class,array('label'=>'Selectionnez une catégorie','attr'=>array('class'=>'form-control'),'class'=>'SB\MainBundle\Entity\Categories','choice_label'=>'libelle_categorie'))
            ->add('genre',EntityType::class,array('label'=>'Cochez un ou plusieurs genre','class'=>'SB\MainBundle\Entity\Genres','choice_label'=>'libelle_genre','multiple'=>true,'expanded'=>true))
//                ->add('photosOuvragePath')
            ->add('photosOuvrageFile',FileType::class,array('label'=>'Ajouter des photos'))
            ->add('statutOuvrage',EntityType::class,array('label'=>'Que voulez-vous faire de l\'ouvrage','attr'=>array('class'=>'form-control'),'class'=>'SB\MainBundle\Entity\StatutsOuvrages','choice_label'=>'libelle_statut'));

        if($options["booktype"] == "sell"){
            $builder->add('prixOuvrage',
                TextType::class,
                array('label'=>'Entrez le prix de vente','attr'=>array('class'=>'form-control')));
        }

    }

    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'booktype' => 'sell',
        ));
    }
}

在控制器中,您可以调用不同的操作路径

$this->createForm(BookType::class, $book, array("booktype" => "trade"));

$this->createForm(BookType::class, $book, array("booktype" => "sell"));

答案 1 :(得分:0)

使用映射的超类,你应该有这样的实体:

超类书

/**
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="type", type="string")
* @ORM\Table(name="book")
*/
abstract class Book
{
    /**
     * @ORM\Column(type="string", length=255)
     */
    protected $titreOuvrage;

    /**
     * @ORM\Column(type="string", length=255)
     */
    protected $resumeOuvrage;

//...other variables
    /**
     * @return mixed
     */
    public function getTitreOuvrage()
    {
        return $this->titreOuvrage;
    }

    /**
     * @param mixed $titreOuvrage
     */
    public function setTitreOuvrage($titreOuvrage)
    {
        $this->titreOuvrage = $titreOuvrage;
    }

    /**
     * @return mixed
     */
    public function getResumeOuvrage()
    {
        return $this->resumeOuvrage;
    }

    /**
     * @param mixed $resumeOuvrage
     */
    public function setResumeOuvrage($resumeOuvrage)
    {
        $this->resumeOuvrage = $resumeOuvrage;
    }
}

TradeBook实体只扩展了超类:

/**
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks()
 * @ORM\Table(name="book_tradebook")
 */
class TradeBook extends Book
{

}

和带有附加变量的SellBook实体:

/**
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks()
 * @ORM\Table(name="book_sellbook")
 */
class SellBook extends Book
{
    /**
     * @ORM\Column(type="string", length=255)
     */
    protected $prixOuvrage;

    /**
     * @return mixed
     */
    public function getPrixOuvrage()
    {
        return $this->prixOuvrage;
    }

    /**
     * @param mixed $prixOuvrage
     */
    public function setPrixOuvrage($prixOuvrage)
    {
        $this->prixOuvrage = $prixOuvrage;
    }


}

在FormType中,您可以询问给定的data_class:

class BookType  extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)  {

        $builder->add('titreOuvrage',TextType::class,array('label'=>'Nom de l\'ouvrage','attr'=>array('class'=>'form-control')))
            ->add('resumeOuvrage',TextareaType::class,array('label'=>'Résumé de l\'ouvrage','attr'=>array('class'=>'form-control')));
            ->add('auteur', CollectionType::class, array('entry_type'=>AuteursType::class, 'allow_add'=>true, 'allow_delete'=>true))
            ->add('editeur',EntityType::class,array('label'=>'Sélectionnez l\'éditeur','attr'=>array('class'=>'form-control'),'class'=>'SB\MainBundle\Entity\Editeurs','choice_label'=>'libelle_editeur'))
            ->add('etat',EntityType::class,array('label'=>'Cochez l\'état dans lequel se trouve votre ouvrage','class'=>'SB\MainBundle\Entity\EtatsOuvrages','choice_label'=>'libelle_etat','expanded'=>true))
            ->add('categorie',EntityType::class,array('label'=>'Selectionnez une catégorie','attr'=>array('class'=>'form-control'),'class'=>'SB\MainBundle\Entity\Categories','choice_label'=>'libelle_categorie'))
            ->add('genre',EntityType::class,array('label'=>'Cochez un ou plusieurs genre','class'=>'SB\MainBundle\Entity\Genres','choice_label'=>'libelle_genre','multiple'=>true,'expanded'=>true))
//                ->add('photosOuvragePath')
            ->add('photosOuvrageFile',FileType::class,array('label'=>'Ajouter des photos'))
            ->add('statutOuvrage',EntityType::class,array('label'=>'Que voulez-vous faire de l\'ouvrage','attr'=>array('class'=>'form-control'),'class'=>'SB\MainBundle\Entity\StatutsOuvrages','choice_label'=>'libelle_statut'));

        if($options["data_class"] == SellBook::class){
            $builder->add('prixOuvrage',
                TextType::class,
                array('label'=>'Entrez le prix de vente','attr'=>array('class'=>'form-control')));
        }

    }


}

在控制器中,您可以使用2个操作:

   /**
     * @Route("/sell", name="book_sell")
     */
    public function newSellBookAction(){

        $book = new SellBook();
        $form = $this->createForm(BookType::class, $book);
        return $this->render(
            'AppBundle:book.create.html.twig',
            array("form" => $form->createView())
        );
    }

    /**
     * @Route("/trade", name="book_trade")
     */
    public function newTradeBookAction(){
        $book = new TradeBook();
        $form = $this->createForm(BookType::class, $book);
        return $this->render(
            'AppBundle:book.create.html.twig',
            array("form" => $form->createView())
        );
    }