2012-04-30 6 views
6

Używam klas formularzy do budowania różnych formularzy w moim projekcie.Symfony2 - Jak ustawić i uzyskać opcje przy korzystaniu z klasy formularza?

W pliku typu jednostki, dla funkcji buildForm, jest wtórny parametr „tablicy $ options” (jest to pokazane na oficjalnej Symfony 2 dokumentacji, ale nie wspomniał, nigdy!)

mam wprowadziłem tablicę do funkcji createForm w moim kontrolerze, ale teraz jestem całkowicie zaskoczony, jak odzyskać zapisane wartości?

$form = $this->createForm(new ProductType(array(), array('id' => '2')), $product); 

Jedyne co znalazłem o uzyskanie opcji jest za pomocą funkcji getOption(), ale nie istnieje w Symfony 2 (post znalazłem był od 2010 roku).

Próbowałem za pomocą:

$id = $options['id']; 

Ale gdy próbuję użyć $ id wszędzie, pojawia się błąd:

Notice: Undefined index: id

Co daje?

Jak mogę odzyskać moje wartości z tablicy $ options? Czy w pierwszej kolejności ustawiam je poprawnie?

EDIT - Więcej kod:

Formularz Klasa

<?php 

namespace DEMO\DemoBundle\Form\Product; 

use Doctrine\ORM\EntityRepository; 
use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilder; 

class ProductType extends AbstractType 
{ 
    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $builder 
      ->add('name') 
      ->add('slug') 
      ->add('reference') 
      ->add('description') 
      ->add('active_from') 
      ->add('active_till') 
      ->add('is_active') 
      ->add('category', 'entity', array(
       'class' => 'DEMO\DemoBundle\Entity\Product\ProductCategory', 
       'query_builder' => function(EntityRepository $er) { 
        return $er->createQueryBuilder('u') 
         ->where('u.section = :id') 
         ->setParameter('id', ***ID VARIABLE NEEDS TO GO HERE***) 
         ->orderBy('u.root', 'ASC') 
         ->addOrderBy('u.lft', 'ASC'); 
       }, 
       'empty_value' => 'Choose an option', 
       'property' => 'indentedName', 
      )); 
    } 

    public function getDefaultOptions() 
    { 
     return array(
      'data_class' => 'DEMO\DemoBundle\Entity\Product\Product' 
     ); 
    } 

    public function getName() 
    { 
     return 'demo_demobundle_product_type'; 
    } 
} 

Odpowiedz

1

Cóż, okaże s out, odpowiedź Gregoires była bardzo blisko, ale dała mi i błąd "Undefined variable", gdy próbowałem faktycznie, ale zmienną do funkcji createQueryBuilder.

Spędziłem chwilę próbując dowiedzieć się, dlaczego i znalazłem problem. Trzeba dodać dodatkowy parametr do funkcji w opcji „query_builder”, takie jak:

'query_builder' => function(EntityRepository $er) use ($options) { 
        return $er->createQueryBuilder('u') 
         ->where('u.section = :id') 
         ->setParameter('id', $options['id']) 
         ->orderBy('u.root', 'ASC') 
         ->addOrderBy('u.lft', 'ASC'); 
       }, 

Magia ustawień będący „zastosowanie ($ options)”. Pozwala to z powodzeniem używać $ options ['id'] w Kreatorze zapytań.

+0

To była moja odpowiedź, nie greg0ires ... – Flukey

+0

Niestety, jest to zaimplementowane z greg0ires odpowiedzią, skopiowałem kod niepoprawnie. Zmieniono to, aby to wyczyścić –

+0

ok :) dzięki za wyczyszczenie go – Flukey

16

Chyba nie jesteś odpowiednio ustawiając je w pierwszej kolejności. Miałeś dać je jako trzeci argument createForm()

EDIT: Oto jak klasa forma może wyglądać:

<?php 
namespace DEMO\DemoBundle\Form\Product; 

use Doctrine\ORM\EntityRepository; 
use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilder; 

class ProductType extends AbstractType 
{ 
    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $builder 
      ->add('name') 
      ->add('slug') 
      ->add('reference') 
      ->add('description') 
      ->add('active_from') 
      ->add('active_till') 
      ->add('is_active') 
      ->add('category', 'entity', array(
       'class' => 'DEMO\DemoBundle\Entity\Product\ProductCategory', 
       'query_builder' => function(EntityRepository $er) use($options) { 
        return $er->createQueryBuilder('u') 
         ->where('u.section = :id') 
         ->setParameter('id', $options['id']) 
         ->orderBy('u.root', 'ASC') 
         ->addOrderBy('u.lft', 'ASC'); 
       }, 
       'empty_value' => 'Choose an option', 
       'property' => 'indentedName', 
      )); 
    } 

    public function getDefaultOptions() 
    { 
     return array(
      'data_class' => 'DEMO\DemoBundle\Entity\Product\Product', 
      'id'   => null 
     ); 
    } 

    public function getName() 
    { 
     return 'demo_demobundle_product_type'; 
    } 
} 
+1

I że trzecią opcją dla createForm() jest ustawienie opcji takich jak: "attr", "by_reference", "cascade_validation", "csrf_field_name", "csrf_protection", "csrf_provider", "data", "data_class", "disabled", "empty_data", "error_bubbling", "error_delay", "error_mapping", "error_type", "field_error_type", "help_block" "," help_inline "itp. (w zasadzie próbowałem i mówi" opcja "id" nie istnieje.)) –

+0

Możesz dostosować metodę getDefaultOptions() swojej klasy formularza, aby przekazać formularz dotyczący tej opcji i uniknąć ta wiadomość. – greg0ire

+1

Tbh, naprawdę nie chcę "hakować" żadnej z podstawowych struktur. Funkcja buildForm() wyraźnie ma dodatkowy parametr do ustawienia tablicy opcji. Chcę wiedzieć, w jaki sposób jest właściwie wykorzystywany. –

1

Przepuścić przez opcje form klasa __construct metody, tak jak poniżej:

use Doctrine\ORM\EntityRepository; 
use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilder; 

class ProductType extends AbstractType 
{ 

    private $options = array(); 
    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $builder 
      ->add('name') 
      ->add('slug') 
      ->add('reference') 
      ->add('description') 
      ->add('active_from') 
      ->add('active_till') 
      ->add('is_active') 
      ->add('category', 'entity', array(
       'class' => 'DEMO\DemoBundle\Entity\Product\ProductCategory', 
       'query_builder' => function(EntityRepository $er) { 
        return $er->createQueryBuilder('u') 
         ->where('u.section = :id') 
         ->setParameter('id', $this->options['id']) 
         ->orderBy('u.root', 'ASC') 
         ->addOrderBy('u.lft', 'ASC'); 
       }, 
       'empty_value' => 'Choose an option', 
       'property' => 'indentedName', 
      )); 
    } 

    public function getDefaultOptions() 
    { 
     return array(
      'data_class' => 'DEMO\DemoBundle\Entity\Product\Product' 
     ); 
    } 

    public function getName() 
    { 
     return 'demo_demobundle_product_type'; 
    } 

    public function __construct(array $options) 
    { 
     $this->options = $options; 
    } 
} 

a następnie można zrobić:

new ProductType(array('id'=>1)); 
+0

Próbowałem tej metody, a skończyłem z błędem" Niezdefiniowana zmienna ". Skopiowałem to dokładnie, więc nie mogę się domyślić, dlaczego dostaję tego błędu, ponieważ o ile mi chodzi, zmienna IS jest ustawiana ... –

+1

dodanie "użyj ($ this)" powinno prawdopodobnie zdziałać – greg0ire

+0

Haha, tak , już zorientowałem się, że kilka dni temu, sprawdź moją odpowiedź :) Dziękujemy za pomoc! –

5

Dobrze acording do tego Google Groups

"greg0ire" miał rację, faktycznie Próbowałem ją i działa perfect !!!. Powiedziałeś: "Naprawdę nie chcę" hakować "żadnej z podstawowych struktur", ale w końcu nie używasz najlepszego podejścia. W rzeczywistości, z mojego punktu widzenia, w końcu robisz to, czego nie zrobiłeś. chcę zrobić.

Więc w końcu trzeba to zrobić:

na formType

public function buildForm(FormBuilder $builder, array $options) 
{ 
    $builder 
     ->add('name') 
     ->add('slug') 
     ->add('reference') 
     ->add('description') 
     ->add('active_from') 
     ->add('active_till') 
     ->add('is_active') 
     ->add('category', 'entity', array(
      'class' => 'DEMO\DemoBundle\Entity\Product\ProductCategory', 
      'query_builder' => function(EntityRepository $er) { 
       return $er->createQueryBuilder('u') 
        ->where('u.section = :id') 
        ->setParameter('id', $options['id']) 
        ->orderBy('u.root', 'ASC') 
        ->addOrderBy('u.lft', 'ASC'); 
      }, 
      'empty_value' => 'Choose an option', 
      'property' => 'indentedName', 
     )); 
} 

public function getDefaultOptions() 
{ 
    return array(
     'data_class' => 'DEMO\DemoBundle\Entity\Product\Product' 
     'id' => null 
    ); 
} 

iw sterowniku

$form = $this->createForm(new ProductType(), $product, array('id' => $id)); 
7

Pokażę ci, co pracowali dla mnie

W kontrolerze:

$form = $this->createForm(new UsersType(), $entity, array(
    'attr' => array('locationId' => $currentLocationId))); 

W FormType:

->add('location', 'entity', array(
     'class' => 'Ro\RoinventBundle\Entity\Locations', 
     'query_builder' => function (\Doctrine\ORM\EntityRepository $er) use ($options) 
     { 
      if (isset($options['attr']['locationId']) && ($options['attr']['locationId'] != NULL)) 
      { 
       return $er->createQueryBuilder('Locations') 
        ->where('Locations.id = :param') 
        ->setParameter('param', $options['attr']['locationId']); 
      } 
      //else do what you want 
}, 
)); 
7

Widocznie to nie z getDefaultOptions() już, ale z setDefaultOptions().

Inaczej mówi

The option "my_custom_option" does not exist. Known options are: "action", "attr", "auto_initialize", ...

Więc dla mnie miałem zaktualizować setDefaultOptions jak to:

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array('my_custom_option' => false)); 
    // Others if needed, like in the documentation for : 'data_class' => 'VENDOR\Bundle\Entity\MyEntity', 'csrf_protection' => true 
} 

a następnie można je odzyskać w metodzie buildForm

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $myCustomOption = $options['my_custom_option']; 
} 
Powiązane problemy