我需要一些帮助来了解如何使用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 =>设置默认值。如果点击“添加新书出售”路径并预订=>交易,如果点击“添加新书交易”路径。
答案 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())
);
}