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);
并在树枝文件中删除条件检查。