2016-12-12 2 views
1

имеют такой вид:Symfony2 Выбор формы данных от 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', 
     ); 
    } 


} 

нужно заполнить его только URL для конкретного идентификатора пользователя

В контроллере:

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

Однако $ сайты не переданы должным образом в FormBuilder, и в моем поле «Ящик» я вижу все записи :(Все возможные значения для объекта сайта.

Как отобразить только прошедшие $ веб-сайты в форме (выберите поле)? Так что только веб-сайты для определенного пользователя?

Спасибо,

Update 1

Форма

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


} 

Контроллер:

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

config.yml

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

К сожалению, эта ошибка:

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", 

Решение:

Благодаря @Medard

Форма:

<?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, 

         )); 
      } 


} 

Контроллер:

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

Работы !!!

ответ

0

Ну, вы не устанавливаете выбор. Попробуйте это:

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


    } 

В контроллере проход через веб-сайты:

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

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

+0

К сожалению, это было для symfony 2, я отредактировал мой ответ – Medard

+0

Спасибо! hmmm ... Мне нужно это сделать Symfony2 (2.8) ... к сожалению, это не сработает ... request.CRITICAL: Невыпущен PHP Exception Symfony \ Component \ OptionsResolver \ Exception \ UndefinedOptionsException: «Опция« веб-сайты »не существует. Определенные параметры: «действие», «allow_extra_fields» и т. Д. И т. Д. –

0

Ваша форма отображает все элементы веб-сайта, потому что вы не ограничивая их при создании формы, в надстройке() метод ,

Вы должны прочитать этот раздел Ф.О. поваренной книги: http://symfony.com/doc/current/form/dynamic_form_modification.html#form-events-user-data

+0

Спасибо. Можете ли вы увидеть мое обновление 1. Я обновил его своим кодом. К сожалению, я получаю сообщение об ошибке с query_builder. могу ли я решить это? Любые идеи? –

+0

На самом деле с 3 параметрами ... Параметры «класс», «свойство», «query_builder» не существуют –