2016-02-16 16 views
7

istekte kullanıcının rolüne bağlı bir form özelleştirmek için doğru yolu var mı?Symfony2/3'teki kullanıcı rollerine göre form alanı nasıl özelleştirilir?

Benim senaryo oldukça basit: Ben kullanıcı verilmiş ROLE_ADMIN etmediyse bazı alanları gizlemek gerekir. Form oluşturucu, bu denetimi atlayamadığı için, Twig üzerindeki alan ekranından kaçınmaya çalıştım, ancak

çalışmıyor.

Symfony'nin sürümü: 2.8.2

DÜZENLEME

sayesinde ben çözüm buldum @Rooneyl suggestion için: İlk başta

, sen rolünü eklemeniz gerekir 'seçenekler parametresinin anahtarı. Yani, configureOptions içinde() $options['role'] daima ROLE_USER olduğunu.

$user_roles = $this->getUser()->getRoles(); 
$form = $this->createForm('MyBundle\Form\TicketType', $ticket, array('role' => $user_roles)); 
+0

kodu güncelledik – Rooneyl

cevap

4

Oluşturulan hangi unsurlar söylemek form oluşturucu geçirilen bir seçeneği kullanabilirsiniz.
Bu şekilde (validation_groups kullanarak) bitmiş olur içeriğini ve doğrulama değiştirebilir.
Örneğin , denetleyici (rolleri varsayarak bir dizidir);
denetleyiciniz;

$form = $this->createForm(new MyType(), $user, ['role' => $this->getUser()->getRoles()]); 

Ve formu:

<?php 
namespace AppBundle\Form\Entity; 

use AppBundle\Entity\UserRepository; 
use Symfony\Component\Form\AbstractType, 
    Symfony\Component\Form\FormBuilderInterface, 
    Symfony\Component\OptionsResolver\OptionsResolver; 

class MyType extends AbstractType 
{ 
    /** 
    * @param OptionsResolver $resolver 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'AppBundle\Entity\User', 
      'validation_groups' => ['create'], 
      'role' => ['ROLE_USER'] 
     )); 
    } 

    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     // dump($options['roles']); 
     if (in_array('ROLE_ADMIN', $options['role'])) { 
      // do as you want if admin 
      $builder 
       ->add('name', 'text'); 
     } else { 
      $builder 
       ->add('supername', 'text'); 
     } 
    } 

    /** 
    * @return string 
    */ 
    public function getName() 
    { 
     return 'appbundle_my_form'; 
    } 

} 
+0

Symfony seçenekleri parametresini kullanmaya çalıştığımda bu hatayı döndürür: '" role "seçeneği mevcut değil. Niye ya? – sentenza

+0

Bence $ seçenekler ['role'] 'getUser() -> getRoles()' olmalıdır. – sentenza

+0

Kod tamamlanmış olmayabilir, ben mobiliyim, o anda test edemiyorum. Ben koşacağım ve birazcık tam bir çözüm vereceğim, ama teori sağlam. – Rooneyl

8

Sen şeklinde yapabilirsiniz:

/** 
* @param OptionsResolver $resolver 
*/ 
public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'MyBundle\Entity\Ticket', 
     'role' => 'ROLE_USER' 
    )); 
} 

Sonra denetleyicisi size getRoles() dizi geçmek zorunda.

, formunuzda sizin FormType olarak

app.form.type.task: 
    class: AppBundle\Form\FormType 
    arguments: ["@security.authorization_checker"] 
    tags: 
     - { name: form.type } 

için bir hizmet olun hizmeti almak için bir kurucu ekleyin. Formunuz

private $authorization; 
public function __construct(AuthorizationChecker $authorizationChecker) 
{ 
    $this->authorization = $authorizationChecker; 
} 

Ardından, Oluşturucu, Kullanıcıyı iznini

$builder->add('foo'); 
if($this->authorization->isGranted('ROLE_ADMIN')) 
{ 
    $builder->add('bar'); 
} 

kontrol etmek mümkün olacak Ve sonra, son olarak, işleyebilen

{% if form.formbar is defined %} 
    {{ form_row(form.formbar) }} 
{% endif %} 

anlama lütfen unutmayın senin alanın boş olabilir. Çünkü belki bazılarını görebilmeniz için bazı kullanıcılar ve diğerleri tarafından görülebilir. Else

, kullanıcı/doldurmak olamaz yoksa emin değeri null olmayacaktır yapmak, sizin varlık yapısı yönteminde varsayılan bir değer ayarlayabilirsiniz.

+0

Basitçe harika.Teşekkürler –

İlgili konular