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”?
答案 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文件中的条件检查。