Symfony2中是否存在表单字段或没有表单字段的操作

时间:2014-03-06 12:41:25

标签: symfony formbuilder

FormType

class ArticleType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name', 'text');
        $builder->add('status', 'choice', array(
            'choices' => array(
                'A' => 'A',
                'B' => 'B',
                'C' => 'C',
            ),
            'required' => true
        ));

        // ...
    }

    // ...
}

查看:这没问题。

{{ form_widget(form.status) }}
{{ form_widget(form.name) }}
<input type="Submit" value="Submit" />

查看:问题就是这种情况。

{% if is_granted("IS_AUTHENTICATED_REMEMBERED") %}
    {{ form_widget(form.status) }}
{% endif %}
{{ form_widget(form.name) }}
<input type="Submit" value="Submit" />

如果没有登录,它有登记空白状态值 如果没有状态字段,我的意图是没有更改状态值。

在这种情况下,我是否必须切换另一个“FormType”?

2 个答案:

答案 0 :(得分:1)

您还必须在表单构建器中检查角色,并且您有2个解决方案来执行此操作。

解决方案1 ​​

最优雅的是将自定义表单类型创建为服务,具体取决于安全上下文:

class ArticleType extends AbstractType
{
    private $securityContext;

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

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name', 'text');

        // If the user is granted
        if($this->securityContext->isGranted('IS_AUTHENTICATED_REMEMBERED'))
        {
            $builder->add('status', 'choice', array(
                'choices' => array(
                    'A' => 'A',
                    'B' => 'B',
                    'C' => 'C',
                ),
                'required' => true
            ));
        }

        // ...
    }

    // ...
}

将表单类型标记为服务:

services:
    form.type.article:
        class: Foo\BarBundle\Form\Type\ArticleType
        arguments: ["@security.context"]
        tags:
            - { name: form.type, alias: article_type }

现在,不要在控制器中调用new ArticleType(),而是调用此新服务:

$form = $this->createForm($this->get('form.type.article'), $data);

解决方案2

第二种解决方案是将安全上下文传递给ArticleType,无需创建服务。在您的控制器中:

$form = $this->createForm(new ArticleType($this->get('security.context')->isGranted('IS_AUTHENTICATED_REMEMBERED')), $article);

并在表单中输入:

class ArticleType extends AbstractType
{
    private $isGranted;

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

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name', 'text');

        // If the user is granted
        if($this->isGranted)
        {
            $builder->add('status', 'choice', array(
                'choices' => array(
                    'A' => 'A',
                    'B' => 'B',
                    'C' => 'C',
                ),
                'required' => true
            ));
        }

        // ...
    }

    // ...
}

答案 1 :(得分:0)

你可以这样做。

将FormType类更改为:

class ArticleType extends AbstractType
{
    private $isRemembered;

    protected function __construct($isRemembered) {
        $this->isRemembered = $isRemembered;
        parent::__construct();
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name', 'text');
        if($this->isRemembered) {
            $builder->add('status', 'choice', array(
                'choices' => array(
                    'A' => 'A',
                    'B' => 'B',
                    'C' => 'C',
                ),
                'required' => true
            ));
        }

        // ...
    }
}

在您要实例化表单类型的控制器中,

$isRemembered = $this->get('security.context')->isGranted('IS_AUTHENTICATED_REMEMBERED');
$form = $this->createForm(new ArticleType($isRemembered), $entity);

并删除twig文件中的条件检查。