2017-12-28 4 views
0

Ich habe ein Symfony3-Projekt, das mehreren Administratoren/Mandanten die Erstellung benutzerdefinierter Formulare für ihre Benutzer erleichtert. TenantData ist die Haupteinheit, die die Felder Anrede, Vorname und Nachname enthält. Basierend auf dieser Entität kann der Mandant/Administrator ein Formular TenantDataType erstellen. Hier ist, was TenantDataType wie folgt aussieht:Wie kann ich Administratoren erlauben, ein zusätzliches nicht zugeordnetes Feld einem Formular in Echtzeit hinzuzufügen (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 
     )); 
    } 

} 

Jetzt möchte ich das Admin in der Lage sein ein zusätzliches Feld hinzugefügt werden, ohne eine zusätzliche Spalte in der TenantData Einheit hinzufügen. Ein Ansatz, den ich kenne, besteht darin, eine MetaData Tabelle zu erstellen, die die Felder label, datype, isrequired und ismultiple enthält. Basierend auf dieser Entität kann ich ein neues Formular mit dem Namen MetaDataType erstellen. Damit der Administrator dieses Formular verwenden kann, um ein zusätzliches Feld zu erstellen. Dies bedeutet im Grunde, dass jeder Datensatz der MetaData-Tabelle die Details eines zusätzlichen Feldes enthält. Das Problem ist, wie verwende ich diese Datensätze, um die zusätzlichen Felder, die vom Admin/Tenant in Echtzeit hinzugefügt werden. Da ich eine neue Instanz von TenantData zu dem Zeitpunkt erstelle, zu dem ich das Formular rendere, gibt es zu der Zeit keine TenantData-ID, die die zugehörigen Zeilen MetaData abrufen kann. Welche Beziehung muss ich herstellen, um die gewünschte Funktionalität zu erhalten?

Irgendwelche Ideen?

+0

suchen Sie benutzerdefinierte Formular für admin admin/Mieter Unternehmen? –

+0

@ MOHAMMED YASSINE Chabli Ja – utkarsh2k2

+0

Ich werde dir ein Beispiel zeigen und sehen, ob diese Antwort auf Ihre Bedürfnisse. –

Antwort

0

nehmen wir an, dass Ihre Formbuilder, wie Sie mit einigen Änderungen oben zeigen:

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 
      )); 
     } 

    } 

nehmen wir an, dass ein Mieter Benutzer: TENANT_ROLE

und Admin hat: ADMIN_ROLE

Steuerung

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

wenn Sie $ Optionen Array von addEventListener zugreifen möchten:

$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) { 
    $user_role = $event->getForm()->getConfig()->getOptions()['userRole']; 
} 
Verwandte Themen