2013-06-24 1 views
2

Je travaille sur un projet Zend Framework 2 dans lequel un utilisateur doit pouvoir ajouter/modifier des factures. Une facture se compose de certaines informations client (par exemple, nom, adresse) et d'une ou plusieurs lignes de facture. Pour cela j'utilise deux entités Doctrine 2: Invoice et InvoiceLine. Une facture contient une Doctrine ArrayCollection avec toutes ses lignes.ZF2 Liaison d'objet sur Form Collection

J'ai aussi un formulaire pour une facture et un fieldset pour les lignes. Ce formulaire contient un Form Collection pour toutes les lignes:

$form->add(array(
    'type' => 'Zend\Form\Element\Collection', 
    'name' => 'lines', 
    'options' => array(
     'should_create_template' => true 
    ) 
)); 
$form->get('lines')->setTargetElement($this->createLineFieldset($form->get('lines')- >getTemplatePlaceholder())); 

Après avoir affiché la forme que je lie l'entité de la facture à la forme et je valide le formulaire. Pour une nouvelle facture (non existante) cela fonctionne parfaitement, ma facture contient toutes les informations, y compris les lignes:

$form->bind($invoice); 
$form->setData($request->getPost()); 

if ($form->isValid()) { 
    // Form is valid and invoice contains all information (including lines) 
} 

Si je veux modifier une facture de choses existantes commencent à aller mal. Lorsque je remplis le formulaire avec ma facture existante (et les lignes) tout semble bien; tous les champs et ensembles de champs sont remplis avec les valeurs. Mais quand je publie ce formulaire tous les fieldsets (lignes existantes ou nouvelles) ne sont pas validés et mon entité ne contient pas les valeurs correctes; toutes les lignes sont manquantes. En bref: l'ajout fonctionne très bien, mais l'édition d'une facture ne fonctionne pas.

Ai-je raté quelque chose ou est-ce un bug? Merci d'avance!

Répondre

2

Après une longue période de débogage j'ai finalement résolu le problème :). Au début, j'utilisais l'hydrateur ObjectProperty de Zend. Le changement à l'hydrateur DoctrineObject de Doctrine a résolu mon problème. J'ai créé des getters et setters pour toutes les propriétés et j'ai changé tous les hydrators en DoctrineObject et maintenant tout fonctionne bien.

3

Regardez ce formulaire article avec relation One-to-One, One-to-Many http://zf2cheatsheet.com/#form

+0

Merci pour votre lien, même si cela ne m'a pas aidé avec cette question particulière c'est une très bonne ressource tout en travaillant avec ZF2! –