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