Zf2 – Impostare il valore in elemento all’interno della collezione

Ho una collezione in forma, so che se voglio impostare un valore in un elemento normale uso:

$form->get('submit')->setValue('Update');

Come posso impostare un valore nel campo ” Indirizzo “Per esempio”‘ in una collezione ” “io uso zend Framework 2”.

$companies = $this->getCompaniesTable()->getCompanies($id);
$form = new CompaniesForm();
$form->bind($companies);
$form->get('submit')->setValue('Update');
$form->get('submit')->setValue('Update');
$form->get('address')->setValue('test address');

Ultima riga del precedente. il codice non funziona, cosa c’è di sbagliato ?!

Il codice del modulo è:

<?php

namespace Companies\Form;

//use Zend\Form\Element;
use Zend\Form\Form;

class CompaniesForm extends Form {

    public function __construct($name = null) {
        parent::__construct('companies');
        $this->setAttribute('method', 'post');
        $this->setAttribute('enctype', 'multipart/form-data');

        $this->add(array(
            'name' => 'id',
            'type' => 'Hidden'
        ));

        $this->add(array(
            'name' => 'name',
            'type' => 'Text'
        ));

        //address field
        $this->add(array(
            'type' => 'Zend\Form\Element\Collection',
            'name' => 'address',
            'options' => array(
                'count' => 1,
                'should_create_template' => false,
                'allow_add' => true,
                'template_placeholder' => '__placeholder__',
                'target_element' => array(
                    'type' => 'Companies\Form\AddressFieldset'
                )
            ),
        ));
        //address field

        //email field
        $this->add(array(
            'name' => 'email',
            'type' => 'text',
            'options' => array('label' => 'Email:'),
        ));

        $this->add(array(
            'name' => 'submit',
            'type' => 'Submit',
            'attributes' => array(
                'value' => 'Go',
                'id' => 'submitbutton'
            )
        ));
    }

}

Il addressFieldset file:

<?php

namespace Companies\Form;

use Companies\Entity\Address;
use Zend\Form\Fieldset;
use Zend\InputFilter\InputFilterProviderInterface;
use Zend\Stdlib\Hydrator\ClassMethods as ClassMethodsHydrator;

class AddressField {

    /**
     * @var string
      \ */
    protected $name;

    /**
     * @param string $name
     * @return Address
      \ */
    public function setName($name) {
        $this->name = $name;
        return $this;
    }

    /**
     * @return string
      \ */
    public function getName() {
        return $this->name;
    }

}

class AddressFieldset extends Fieldset implements InputFilterProviderInterface {

    public function __construct() {
        parent::__construct('Address');
        $this->setHydrator(new ClassMethodsHydrator(false))->setObject(new AddressField());

        $this->add(array(
            'name' => 'name',
            'options' => array(
                'label' => 'Address: '
            )
        ));
    }

    /**
     * @return array
      \ */
    public function getInputFilterSpecification() {
        return array(
            'name' => array(
                //'required' => true,
            )
        );
    }

}
  • Impossibile rispondere senza di te dimostrare il vostro codice del modulo.
  • Ho aggiunto un modulo di codice nel post di cui sopra.
  • E che cosa ESATTAMENTE si desidera modificare? 😉 Un certo valore su uno dei Telefono-Fieldsets? thi è molto importante ^^
  • È AddressFieldset non TelephoneFieldset “il mio male qui”, Così voglio cambiare uno degli indirizzi campi.
  • La Domanda è: per cosa esattamente? Una collezione è un array di Fieldsets in questo caso. Quindi, se si desidera modificare il valore allora avrai bisogno di cambiare i fieldset. La modifica di un singolo valore di UNO dei PIÙ reso fieldsets è un pò male (enorme design-difetto di allora).
  • Il solo scopo di mostrare l’indirizzo del db nella società “modulo di modifica – indirizzo di casella di testo di input”, gli indirizzi in separata tabella db.
  • cerchiamo di continuare questa discussione in chat

InformationsquelleAutor ahmad soliman | 2013-11-26



4 Replies
  1. 7

    È necessario prendere in collezione come elemento dal modulo e si ottiene l’elenco di campo imposta la vostra collezione.
    In visualizzazione:

    $collection = $form->get('address');
    $fieldSets = $collection->getFieldsets();
    
    //In your example you use one element as field set count = 1
    //I guess you want to change field named address in your collection of the same name
    
    $address = $fieldSets[0]->get('address');
    $address->setValue('test adress');
    
    //If you have more field sets in your collection for example count = 3 and you want this    
    //value for all of them just iterate your field sets.
    
    foreach($fieldsets as $fieldset){
        $fieldset->get('address')->setValue('test adress');
    }
    • Nessun elemento con il nome di [indirizzo] trovato nella forma, l’errore nella riga: $indirizzo = $fieldSets[0]->get(‘indirizzo’);
    • hai elemento nella vostra collezione di nome “indirizzo”? pls ci mostra le Aziende\Form\AddressFieldset
    • Aggiungo “L’indirizzo Fieldset file’ ora nel post originale
    • Il vostro elemento con etichetta indirizzo nel campo AddressFieldset ha name di “nome”. Modificarlo in “indirizzo” e controllare il mio codice.
    • Grazie mille, funziona a destra.
    • Questo hacky soluzione funziona, ma semplicemente è l’approccio sbagliato :S, Questo non dovrebbe essere necessaria. Ma se funziona, chi sono io per giudicare 😉
    • So che la sua sporca @sam non ho mai dovrebbe utilizzare. Ma non voglio giudicare perché Ahmad vuole. Ha chiesto di setValue() su un suo campo di elementi del set e ho solo cercato di aiutare qui. Ma sono d’accordo con te al 100%

  2. 3

    È possibile utilizzare il Modulo populateValues() invece di setValue() il metodo per fare questo: http://framework.zend.com/apidoc/2.3/classes/Zend.Form.Form.html#populateValues

    Quindi nel Tuo caso si dovrebbe mettere il vostro controller:

    $form = new CompaniesForm();
    $addresses = array(
        array(
            'name' => 'address field 1 name'
        ),
        array(
            'name' => 'address field 2 name'
        ),
    );
    $form->get('address')->populateValues($addresses);

    È possibile generare gli indirizzi array utilizzando i dati dal DB, per esempio.

  3. 2

    Bene, sembra che alcune cose si mescolano fino a qui. Si tenta di assegnare manualmente il Campo di Valori all’interno di un EditForm. E ‘ … e non va bene.

    Immaginare una Forma semplice

    UserForm
       textInput ("name")
       textInput ("surname")
       numberInput ("age")

    Ora si desidera modificare un User. Così è prendere i Dati dal DB

    //$userData = $db->get('userdata')...
    $userData = array(
        'name'    => 'Peter',
        'surname' => 'Parker',
        'age'     => 23
    );

    A mettere i valori esistenti in un modulo, tutto quello che dovete fare è impostare il MODULO in questa di dati.

    $form->setData($userData);

    E questo è tutto. Nel tuo caso, ovviamente, i dati-la struttura è un po ‘ più diverso e più difficile. Devi avere l’Oggetto principale che si potrebbe $form->bind() o la matrice che è possibile impostare i dati di form utilizzando $form->setData() deve essere modificato. Nel tuo caso sarebbe:

    $data = array(
        'id' => 1, //your objects id
        'name' => 'someName',
        'email' => '[email protected]',
        'address' => array(
            0 => array(
                'streetName'   => 'FooStreet',
                'streetNumber' => 42
            ),
            1 => array(
                'streetName'   => 'OofStreet',
                'streetNumber' => 24
            ),
        )
    )

    Quando si esegue $form->setData($data) utilizzando il caso di cui sopra, il modulo verrà pre-compilato con i dati provenienti dalla matrice. Naturalmente è necessario ottenere i dati dal DB e non scrivere una matrice manualmente.

    • Io uso $form->bind($imprese); in altri moduli, se non c’è collezione e non più di una tabella ma non so come si usa qui, c’è un esempio completo tutorial per questo caso?
    • La vostra società oggetto deve avere un getAddress() funzione che restituisce un array di oggetti che il AddressFieldset esigenze.
    • Scrivo questo code foreach ($indirizzo $indirizzo) { $aziende->indirizzo = $indirizzo; } code Prima $form->bind($imprese); Ed è in aggiunta ai $aziende, ma senza la forma di leggerlo.
  4. 2

    Se si voleva fare questo in un controller utilizzando getTargetElement() restituisce l’elemento o fieldset ricevuto nella collezione.

    $fieldset = $form->get('parent_fieldset');
    $collection = $fieldset->get('collection');
    $collectionFieldset = $collection->getTargetElement();
    $collectionFieldset->get('element')->setValue($value);

Lascia un commento