根据其角色Symfony 3隐藏字段

时间:2017-11-23 21:14:11

标签: symfony symfony3.x

首先抱歉我的英语因为不太好!

所以我想根据它的角色隐藏一个字段,因为如果我用Twig制作要在底部表单上显示的字段

我的理解代码,这是我的LinkType:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder

    ->add('title')
    ->add('link')
    ->add('description')

    // this field to hidden according the role
    ->add('published', CheckboxType::class);
}

/**
 * {@inheritdoc}
 */
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'AppBundle\Entity\Link'
    ));
}

/**
 * {@inheritdoc}
 */
public function getBlockPrefix()
{
    return 'appbundle_link';
}

Controler的一部分:

public function newAction(Request $request)
{
    $em = $this->getDoctrine()->getManager();
    $categories = $em->getRepository('AppBundle:Category')->findAll();
    $subCategories = $em->getRepository('AppBundle:SubCategory')->findAll();
    $gestionCategorie = $this->container->get('app.categorie');
    $link = new Link();

    $repository = $this
        ->getDoctrine()
        ->getManager()
        ->getRepository('AppBundle:Link');

    $category = $repository->findCategory();
    $subCategory = $repository->findSubCategory();

    $form = $this
        ->get('form.factory')
        ->create('AppBundle\Form\LinkType', $link)

        ->add('categories', ChoiceType::class, array(
            //  on inverse les clés et valeurs
            'choices'   => array_flip($category),
            'label'     => "Catégorie",
            'attr'  => ['class' => 'form-control'],
        ))
        ->add('sousCategories', ChoiceType::class, array(
            //  on inverse les clés et valeurs
            'choices'   => array_flip($subCategory),
            'label'     => "Sous-catégorie",
            'attr'  => ['class' => 'form-control'],
        ));

    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {

如果您有其他问题,请不要犹豫

1 个答案:

答案 0 :(得分:0)

如果要在控制器中执行此操作,请先删除表单类中的字段,然后添加:

$user = $this->getUser();
if (in_array('MY_ROLE_NAME', $user->getRoles())) {
    $builder->add('published', CheckboxType::class);
}

更好更清洁的方法是使用表单作为服务并将令牌存储服务注入其中:

// services.yml
AppBundle\Form\:
    resource: '../../src/AppBundle/Form'
    public: true
    autowire: true

// Form type class
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;

//...

private $tokenStorage;

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

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $user = $this->tokenStorage->getToken()->getUser();
    $builder

    ->add('title')
    ->add('link')
    ->add('description');

    if (in_array('MY_ROLE_NAME', $user->getRoles())) {
        $builder->add('published', CheckboxType::class);
    }
}
相关问题