Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
J'ai un problème sur mon application ZF2, j'ai deux actions du controller qui n'aboutissent pas avec l'erreur suivante :
"The requested controller was unable to dispatch the request."
Alors que sur mon controller les actions index, edit/xx , delete/xx fonctionnent (ou "xx" sont les id). Pourtant les deux autres actions que j'ai ajoutées sont aussi du type "otheraction/id".
Du coup je comprends pas d'ou ça vient
Voici les codes
La route en question :
'caracteristique' => array( 'type' => 'Segment', 'options' => array( 'route' => '/caracteristique[/:action][/:id]', 'constraints' => array( 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', 'id' => '[0-9]+', ), 'defaults' => array( 'controller' => 'Application\Controller\Caracteristique', ), ), 'may_terminate' => true, ),
Le controller :
<?php namespace Application\Controller; use Zend\Mvc\Controller\AbstractActionController, Zend\View\Model\ViewModel, Application\Form\CaracteristiqueForm, Doctrine\ORM\EntityManager, Application\Entity\Caracteristique; class CaracteristiqueController extends AbstractActionController { /** * @var Doctrine\ORM\EntityManager */ protected $em; public function setEntityManager(EntityManager $em) { $this->em = $em; } public function getEntityManager() { if (null === $this->em){ $this->em = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager'); } return $this->em; } public function indexAction() { return new ViewModel(array( 'serializer' => \Zend\Serializer\Serializer::factory('phpserialize'), 'caracteristiques' => $this->getEntityManager()->getRepository('Application\Entity\Caracteristique')->findAll() )); } public function addAction() { $form = new CaracteristiqueForm(); $form->get('submit')->setAttribute('label', 'Add'); $request = $this->getRequest(); if ($request->isPost()) { $caracteristique = new Caracteristique(); $form->setInputFilter($caracteristique->getInputFilter()); $form->setData($request->getPost()); if ($form->isValid()) { $caracteristique->populate($form->getData()); $this->getEntityManager()->persist($caracteristique); $this->getEntityManager()->flush(); // Redirect to list of caracteristiques return $this->redirect()->toRoute('caracteristique'); } } return array('form' => $form); } public function editAction() { $id = (int)$this->getEvent()->getRouteMatch()->getParam('id'); if (!$id) { return $this->redirect()->toRoute('caracteristique', array('action'=>'add')); } $caracteristique = $this->getEntityManager()->find('Application\Entity\Caracteristique', $id); $form = new CaracteristiqueForm(); $form->setBindOnValidate(false); $form->bind($caracteristique); $form->get('submit')->setAttribute('label', 'Edit'); $request = $this->getRequest(); if ($request->isPost()) { $form->setData($request->getPost()); if ($form->isValid()) { $form->bindValues(); $this->getEntityManager()->flush(); // Redirect to list of albums return $this->redirect()->toRoute('caracteristique'); } } return array( 'id' => $id, 'form' => $form, ); } public function deleteAction() { $id = (int)$this->getEvent()->getRouteMatch()->getParam('id'); if (!$id) { return $this->redirect()->toRoute('caracteristique'); } $request = $this->getRequest(); if ($request->isPost()) { $del = $request->getPost('del'); if ($del == 'Oui') { $id = (int)$request->getPost('id'); $caracteristique = $this->getEntityManager()->find('Application\Entity\Caracteristique', $id); if ($caracteristique) { $this->getEntityManager()->remove($caracteristique); $this->getEntityManager()->flush(); } } // Redirect to list of caracteristiques return $this->redirect()->toRoute('application', array( 'controller' => 'caracteristique', 'action' => 'index', )); } return array( 'id' => $id, 'caracteristique' => $this->getEntityManager()->find('Application\Entity\Caracteristique', $id)->getArrayCopy() ); } public function remove_sortAction() { $id = (int)$this->getEvent()->getRouteMatch()->getParam('id'); if (!$id) { return $this->redirect()->toRoute('caracteristique'); } $request = $this->getRequest(); if ($request->isPost()) { $id_carac = $request->getPost('id_caracteristique'); $sort = $this->getEntityManager()->find('Application\Entity\Sort', $id); $caracteristique = $this->getEntityManager()->find('Application\Entity\Caracteristique', $id_carac); if ($sort && $caracteristique) { $caracteristique->remove_sort($sort); $this->getEntityManager()->flush(); } } return $this->response; } public function remove_competenceAction() { $id = (int)$this->getEvent()->getRouteMatch()->getParam('id'); if (!$id) { return $this->redirect()->toRoute('caracteristique'); } $request = $this->getRequest(); if ($request->isPost()) { $id_carac = $request->getPost('id_caracteristique'); $competence = $this->getEntityManager()->find('Application\Entity\Competence', $id); $caracteristique = $this->getEntityManager()->find('Application\Entity\Caracteristique', $id_carac); if ($competence && $caracteristique) { $caracteristique->remove_competence($competence); $this->getEntityManager()->flush(); } } return $this->response; } }
La portion de la vue ou les liens sont générés :
<ul id="ul_crt_cmp_<?php echo $caracteristique->__get('caracteristique_id'); ?>"> <?php foreach ($caracteristique->__get('competences') as $competence): ?> <li> <a id="cmp_<?php echo $caracteristique->__get('caracteristique_id'); ?>" class="ajax" href="<?php echo $this->url('caracteristique', array('action'=>'remove_competence', 'id' => $competence->__get('competence_id')));?>">X</a> - <?php echo $competence->__get('competence_name'); ?> </li> <?php endforeach; ?> </ul>
Voilà, si vous avez une idée n'hésitez pas ^^
P.S : à la base c'est une action ajax mais dans les deux cas (ajax ou appel de l'url en dur) je me retrouve avec une 404 unable to dispatch
Hors ligne
Salut, je suppose que se sont ces deux actions qui posent problème ?
remove_sortAction et remove_competenceAction ?
Hors ligne
Oula oui pardon, j'ai parlé des méthodes qui marchent mais pas de celles qui ne marchent pas xD ce sont bien les remove_sortAction et remove_competenceAction !
Hors ligne
La réponse est simple pas de underscore dans un nom de fonction . Toujours une majuscule à la place donc ça donnerait :
removeSortAction et removeCompetenceAction et pour y accéder ça doit être ça : remove-sort et remove-competence
Hors ligne
Excuse moi j'ai oublié de te répondre hier, en effet ça fonctionne ! merci J'avais pas compris que la CamelCase est obligatoire sur zf2, je l'aime pas trop cette pratique mais bon
Hors ligne
C'est plus propre que les underscore partout ça fait parti des conventions de nommage .
Hors ligne
Pages: 1