Più moduli dello stesso tipo – Symfony 2

Così ho il mio controller azione simile a questo

$task1 = new Task();
$form1 = $this->createForm(new MyForm(), $task1);

$task2 = new Task();
$form2 = $this->createForm(new MyForm(), $task2);

E diciamo che il mio MyForm dispone di due campi

//...
$builder->add('name', 'text');
$builder->add('note', 'text');
//...

Sembra, dato che le due forme dello stesso tipo, MyForm, quando viene eseguito il rendering in il punto di vista, i loro campi hanno lo stesso nome e Id (‘nome’ campi di due forme di condividere lo stesso nome e id; lo stesso vale per la ‘nota’ campi), a causa del quale Symfony non possono vincolare le forme’ i dati correttamente. Qualcuno sa qualche soluzione a questo?

InformationsquelleAutor 0x56794E | 2012-05-12

 

4 Replies
  1. 19
    //your form type
    class myType extends AbstractType
    {
       private $name = 'default_name';
       ...
       //builder and so on
       ...
       public function getName(){
           return $this->name;
       }
    
       public function setName($name){
           $this->name = $name;
       }
    
       //or alternativ you can set it via constructor (warning this is only a guess)
    
      public function __constructor($formname)
      {
          $this->name = $formname;
          parent::__construct();
      }

    }

    //you controller
    
    $entity  = new Entity();
    $request = $this->getRequest();
    
    $formType = new myType(); 
    $formType->setName('foobar');
    //or new myType('foobar'); if you set it in the constructor
    
    $form    = $this->createForm($formtype, $entity);

    ora si dovrebbe essere in grado di impostare un id diverso per ogni istanza del modulo di cassa.. questo dovrebbe tradursi in <input type="text" id="foobar_field_0" name="foobar[field]" required="required> e così via.

    • Esattamente il mio pensiero. Grande risposta!!!
  2. 10

    Vorrei utilizzare un statici per creare il nome

    //your form type
    
        class myType extends AbstractType
        {
            private static $count = 0;
            private $suffix;
            public function __construct() {
                $this->suffix = self::$count++;
            }
            ...
            public function getName() {
                return 'your_form_'.$this->suffix;
            }
        }

    Quindi è possibile creare come molti come si desidera, senza dover impostare il nome ogni volta.

    • Questa è la risposta migliore.
    • È una buona risposta, thx. Ma mi chiedo se è possibile scalare correttamente con una grande quantità di utenti ?
    • È molto improbabile che la quantità di utenti che sarà un problema con questo tipo di modello. La variabile $conteggio viene inizializzato solo una volta per ogni richiesta e incrementato quante volte avete form creato in un’unica richiesta. Anche se hai avuto migliaia di forme, la variabile non dovrebbe essere un problema (ma poi di avere altri tipi di problemi, credo
  3. 6

    EDIT: non Farlo! Vedere questo invece: http://stackoverflow.com/a/36557060/6268862

    In Symfony 3.0:

    class MyCustomFormType extends AbstractType
    {
        private $formCount;
    
        public function __construct()
        {
            $this->formCount = 0;
        }
    
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            ++$this->formCount;
            //Build your form...
        }
    
        public function getBlockPrefix()
        {
            return parent::getBlockPrefix().'_'.$this->formCount;
        }
    }

    Ora prima istanza del form sulla pagina “my_custom_form_0”, come il suo nome (lo stesso vale per i campi di nomi e Id), il secondo “my_custom_form_1”, …

    • Devo notare che questa è probabilmente la migliore idea, perché quando si invia il modulo, il conteggio verrà inizializzato e quindi il modulo di non effettivamente essere presentate (differenza tra il nome del modulo e i dati di richiesta). Si dovrebbe invece utilizzare il createNamedBuilder metodo, come spiegato qui: stackoverflow.com/a/36557060/6268862
    • in Symfony3, un costruttore non è consentito più di un formtype
    • createNamedBuilder lavorato anche per me
  4. 0

    creare un unico nome dinamico :

    const NAME = "your_name";
    
    public function getName()
    {
        return self::NAME . '_' . uniqid();
    }

    il tuo nome è sempre unico

Lascia un commento