Symfony 2: Доступ к базе данных внутри FormBuilder - PullRequest
9 голосов
/ 10 декабря 2011

Я строю форму, которая содержит поле с именем 'category', мне нужен список выбора, чтобы сделать это, но я не понимаю, как заполнить этот список выбора несколькими категориями, сохраненными в базе данных.1001 *

public function buildForm(FormBuilder $builder, array $options) {
    $builder -> add('item', 'text', array('label' => 'Item'));
    $builder -> add('category', 'choice', array(
        'choices'   => ???,
        'label' => 'Category'
    ));
}

Как я могу получить категории из базы данных здесь и использовать их для создания моей формы?(кажется, не может получить доступ к $ this-> getDoctrine -> ... внутри этого класса).

Ответы [ 2 ]

15 голосов
/ 10 декабря 2011

Используйте тип entity вместо choice

$builder
  ->add('entity_property', 'entity', array(
    'class' => 'Namespace\\To\\Entity',
    'query_builder' => function(EntityRepository $repository) {
       return $repository->createQueryBuilder('q')
          ->where('q.a_field = yourvalue');
     }
));

Редактировать:

Два способа использования пользовательских параметров в вашем запросе.В обеих ситуациях параметры вводятся извне, поэтому вашему FormType не нужны никакие ссылки на объекты сеанса или запроса или что-то в этом роде.

1 - Передайте необходимые параметры в ваш конструктор

class TaskType extends AbstractType
{
    private $custom_value;

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

    // ...
}

в вашем buildForm() вы должны скопировать значение в локальную переменную и сделать его доступным для обратного вызова query_builder:

public function buildForm(/*...*/) {
   $my_custom_value = $this->custom_value;

   // ...
       'query_builder' => function(EntityRepository $repository) use ($my_custom_value) {
           return $repository->createQueryBuilder('q') 
               ->where('q.a_field = :my_custom_value')
               ->setParameter('my_custom_value', $my_custom_value);
       }

   // ...
}

2 - используйте параметр $options метода buildForm.

Сначала вы должны определить значение по умолчанию, переопределив getDefaultOptions:

public function getDefaultOptions(array $options)
{
    return array(
        'my_custom_value' => 'defaultvalue'
    );
}

Затем вы можете передать его из вашего контроллера в третьем аргументе метода createForm.

$this->createForm(new YourFormType(), $entity, array('my_custom_value' => 'custom_value'));

Теперь значение должно быть доступно через параметр $options метода youru buildForm.Передайте его обратному вызову, как описано выше.

2 голосов
/ 20 июля 2012

В Symfony 2.1

Теперь вам нужно использовать OptionsResolverInterface в методе setDefaultOptions .Вот код, который вы должны будете использовать, если хотите получить параметры (используя тот же пример, что и принятый ответ)


use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

public function buildForm(FormBuilderInterface $builder, array $options){

    parent::buildForm($builder, $options);

   $my_custom_value = $options[custom_value];

   // ...
       'query_builder' => function(EntityRepository $repository) use ($my_custom_value) {
           return $repository->createQueryBuilder('q') 
               ->where('q.a_field = :my_custom_value')
               ->setParameter('my_custom_value', $my_custom_value);
       }

   // ...

}
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'my_custom_value' => 'defaultvalue'
        ));
    }

Параметры по-прежнему передаются одинаково:

$this->createForm(new YourFormType(), $entity, array('my_custom_value' => 'custom_value'));
...