2014-05-17 4 views
1

J'utilise zendframework 2 et doctrine 2. Je veux remplir les valeurs de ma MultiCheckbox à partir des valeurs de ma base de données. je suis la technique de: https://github.com/doctrine/DoctrineModule/blob/master/docs/form-element.mdzendframework 2 remplir des valeurs MultiCheckbox à partir d'une base de données

namespace Users\Form; 
use Zend\Form\Form; 
use DoctrineModule\Persistence\ObjectManagerAwareInterface; 
use Doctrine\Common\Persistence\ObjectManager; 
class addForm extends form implements ObjectManagerAwareInterface 
{ 
protected $objectManager; 
public function setObjectManager(ObjectManager $objectManager) 
{ 
    $this->objectManager = $objectManager; 
} 

public function getObjectManager() 
{ 
    return $this->objectManager; 
} 
public function __construct($name = null) 
{ 
    parent::__construct('add'); 
    $this->setAttribute('method', 'post'); 
    $this->setAttribute('enctype','multipart/formdata'); 
      $this->add(array(
    'type' => 'DoctrineModule\Form\Element\ObjectMultiCheckbox', 
    'name' => 'option', 
    'options' => array(
    'label' => 'Options Véhicule', 
    'object_manager' => $this->getObjectManager(), 
       'target_class' => 'Users\Entity\optionsvehicule', 
       'property'  => 'property' 
      , ))); 

le message d'erreur i reçu: Aucun gestionnaire d'objets a été défini.

+0

est-il défini par injection de dépendance? – alex

+0

@alex Comment aurait-il pu être le '__construct' appelle la méthode' $ this-> getObjectManager() ', qui n'aurait pas pu être définie précédemment. – AlexP

+0

ne l'a pas vu dans le constructeur ... c'est pourquoi c'était une question – alex

Répondre

1

J'ai essayé et trouvé erreur semblable. Après quelques recherches j'ai trouvé la solution postée sur https://github.com/doctrine/DoctrineModule/issues/175. Ce qui fonctionne

Pour mettre en œuvre que vous devez faire quelques changements comme ça

Dans la méthode module.php ajouter getFormElementConfig:

public function getFormElementConfig() 
{ 
    return array(
     'invokables' => array(
      'addForm' => 'Users\Form\addForm', 
     ), 
     'initializers' => array(
      'ObjectManagerInitializer' => function ($element, $formElements) { 
       if ($element instanceof ObjectManagerAwareInterface) { 
        $services  = $formElements->getServiceLocator(); 
        $entityManager = $services->get('Doctrine\ORM\EntityManager'); 

        $element->setObjectManager($entityManager); 
       } 
      }, 
     ), 
    ); 
} 

dans votre classe de forme addForm.php, remplacez constructeur avec méthode init:

namespace Users\Form; 
use Zend\Form\Form; 
use DoctrineModule\Persistence\ObjectManagerAwareInterface; 
use Doctrine\Common\Persistence\ObjectManager; 
class addForm extends form implements ObjectManagerAwareInterface 
{ 
    protected $objectManager; 
    public function setObjectManager(ObjectManager $objectManager) 
    { 
     $this->objectManager = $objectManager; 
    } 

    public function getObjectManager() 
    { 
     return $this->objectManager; 
    } 

    //public function __construct($name = null) 
    public function init() 
    { 
     $this->setAttribute('method', 'post'); 
     $this->setAttribute('enctype','multipart/formdata'); 
     $this->add(array(
      'type' => 'DoctrineModule\Form\Element\ObjectMultiCheckbox', 
      'name' => 'option', 
      'options' => array(
       'label' => 'Options Véhicule', 
       'object_manager' => $this->getObjectManager(), 
       'target_class' => 'Users\Entity\optionsvehicule', 
       'property'  => 'property' 
      , ))); 

dans votre classe contrôleur, appel forme obejct par Locator service:

//$form = new addForm(); 
$forms = $this->getServiceLocator()->get('FormElementManager'); 
$form = $forms->get('addForm'); 
+0

merci , s'il vous plaît pourquoi nous ajoutons cette ligne; 'property' => 'property' ceci a une erreur: La propriété "property" est introuvable dans l'objet "Vehicules \ Entity \ optionsvehicule" –

+0

Eh bien, cela devrait être 'property '=>' propertyName'' où propertyName est un champ qui est montré avec chaque case à cocher.Il pourrait donc être comme 'property '=>' username'' –

+0

merci beaucoup –

0

La propriété $objectManager est indéfinie. Cela est dû au fait que vous appelez la méthode $this->getObjectManager() immédiatement dans le __construct() et avant de définir la variable. Le formulaire dépend du gestionnaire d'objets; Vous pouvez donc simplement l'ajouter en tant qu'argument de constructeur, ce qui garantit qu'il est défini avant l'utilisation de la classe.

En outre, le constructeur ne doit être utilisé que pour la configuration des propriétés initiales et de l'état initial de l'objet, utilisez init() pour modifier les éléments de formulaire.

class addForm extends Form 
{ 
    protected $objectManager; 

    public function __construct(ObjectManager $objectManager) 
    { 
     parent::__construct('add-form'); 

     $this->objectManager = $objectManager; 
    } 

    // The form element manager will call `init()` 
    // on the form so we can add the elements in this method 
    public function init() { 
     //.... 
     $this->setAttribute('method', 'post'); 
     $this->setAttribute('enctype','multipart/formdata'); 

     // $this->add(.... 
     // more elements added here 
    } 

} 

La dernière chose est d'enregistrer une usine qui fait l'injection-t

class Module { 

    public function getFormElementConfig() { 
     return array(
      'factories' => array(
       'ModuleName\Form\FooForm' => function($formElementManager) { 
        $serviceManager = $formElementManager->getServiceLocator(); 
        $objectManager = $serviceManager->get('ObjectManager'); 

        $form = new Form\FooForm($objectManager); 

        return $form; 
       }, 
      ), 
     ); 
    } 
} 
+0

je suis vraiment confus, je pensais que tous les éléments de la forme sont ajoutés à la forme en raison du constructeur avec "$ this-> add (... "Je posterai toute ma forme pour clarifier les choses –

+0

merci, j'ai fait tout ce que vous avez dit mais j'ai eu une erreur: Propriété" propriété "introuvable dans l'objet" Vehicules \ Entity \ optionsvehicule "!! –

Questions connexes