La compilazione di Dati di un Form in ZF2 quando si utilizza Fieldsets

Attualmente sto giocando con un ZF2 beta 4 e mi sembra di essere bloccato quando ho provato a usare fieldsets interno di un modulo e di ottenere i dati in forma quando il modulo viene inviato. Io non sono sicuro se io non sono l’impostazione di filtri di ingresso a destra per fieldsets o mi manca qualcosa. Per esempio, ho il seguente (semplificato per rendere chiaro):

Controller

public function indexAction(){
   $form = new MyForm();
   $request = $this->getRequest();
          if ($request->isPost()) {
                 $form->setData($request->post());
                 if ($form->isValid()) {
                        //Do something
                        print_r($form->getData()); //for debug
                 }
          }
   return array('form' => $form);
}

MyForm.php

class MyForm extends Form
{
    public function __construct()
    {
        parent::__construct();
        $this->setName('myForm');
        $this->setAttribute('method', 'post');

        $this->add(array(
                    'name' => 'title',
                    'attributes' => array(
                    'type'  => 'text',
                    'label' => 'Title',
                    ),
                 ));

        $this->add(new MyFieldset('myfieldset'));

        //setting InputFilters here
        $inputFilter = new InputFilter();
        $factory = new InputFactory();

        $inputFilter->add($factory->createInput(array(
            'name'     => 'title',
            'required' => true,
            'filters'  => array(
                array('name' => 'StripTags'),
                array('name' => 'StringTrim'),
            ),
        )));

        //Now add fieldset Input filter
        foreach($this->getFieldsets() as $fieldset){
              $fieldsetInputFilter = $factory->createInputFilter($fieldset->getInputFilterSpecification());
              $inputFilter->add($fieldsetInputFilter,$fieldset->getName());
        }

        //Set InputFilter
        $this->setInputFilter($inputFilter);
    }
}

MyFieldset.php

class MyFieldset extends Fieldset implements InputFilterProviderInterface{
    public function __construct($name)
    {
        parent::__construct($name);
        $factory = new Factory();

        $this->add($factory->createElement(array(
            'name' => $name . 'foo',
            'attributes' => array(
                'type'  => 'text',
                'label' => 'Foo',
            ),
        )));
    }

    public function getInputFilterSpecification(){
        return array(
            'foo' => array(
                'required' => true,
                'filters'  => array(
                    array('name' => 'StripTags'),
                    array('name' => 'StringTrim'),
                ),
            ),
        );
    }
}

Sono in grado di output del modulo, come previsto, e io alla fine con due elementi di input di nome ‘titolo’ e ‘myfieldsetfoo’ (il nome dato quando outputing con il ViewHelper). Così, naturalmente, quando ho sottoporre il raw post mostra i valori per ‘titolo’ e ‘myfieldsetfoo’. Tuttavia, quando uso SetData() i valori per il campo non viene compilato (anche se posso vedere i valori delle materie oggetto post). Invece, per esaminare l’output di ‘$form->getData()’ io ricevo:

Array(
   [title] => Test,
   [myfieldset] => Array(
                         [foo] =>
                        )
)

Che cosa mi manca? Di cosa ho bisogno per fare in modo che ZF2 capisce come compilare il fieldset?

Grazie per qualsiasi aiuto, questo mi sta facendo impazzire.

OriginaleL’autore Jaime R. | 2012-06-08

3 risposte

  1. 8

    Motivo per cui lo faccio è concatenare InputFilter così ho potuto gestire l’intero form HTML, array inviato.

    <form method="POST">
    <input type="text" name="main[name]" />
    <input type="text" name="main[location]" />
    <input type="text" name="contact[telephone]" />
    
    <input type="submit" value="Send" />
    </form>
    

    Questo crea un array inviato come

    post["main"]["name"]
    post["main"]["location"]
    post["contact"]["telephone"]
    

    Filtrati e convalidato con:

    use Zend\InputFilter\InputFilter;
    use Zend\InputFilter\Factory as InputFactory;
    
    $post = $this->request->getPost();
    $inputFilter = new InputFilter();
    $factory = new InputFactory();
    
    //$post["main"]
    $mainFilter = new InputFilter();
    $mainFilter->add($factory->createInput(array(
        'name'     => 'name',
        'required' => true,
        'filters'  => array(
            array('name' => 'StripTags'),
            array('name' => 'StringTrim'),
        ),
        'validators' => array(
            array(
                'name'    => 'StringLength',
                'options' => array(
                    'encoding' => 'UTF-8',
                    'min'      => 1,
                    'max'      => 100,
                ),
            ),
        ),
        )));
    
    $mainFilter->add($factory->createInput(array(
        'name'     => 'location',
        'required' => true,
        'filters'  => array(
            array('name' => 'StripTags'),
            array('name' => 'StringTrim'),
        ),
        'validators' => array(
            array(
                'name'    => 'StringLength',
                'options' => array(
                    'encoding' => 'UTF-8',
                    'min'      => 1,
                    'max'      => 100,
                ),
            ),
        ),
        )));
    $inputFilter->add($mainFilter, "main");
    
    //$post["contact"]
    $contactFilter = new InputFilter();
    $contactFilter->add($factory->createInput(array(
        'name'     => 'name',
        'required' => true,
        'filters'  => array(
            array('name' => 'StripTags'),
            array('name' => 'StringTrim'),
        ),
        'validators' => array(
            array(
                'name'    => 'StringLength',
                'options' => array(
                    'encoding' => 'UTF-8',
                    'min'      => 1,
                    'max'      => 100,
                ),
            ),
        ),
        )));
    $contactFilter->add($mainFilter, "contact");
    
    //Set posted data to InputFilter
    $inputFilter->setData($post->toArray());
    

    http://www.unexpectedit.com/zf2/inputfilter-validate-and-filter-a-form-data-with-fieldsets

    +1 per questa linea $contactFilter->add($mainFilter, "contact");. Ora so come applicare il filtro per fieldsets. Grazie!

    OriginaleL’autore Ignacio Pascual

  2. 0

    Penso che hai dimenticato di preparare la vostra forma del controller:

    return array('form' => $form->prepare());
    

    Questo rinominare il campo “nome” del tuo fieldset “myfieldset[pippo]”, così non devi anteporre il fieldsets nome.

    Basta usare

    'name' => 'foo'
    

    invece di

    'name' => $name . 'foo'
    

    nel fieldset class.

    OriginaleL’autore MaGna

  3. -1

    Penso che il problema sia che si dichiara un nuovo modulo del controller. E chiaro che la forma precedente.

    $form = new MyForm();
    

    Io uso il Service Manager di dichiarare la forma e filtri.
    E poi il controller non

    $form = $this->getServiceLocator()->get('my_form');
    

    Che modo ottengo sempre l’oggetto che voglio

    Aggiornamento

    Non uso più gestore del servizio a chiamata forme. Ho appena chiamata una nuova forma e l’emissione di $form->setData($dati);

    La fonte per i dati possono essere anche di entità anche se poi avrei il problema:: $form->bind($entità)

    Questo modo di dichiarare la forma è simile a quello che viene fatto qui http://akrabat.com/zend-framework-2-tutorial/. Sto solo vedendo un problema quando sto usando fieldsets. Se ho un semplice form (e anche elementi che non sono in fieldset), non ho problemi a ottenere i dati indietro.
    Metodo di creazione di un’istanza del modulo non ha assolutamente nulla a che fare con questo problema.

    OriginaleL’autore michaelbn

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *