Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
J'ai un problème dans l'utilisation d'un formulaire en modal. Quand je clique sur mon bouton dans ma vue, ma modal renvois une erreur
"Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for Suivi\Form\MaintenanceForm"
J'ai simplifié au maximum mon formulaire pour trouver d'où pouvait venir l'erreur mais je trouve pas du tout !
Voici mon formulaire:
[lang=php]<?php namespace Suivi\Form; use Zend\Form\Form; class MaintenanceForm extends Form { public function __construct() { parent::__construct('maintenance'); $this->add( [ 'name' => 'submit', 'type' => 'submit', 'attributes' => [ 'value' => 'Valider', 'class' => 'btn btn-success center-block', 'id' => 'graph-submit' ], ] ); } }
Voici maintenant comment il est appelé dans ma vue (les .js semblent ok vu que ma modal s'ouvre mais j'ai mon petit retour "Une erreur est survenue".
[lang=php] <a href="<?php echo $this->url('suivi/maintenance', ['action' => 'add']); ?>" data-trigger="modal" class="btn inblue-btn btn-success inblue-btn-submit"><?php echo $this->translate( 'Ajouter une maintenance' ); ?></a>
Et pour finir le controller
[lang=php] /** * Action add * Ajoute une maintenance pour un véhicule * * @return ViewModel */ public function addAction() { /** @var \Zend\Http\Request $request */ $request = $this->getRequest(); if (!$request->isXmlHttpRequest()) { return $this->redirect()->toRoute('suivi/maintenance'); } $form = $this->getServiceLocator()->get('Suivi\Form\MaintenanceForm'); $restService = $this->getServiceLocator()->get('RestService'); /** @var \Zend\Http\Request $request */ $request = $this->getRequest(); if ($request->isPost()) { $maintenance = new Maintenance(); $form->setInputFilter($maintenance->getInputFilter()); $form->setData($request->getPost()); //->toArray()); if ($form->isValid()) { $maintenance->exchangeArray($form->getData()); $restService->call( 'inblue/maintenance', $maintenance->toRest(), \Zend\Http\Request::METHOD_POST ); return new JsonModel(['redirect_route' => $this->url()->fromRoute('suivi/maintenance')]); } } return $this->modal( [ 'title' => 'Ajouter une maintenance', 'body' => $form, 'confirmButton' => 'Ajouter', 'routeAction' => $this->url()->fromRoute('suivi/maintenance', ['action' => 'add']) ] ); }
J'ai d'autres formulaires où j'effectue la même chose et ça fonctionne. Enfin j'imagine qu'il y a un truc qui diffère quelque part.
Si quelqu'un a une idée pour m'aiguiller, merci beaucoup , bonne journée !
Dernière modification par zigo (25-02-2016 14:06:28)
Hors ligne
Bonjour,
ce qui nous aiderait a te debugger, c'est ta config ou il est déclaré. La clé form_elements en gros. Est il en invokables déclaré correctement ?
D'autre part, j'ai un doute sur ton utilisation du service manager pour récupérer ton formulaire, je pense que ce n'est pas ton service manager qui à la tâche de cela, mais plutot ton formManager
Donc en gros tu dois faire :
$serviceLocator->get('formElementManager')->get('Suivi\Form\MaintenanceForm');
Testes cela et fait nous un retour.
Hors ligne
Merci de ta réponse, j'ai trouvé le problème entre temps. Je n'avais pas déclaré le formulaire dans mon Module.php et la function getServiceConfig
En ajoutant ça
'Suivi\Form\MaintenanceForm' => function (ServiceLocatorInterface $serviceLocator) { return new MaintenanceForm($serviceLocator); }
Tout fonctionne ! ma modal s'ouvre correctement avec mon formulaire.
Tu penses que l'utilisation de service manager dans ce contexte n'est pas bonne ? J'avais mis un formulaire simplifié pour l'exemple mais ça change peut être rien.
Hors ligne
Hello, c'est pas au service manager de s'occuper de la création des formulaires mais au plugin manager : FormElementManager.
Donc ça doit être dans la clé form_elements effectivement. Ensuite l'utilisation de fonction anonymes pour ça c'est pas la bonne solution et enfin utilises le fichier de configuration . Il y a plein de sujet qui expliquent comment bien le faie ici.
Hors ligne
Oui comme dit Orkin évites les fonction anonyme, cela fait péter le cache de ta config.
Il faudrait plutôt utiliser une factory sous la clé
[lang=php] <?php return [ "form_elements" => [ "factories" => [ "ta_clé" => "FQCN de ta factorie pour ton form" ] ]
et ton service locator via la clé formElementManager appellerai cette factory.
Hors ligne
Okay merci à vous !
Hors ligne