2017-12-28 15 views
0

私は、複数の管理者/テナントが自分のユーザ用にカスタムフォームを作成することを容易にするSymfony3プロジェクトを持っています。 TenantDataは、挨拶、名字、姓フィールドを含む主要なエンティティです。このエンティティに基づいて、テナント/管理者はTenantDataTypeというフォームを作成できます。ここでTenantDataTypeは、次のようになります。管理者がフォームに余分なマッピングされていないフィールドをリアルタイムで追加する方法(symfony3)

<?php 

namespace AppBundle\Form\Type; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolver; 
use AppBundle\Entity\TenantData; 
use Symfony\Component\Form\Extension\Core\Type\ChoiceType; 
use Symfony\Component\Form\Extension\Core\Type\TextType; 
use Symfony\Component\Form\Extension\Core\Type\SubmitType; 

class TenantDataType extends AbstractType { 

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

     $builder->add('firstname', TextType::class, array()); 
     $builder->add('lastname', TextType::class, array()); 
     $builder->add('title', ChoiceType::class, array(
      'choices' => array(
       'Ms' => true, 
       'Mr' => false, 
      ), 
     )); 
     $builder->add('save', SubmitType::class, array('label' => 'Submit')); 
    } 

    public function configureOptions(OptionsResolver $resolver) { 
     $resolver->setDefaults(array(
      'data_class' => TenantData::class, 
      'csrf_protection' => true, 
      'allow_extra_fields' => true 
     )); 
    } 

} 

今私は、管理者がTenantDataエンティティで余分な列を追加することなく、余分なフィールドを追加できるようにしたいです。私が知っている1つのアプローチは、ラベル、データ型、isrequiredとismultipleフィールドを含むMetaDataテーブルを作成することです。このエンティティに基づいて、私はMetaDataTypeという名前で新しいフォームを作成できます。管理者がこのフォームを使用して余分なフィールドを作成できるようにします。これは、基本的には、MetaDataテーブルのすべてのレコードに余分なフィールドの詳細が含まれていることを意味します。問題は、これらのレコードを使用して、管理者/テナントによって追加された余分なフィールドをリアルタイムでレンダリングする方法です。私はフォームをレンダリングしているときにTenantDataの新しいインスタンスを作成しているので、関連するMetaData行をフェッチできるTenantData IDはその時点では存在しません。必要な機能を得るためには、どのような関係を確立する必要がありますか。

アイデア?

+0

あなたは管理者管理者/テナントエンティティのカスタムフォームに見ていますか? –

+0

@ MOHAMMED YASSINE Chabliはい – utkarsh2k2

+0

私はあなたに例を示して、あなたの必要性に答えるかどうかを見ます。 –

答えて

0

のは、あなたには、いくつかの変更を加えて上記表示してあなたのformBuilderと仮定してみましょう:TENANT_ROLE

をし、管理者が持っている:ADMIN_ROLE

TenantDataType

<?php 

    namespace AppBundle\Form\Type; 

    use Symfony\Component\Form\AbstractType; 
    use Symfony\Component\Form\FormBuilderInterface; 
    use Symfony\Component\OptionsResolver\OptionsResolver; 
    use AppBundle\Entity\TenantData; 
    use Symfony\Component\Form\Extension\Core\Type\ChoiceType; 
    use Symfony\Component\Form\Extension\Core\Type\TextType; 
    use Symfony\Component\Form\Extension\Core\Type\SubmitType; 

    class TenantDataType extends AbstractType { 

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

      $builder->add('firstname', TextType::class, array()); 
      $builder->add('lastname', TextType::class, array()); 
      if(isset($option['userRole'] && $option['userRole']=="ADMIN_ROLE"){ 
      $builder->add('your_admin_field', TextType::class, array()); 
       } 

      $builder->add('title', ChoiceType::class, array(
       'choices' => array(
        'Ms' => true, 
        'Mr' => false, 
       ), 
      )); 
      $builder->add('save', SubmitType::class, array('label' => 'Submit')); 
     } 

     public function configureOptions(OptionsResolver $resolver) { 
      $resolver->setDefaults(array(
       'data_class' => TenantData::class, 
       'csrf_protection' => true, 
       'allow_extra_fields' => true 
      )); 
     } 

    } 

はのは、テナントのユーザーが持っていると仮定してみましょう

コントローラ

$user_role= // get the user role here . (TENANT_ROLE/ADMIN_ROLE) 
    $form = $this->createForm(TenantDataType ::class, $tenantObject, array(
     'userRole' => $user_role, 
    ); 

あなたがにaddEventListenerから$ options配列にアクセスする場合:

$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) { 
    $user_role = $event->getForm()->getConfig()->getOptions()['userRole']; 
} 
関連する問題