Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > symfony
symfony Forum d'entraide sur le framework PHP symfony. Avant de poster : cours symfony et FAQ symfony
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/02/2011, 00h23   #1
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : août 2006
Messages : 49
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : août 2006
Messages : 49
Points : 25
Points : 25
Par défaut Admin Generator et route

Bonjour,

J'ai généré un module au moyen de l'admin generator et lui ai ajouté des actions pour faire un traitement particulier des données de la table. Parmi celles-ci, se trouve un formulaire (dérivé directement de sfForm). J'ai donc deux actions : ListEditPoste et ListCreatePoste qui fonctionnent correctement quand on les appelle depuis un lien autogénéré via le generator.yml :
Code :
1
2
3
4
_list_td_actions.php (dans le cache)
[...]
<?php echo link_to(__('Postes', array(), 'messages'), 'copisim_periode/ListEditPoste?id='.$copisim_periode->getId(), array()) ?>
[...]
Mais si je reproduis ce lien dans ma balise form avec un url_to() :
Code :
"<form action="<?php echo url_for('copisim_periode/ListCreatePoste?id='.$copisim_periode->getId()); ?>" method="post">
j'obtiens une erreur de route :
Code :
1
2
404 | Not Found | sfError404Exception
Action "copisim_periode/1" does not exist.
J'ai du mal à saisir pourquoi ça marche pour l'admin generator et pas pour moi...

J'ai aussi testé (en vain - la route n'existe pas) avec sf_route :
Code :
<form action="<?php echo url_for(array('sf_route' => 'copisim_periode_list_create_poste', 'sf_subject' => $copisim_periode)); ?>" method="post">
Et google ne m'a pas aidé non plus...

Bref, faut-il que je crée une route supplémentaire (sachant qu'elle existe déjà forcément quelque part) ? ou bien abandonner l'admin generator (qui pourtant est fantastique) pour ce module (du boulot en perspective) ? ou bien (mais je m'y refuse) copier le lien en dur dans le template ? Au final, j'aimerais surtout comprendre...
CaraG33k est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2011, 02h01   #2
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Qu'as tu dans ton fichier route.yml ?

Quel version de symfony ?
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2011, 09h47   #3
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : août 2006
Messages : 49
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : août 2006
Messages : 49
Points : 25
Points : 25
Symfony 1.4.8.

Mon routing.yml était celui par défaut à la création de l'appli de backend et des admin_modules. Le but étant aussi de découvrir les possibilités de l'admin generator.
L'erreur que j'obtenais était due au fait que les routes par défaut étaient présentes et donc à la lecture, symfony interprétait la route :
Code :
1
2
default:
  url:   /:module/:action/*
J'ai donc viré (commenté pour le moment) ces routes et il n'en demeure pas moins qu'il ne trouve toujours pas l'action :
Code :
1
2
404 | Not Found | sfError404Exception
Empty module and/or action after parsing the URL "/copisim_poste/1/ListEditPoste" (/).
Et pourtant la même url collée dans la ligne de commande me renvoie sur la bonne page.
Il me vient une idée en écrivant : est ce que l'admin generator ne créerait pas des routes uniquement pour la méthode GET ? Ce qui expliquerait pourquoi la route existe bel et bien quand on y accède par lien web mais pas lorsque c'est un form avec method=post qui y fait référence...

Pour info, ce qui nous intéresse encore dans le routing.yml :
Code :
1
2
3
4
5
6
7
8
9
10
[...]
copisim_periode:
  class: sfDoctrineRouteCollection
  options:
    model:                CopisimPeriode
    module:               copisim_periode
    prefix_path:          /copisim_periode
    column:               id
    with_wildcard_routes: true
[...]
Edit : je confirme, si je transforme mon form pour utiliser la methode GET, je n'ai plus de soucis de route... Reste à faire un choix entre ajouter une route pour POST ou garder le formulaire en GET (j'aime pas trop). Dans le cas de la première solution, y a-t-il un attribut pour y faire référence directement dans la sfDoctrineRouteCollection copisim_periode ou dois-je faire au plus simple en rajoutant juste la route à la fin ?

Edit bis : à la lecture rapide de la doc de la classe sfDoctrineRouteCollection, pour pouvoir prendre directement en compte ma route, il faudrait que je crée une classe similaire (voire dérivée ?)... Je pense que je vais me contenter d'une route ajoutée à la main dans le routing.yml pour le moment.
CaraG33k est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2011, 12h16   #4
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Si tu veux bien utiliser le système de route, il est important de désactiver les routes par défaut, ou, au pire, de les laisser en dernière lignes du fichier.

Le fichier route.yml est parsé du début à la fin, ce qui implique deux choses :
  • Il faut mettre les routes spécifique avant les routes générale, surtout si elles partagent une même racine d'url.
  • Il faut mettre les routes les plus utilisées par tes clients au début du fichier pour en accélérer la résolution.
En effet, dés que le moteur de route en trouve une qui répond à sa recherche, il abandonne.

C'est aussi pour cela qu'il est plus intéressant, dans la génération des URL de passer par le nom de la route plutôt que de laisser le moteur chercher par lui même. Plus rapide et plus sur. Pour les routes collections elles sont en réalité découpées en de multiple route avec un surfixe pour les identifier, tu trouveras cela facilement a partir du CLI de symfony et de l'option qui traite les routes.

Ta méthode pour avoir une route spécifique en plus de celles de la collection me semble la bonne et est celle préconisée par symfony dans jobeet. La modification de l'objet collection ne peut se justifier que si tu as un très grand nombre de cas similaires dans tes applications.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h30.


 
 
 
 
Partenaires

Hébergement Web