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



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个解决方案可以做到。

解决方案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: FooBarBundleFormTypeArticleType
        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
            ));
        }
        // ...
    }
    // ...
}

您可以在下面喜欢。

将您的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);

并在树枝文件中删除条件检查。

最新更新