2017-01-24 4 views
1

Ich brauche etwas Hilfe, um zu verstehen, wie man den EventListener von Symfony verwendet. Also, ich habe zwei Schaltflächen "Neues Buch zum Verkauf hinzufügen" und "Neues Buch zum Handeln hinzufügen" in meinem Index zu steuern auf der gleichen Form von BookType. Mein Problem ist: wenn klicken Sie auf "neues Buch zum Verkauf hinzufügen" path => fügen Sie das Preisfeld in Form. Ich versuche this für mein Projekt, aber es funktioniert immer noch nicht. Auch ich baue ein persönliches Formular für den BookType.Feld in Formular mit EventListener hinzufügen Symfony

Hier ist mein Code für die Booktype Form:

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

Auch, wenn es nicht funktioniert ist, würde ich gerne wissen, wie in einer Reglerfunktion für Satz Buch einen Standardwert gesetzt = > verkaufe, wenn du auf "Neues Buch zum Verkauf hinzufügen" klickst und buche => Handel, wenn du auf "Neues Buch zum Handeln hinzufügen" klickst.

+0

Nachdem mit Formularereignissen zu behandeln ist ein Grund, warum ich mit der Formularkomponente gestoppt. Ich bin ziemlich zuversichtlich, dass $ Anfrage nicht verfügbar sein wird. – Cerad

+0

Ja, $ Anfrage ist nicht verfügbar, jetzt weiß ich das. Danke. – Tirkal

Antwort

0

können Sie ein Attribut in der Optionen-Array setzen und es in buildForm lesen:

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

und in der Steuerung Sie in verschiedenen Handlungswege nennen

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

oder

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

Haben Sie die Zeile aus dem obigen Code mit public function configureOptions (OptionsResolver $ Resolver) { $ Resolver-> setDefaults (array ( 'Booktype' => 'verkaufen', )) hinzugefügt; } –

+0

Danke, für Ihre Antwort;). Es ist Arbeit für "neues Buch zum Verkauf hinzufügen", aber wenn ich auf "neues Buch zum Handeln hinzufügen" klicke, habe ich folgendes Problem: Weder die Eigenschaft "prixOuvrage" noch eine der Methoden "prixOuvrage()", "getprixOuvrage()"/"isprixOuvrage()" oder "__call()" existieren und haben öffentlichen Zugriff. Wenn ich das div mit from.prixOuvrage in meiner Form kommentiere, ist es Arbeit, aber ich will es nicht tun. – Tirkal

+0

verwenden Sie die gleiche Entität für beide Buchtypen? Die Buch-Entität muss auch die Variable prixOuvrage haben –

0

Bei Verwendung von zugeordneten Superklassen sollten Sie Entitäten wie folgt haben:

Das Super Buch

/** 
* @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; 
    } 
} 

Die TRADEBOOK Einheit, welche die übergeordnete Klasse erweitert gerade:

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

} 

und die SellBook Einheit mit zusätzlichen Variable:

/** 
* @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; 
    } 


} 

In Ihrem Formtype können Sie fragen für die gegebene 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'))); 
     } 

    } 


} 

Und in der Steuerung Sie 2 Aktionen verwenden:

/** 
    * @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()) 
     ); 
    } 
+0

Es gibt zwei Entitäten bei der Datenbankerstellung? Oder jemand, der diese zwei Typen hat? – Tirkal

+0

3 Datenbanktabellen werden generiert, eine Tabelle "book", die die Daten enthält, die beide Buchtypen gemeinsam haben und eine "type" Spalte, die die Information enthält, welcher buchtyp es ist (definiert mit @ORM \ DiscriminatorColumn (name = "type") , type = "string")). die Tabelle "book_tradebook", die nur die ID von "book" haben sollte und die Tabelle "book_sellbook", die eine zusätzliche Spalte für Ihr "prixOuvrage" hat. –

+0

Aber Sie können z. einfach alle SellBook Entities im Controller mit $ this-> getDoctrine() abrufen -> getManager() -> getRepository (SellBook :: class) -> findAll(); –

Verwandte Themen