阻止FormType中多个字段的用户输入

时间:2014-08-12 23:07:45

标签: forms symfony

我有一个用于向系统添加新用户的formType。现在我想重用这个formType来修改用户配置文件,但是当我想继续打印所有字段时,我只想允许根据用户对修改用户的权限来编辑它们。 当然,我可以在FormType中使用readonly属性,但这只是在HTML代码中放入一个只读标记,这只不过是一个装饰。我可以将这些字段添加到" if"阻止只有在用户具有适当权限时才添加字段,但随后使用模拟整个表单的代码将twig代码变脏。 另一种方法是这样做吗?

1 个答案:

答案 0 :(得分:0)

您可以在控制器中执行此操作,只需使用Voter类检查edit操作中的权限

此外,您还必须创建EDIT_*权限,例如EDIT_USER_NEWSEDIT_USER_ARTICLE [...]

如果用户没有EDIT权限,只需抛出AccessDeniedException()异常

// editAction()
$sc = $this->get('security.context');
if (false === $sc->isGranted('EDIT', $user)) {
    throw new AccessDeniedException('Nope you cant edit this!');
}

现在,如果用户具有EDIT权限,则只需根据用户权限设置表单

$user = new User();

$disabled_fields = array(); // This can be a risk
if ($sc->isGranted('EDIT_USER_NEWS', $user)) {
    $disabled_fields = array('field3', 'field4');
}

if ($sc->isGranted('EDIT_USER_ARTICLE', $user)) {
    $disabled_fields = array('field1', 'field2');
}

$form = $this->createForm(new UserType(), $user, array('fields' => $disabled_fields));
// ...

在FormType中,根据给定的选项禁用字段

// FormType
public function buildForm(FormBuilderInterface $builder, array $options)
{
     if (isset($options['fields'])) {
       $builder->add('field1', null, array('disabled' => 
                                      isset($options['fields']['field1'])));
       // others fields...
     } else {
       // Show all the fields?
     }
}

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array('fields' => array()));
}

disabled选项将禁用该字段,表示用户无法对其进行编辑,即使用户在HTML中删除了该属性

当然,有很多方法可以解决这个问题,但我在项目中有这种方式