2016-12-12 1 views
1

Lassen Sie sich diese Form:Symfony2 Wahl Formulardaten von ORM

class ScanType extends AbstractType 
{ 
     public function buildForm(FormBuilderInterface $builder, array $options) 
     { 
       $builder->add('scantarget', 'entity', array(
             'class' => 'AppBundle:Website', 
             'property' => 'url' 
             )); 
     } 


     public function getDefaultOptions(array $options) { 
     return array(
      'data_class' => 'AppBundle\Entity\Website', 
     ); 
    } 


} 

Du möchtest mit nur URLs für die jeweilige Benutzer-ID

In der Steuerung füllen:

  /** 
     * @Route("/verification-ok", name="verifyurlok") 
     */ 
     public function verifyurlActionOK(Request $request) 
     { 
       $user = $this->getUser(); 



       if($user) 
       { 
         $userid=$user->getId(); 

         $websites = $this->getDoctrine()->getRepository('AppBundle:Website')->findByUser($userid); 


         $form = $this->createForm(ScanType::class, $websites); 

jedoch die $ Websites werden nicht ordnungsgemäß an FormBuilder übergeben und in meinem Select-Feld werden alle Einträge angezeigt :(Alle möglichen Werte für Website-Entität.

Wie zeigt man nur übermittelte $ -Webseiten im Formular an (Auswahlfeld)? Also nur Webseiten für eine bestimmte Benutzer-ID?

Danke,

Update 1

Formular

<?php 

namespace AppBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolver; 
use Symfony\Component\Form\Extension\Core\Type\EmailType; 
use Symfony\Component\Form\Extension\Core\Type\TextType; 
use Symfony\Component\Form\Extension\Core\Type\RepeatedType; 
use Symfony\Component\Form\Extension\Core\Type\PasswordType; 
use Symfony\Component\Form\Extension\Core\Type\ChoiceType; 
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; 
use Symfony\Component\Form\FormEvent; 
use Symfony\Component\Form\FormEvents; 

class ScanType extends AbstractType 
{ 

private $tokenStorage; 

    public function __construct(TokenStorageInterface $tokenStorage) 
    { 
       $this->tokenStorage = $tokenStorage; 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
       $user = $this->tokenStorage->getToken()->getUser(); 
       if (!$user) { 
        throw new \LogicException(
        'The FriendMessageFormType cannot be used without an authenticated user!' 
        ); 
       } 


       $builder->addEventListener(
       FormEvents::PRE_SET_DATA, 
       function (FormEvent $event) use ($user) { 
       $form = $event->getForm(); 

       $formOptions = array(
        'class' => 'AppBundle\Entity\Website', 
        'property' => 'user', 
        'query_builder' => function (EntityRepository $er) use ($user) { 
         // build a custom query 
         return $er->createQueryBuilder('u')->addOrderBy('user', 'DESC'); 

         // or call a method on your repository that returns the query builder 
         // the $er is an instance of your UserRepository 
         // return $er->createOrderByFullNameQueryBuilder(); 
        }, 
       ); 

       // create the field, this is similar the $builder->add() 
       // field name, field type, data, options 
       $form->add('url', ScanType::class, $formOptions); 
      } 
     ); 
    } 


     public function getDefaultOptions(array $options) { 
     return array(
      'data_class' => 'AppBundle\Entity\Website', 
     ); 
    } 


} 

Controller:

$form = $this->createForm(ScanType::class); 

config.yml

services: 
    app.form.scan: 
     class: AppBundle\Form\ScanType 
     arguments: ['@security.token_storage'] 
     tags: 
      - { name: form.type } 

Leider erhalten diese Fehlermeldung:

request.CRITICAL: Uncaught PHP Exception Symfony\Component\OptionsResolver\Exception\UndefinedOptionsException: "The options "class", "property", "query_builder" do not exist. Defined options are: "action", "allow_extra_fields", "attr", "auto_initialize", "block_name", "by_reference", 

Lösung:

Dank @Medard

Form:

<?php 

namespace AppBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolver; 
use Symfony\Component\Form\Extension\Core\Type\EmailType; 
use Symfony\Component\Form\Extension\Core\Type\TextType; 
use Symfony\Component\Form\Extension\Core\Type\RepeatedType; 
use Symfony\Component\Form\Extension\Core\Type\PasswordType; 
use Symfony\Component\Form\Extension\Core\Type\ChoiceType; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

class ScanType extends AbstractType 
{  
      private $websites; 


      public function buildForm(FormBuilderInterface $builder, array $options) 
      { 
        $this->websites = $options['trait_choices']; 

        $builder->add('scantarget', 'entity', array(
          'class' => 'AppBundle:Website', 
          'property' => 'url', 
          'choices' => $this->websites 
         )); 
      } 


      public function setDefaultOptions(OptionsResolverInterface $resolver) 
      { 
        $resolver->setDefaults(array(
         'data_class' => null, 
         'trait_choices' => null, 

         )); 
      } 


} 

Controller:

$form = $this->createForm(ScanType::class, $websites, array(
     'trait_choices' => $websites 
    )); 

Funktioniert !!!

Antwort

0

Nun, Sie legen die Auswahl nicht fest. Versuchen Sie folgendes:

class ScanType extends AbstractType 
    {  
      private $websites; 


      public function buildForm(FormBuilderInterface $builder, array $options) 
      { 
       $this->websites = $options['trait_choices']; 

        $builder->add('scantarget', 'entity', array(
          'class' => 'AppBundle:Website', 
          'property' => 'url', 
          'choices' => $this->websites 
         )); 
      } 


      public function setDefaultOptions(array $options) { 
      return array(
       'data_class' => 'AppBundle\Entity\Website', 
       'trait_choices' => null, 
      ); 
     } 


    } 

Im Controller Durchlauf durch die Websites:

$form = $this->createForm(ScanType::class, $websites, array(
     'trait_choices' => $websites, 
    )); 
+0

dies wird wie es ist nicht funktioniert, wird eine Ausnahme ausgelöst, da keine Daten in Konstruktor in seinem Controller gedrückt wird. Plus das ist nicht der richtige Weg, um das zu tun, was benötigt wird. – VaN

+0

Sorry, das war für symfony 2, ich habe meine Antwort bearbeitet – Medard

+0

Danke! hmmm ... Ich brauche es von Symfony2 (2.8) ... leider funktioniert es nicht ... request.CRITICAL: Uncaught PHP Ausnahme Symfony \ Component \ OptionsResolver \ Exception \ UndefinedOptionsException: "Die Option" Websites "existiert nicht. Definierte Optionen sind: "action", "allow_extra_fields" etc. –

0

Ihre Form zeigt alle Website-Einträge, weil Sie nicht diese zu beschränken, wenn das Formular erstellen, in der Methode add() .

Sie sollten diesen Abschnitt fo Kochbuch lesen: http://symfony.com/doc/current/form/dynamic_form_modification.html#form-events-user-data

+0

Danke.Siehe mein Update 1. Ich habe es mit meinem Code aktualisiert.Ich bekomme leider eine Fehlermeldung mit Query_Builder.Wie? kann ich das lösen? Irgendwelche Ideen? –

+0

Eigentlich mit 3 Optionen ... Die Optionen "class", "property", "query_builder" existieren nicht –