как вывести массив в поле выбора формы в Symfony2 - PullRequest
1 голос
/ 04 января 2012

У меня есть сущность, есть атрибут типа массива: productKey. Я пытаюсь добавить тип, типизированный в форму, чтобы показать productKeys, я написал коды:

1.my formType:

public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
                ->add('heading','text',array('label'=>'title'))
                ->add('productKey','choice',array(
                    'required'=>TRUE,
                    'label'=>'choose your product',
                ));
    }

2. В моем объекте Product определяется ключ продукта:

 /**
         * @var array $productKey
         *
         * @ORM\Column(name="productKey", type="array",nullable=true)
         */
        private $productKey;

3. В моем контроллере:

$entity = new Product();
$productKey = array("1"=>"one","2"=>"two","3"=>"three");
$entity ->setProductKey($productKey);
$formType = new TicketType($productKey);
$form = $this->createForm($formType,$entity);
return array(
     'form'=>$form->createView(),
     'entity'=>$entity
 );

когда я запускаю свой проект, значение productKey не может быть указано! это просто появляется пустой выбор выбора. Как я могу решить это?

1 Ответ

6 голосов
/ 04 января 2012

Вам необходимо указать варианты, используя параметр choices в типе формы:

public function buildForm(FormBuilder $builder, array $options)
{
    $builder
        ->add('productKey', 'choice', array(
            'choices' => array('1' => 'one', '2' => 'two', '3' => 'three'),
        ))
    ;
}

Если ваш выбор исходит от службы, вы можете создать собственный тип формы product_key и настроить его.в контейнере службы.

services:
    product_key_form_type:
        class: ProductKeyFormType
        arguments:
            - @product_key_choices_provider
        tags:
            - { name: form.type, alias: product_key }

Этот тип формы будет выглядеть примерно так:

class ProductKeyFormType extends AbstractType
{
    private $provider;

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

    public function getDefaultOptions(array $options)
    {
        return array(
            'choices' => $this->provider->getProductKeyChoices(),
        );
    }

    public function getParent(array $options)
    {
        return 'choice';
    }

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

И будет использоваться в вашем текущем типе формы примерно так:

public function buildForm(FormBuilder $builder, array $options)
{
    $builder
        ->add('productKey', 'product_key')
    ;
}

Если всего этого слишком много, вы также можете добавить опцию product_key_choices к вашей форме (добавив 'product_key_choices' => array() к getDefaultOptions) и просто передать выбор из вашего контроллера.Это легче запустить и запустить, но менее переносимо, так как вам нужно будет передавать эту опцию каждый раз, когда вы используете форму.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...