2016-02-16 13 views
7

フォームを要求するユーザーの役割に応じてフォームをカスタマイズする正しい方法はありますか?Symfony2/3のユーザ役割に基づいてフォームフィールドをカスタマイズする方法は?

私のシナリオはとてもシンプルです。ユーザーにROLE_ADMINが与えられていない場合、いくつかのフィールドを非表示にする必要があります。 Twigのフィールド表示を避けようとしましたが、フォームビルダーがこのチェックをバイパスするため、

{% if is_granted('ROLE_ADMIN') %} 
       {{form_row(form.field)}} 
    {% endif %} 

は無効です。

symfonyのバージョン:2.8.2

EDIT

おかげで、私は解決策見つけた@Rooneyl suggestionに:最初は

は、あなたがの役割を追加する必要があります'オプションパラメータのキー。ですから、configureOptions()の$options['role']は常にROLE_USERです。

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

は、その後、あなたがgetRoles()配列を渡す必要がコントローラに:

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

は単純に素晴らしいコード – Rooneyl

答えて

4

フォームビルダに渡されたオプションを使用して、生成される要素を指定することができます。
このようにして、(validation_groupsを使用して)コンテンツとバリデーションを変更することができます。
たとえば、コントローラは(役割が配列であると仮定します)。
あなたのコントローラ。

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

そして、あなたのフォーム:

<?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はこのエラーを返します: 'オプション"のロールは存在しません。どうして? – sentenza

+0

'$ options ['role']'は 'getUser() - > getRoles()'でなければならないと思います。 – sentenza

+0

コードが完成していない可能性があります。私はモバイルなので、現時点ではテストできません。私はそれを実行し、少しでも完全な解決策を出すが、理論は健全である。 – Rooneyl

8

あなたの形でそれを行うことができます。

フォームのためのサービス、あなたにformTypeで

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

を作成し、あなたのサービスを取得するためのコンストラクタを追加します。フォーム

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

次に、あなたのビルダーでは、ユーザーのアクセス許可に

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

をチェックすることができるようになります。そして、最後に、あなたがレンダリングすることができ

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

それが意味することに注意してくださいフィールドがnullである可能性があります。多分あなたはいくつかのユーザーに見えるものや他のものに見えるものを見たいかもしれないからです。

これ以外の場合、エンティティ構成メソッドでデフォルト値を設定して、ユーザーが入力できない場合は値がnullにならないようにすることができます。

+0

を更新しました。ありがとう –

関連する問題