Можно ли динамически добавить поле в форму FormType? - PullRequest
5 голосов
/ 18 февраля 2012

У меня есть форма PostType, которая расширяет AbstractType.В контроллере я хотел бы добавить поле к нему, если выполняется определенное условие.Могу ли я сделать это каким-либо образом или есть еще один лучший способ изменения FormTypes в контроллерах?

Спасибо

Ответы [ 4 ]

7 голосов
/ 28 ноября 2012

Допустим, у вас есть форма типа FileType следующим образом:

<?php
namespace EventFlowAnalyser\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

class FileType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name', 'text', array('label' => 'Name'));
    }

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

Вы можете использовать ее в своем контроллере следующим образом:

$form = $this->createForm(new FileType(), $document);

Где $ document - это объект, содержащий одно поле ( name ).Теперь, если вам нужно добавить поле к объекту формы в другой функции, вы можете расширить FileType , чтобы добавить нужное поле;Например, если вы хотите отредактировать поле имени, но хотите сохранить предыдущее состояние, добавьте поле original_name .

<?php
namespace EventFlowAnalyser\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

use EventFlowAnalyser\Form\EventListener\EditFileFieldSubscriber;

class FileEditType extends FileType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        parent::buildForm($builder, $options);
        $builder->add('original_name', 'hidden', array('mapped' => false));
    }
}

Теперь вы можете использовать расширенную форму, например:что:

$form = $this->createForm(new FileEditType(), $document);

И измените значение поля следующим образом:

$form->get('original_name')->setData($document->name);

Надеюсь, это поможет somenone: o)

5 голосов
/ 19 февраля 2012

Вы можете сделать это, используя События формы .

4 голосов
/ 18 февраля 2012

Конечно. Вы можете добавлять поля динамически, используя Тип коллекции в форме.См. Ссылку ниже, это поможет вам, как создавать поля динамически.

Link1: Динамическое поле в Symfony2

Link2: Коллекция форм в symfony2 doc

Надеюсь, эти две ссылки помогут вам.Удачного кодирования ..

2 голосов
/ 18 февраля 2012

Я думаю, вам следует добавить логическую опцию в форму и установить ее в своем контроллере.Таким образом, вы получите чистое разделение M (V) C.

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