Venez baraguiner avec la communauté !
Vous n'êtes pas identifié.
Bonjour à tous,
J'ai découvert la ferme du web il y a peu et dans ce forum il y a des sujets traitant du framework Symfony. J'espère être au bon endroit sinon excusez-moi d'avance.
Je débute avec Symfony, j'ai fait le tuto Jobeet consulté plusieurs documents mais j'ai pas réussi à résoudre un problème.
Voila mon soucis les URL avec Symfony ou il faut afficher des photos.
Je travail avec un serveur Apache en local ou j'ai indiqué dans les virtual host suivant
<VirtualHost *:80>
ServerName zzzz
DocumentRoot "/home/aaaaa/dev/server/comp/php/web"
DirectoryIndex index.php
<Directory "/home/aaaaa/dev/server/comp/php/web">
AllowOverride All
Allow from All
</Directory>
Alias /sf /home/aaaaa/dev/server/comp/php/lib/vendor/symfony/data/web/sf
<Directory "/home/aaaaa/dev/server/comp/php/lib/vendor/symfony/data/web/sf">
AllowOverride All
Allow from All
</Directory>
Alias /trombi "/home/aaaaa/dev/server/comp/php/apps/frontend/modules/trombi"
<Directory "/home/aaaaa/dev/server/comp/php/apps/frontend/modules/trombi">
AllowOverride All
Allow from All
</Directory>
Alias /vignette "/home/aaaaa/dev/server/local/photo/vignette"
<Directory "/home/kg710064/dev/tbs-server/local/photo/vignette">
AllowOverride All
Allow from All
</Directory>
Alias /identite "/home/aaaaa/dev/server/local/photo/identite"
<Directory "/home/aaaaa/dev/server/local/photo/identite">
AllowOverride All
Allow from All
</Directory>Dans le fichier routing.yml de symfony j'y indique :
photo_format:
url: /zzzz/trombi/photo/:format/:id.jpg
param: { module: trombi , action: show }trombi est le nom du module de l'appli. Le format peut etre soit vignette soit identite ( ce sont les alias dans le apache local) est le id est dans une base de donnée. L'application est relié à cette base de donnée.
Ce que je voudrais c'est que dans mon navigateur quand je tape /zzzz/trombi/photo/:format/:matricule.jpg ça me fasse ce qui est indiqué dans executeShow qui est situé dans action.class.php. J'ai laissé le code par défaut qui est
$this->agent = Doctrine_Core::getTable('Agent')->find(array($request->getParameter('id')));
$this->forward404Unless($this->agent);Je pensais qu'en tapant l'url cité plus haut ca m'affiche les infos d'une personne .Au lieu de ça j'ai la photo qui apparait. C'est ce qui me fait dire que je me suis trompé quelque part
Pouvez-vous m'aider ?
Désolé de la plongeur du post et j'espère avoir été clair.
Hors ligne
J'ai vraiment pas compris ton histoire de vhosts, dans symfony tout passe par index.php (qui est un controller, aussi frontend_dev.php, etc...) et le framework ne fonctionnera pas sans passer par ce dernier.
Là tu fais un alias inutile:
Alias /trombi "/home/aaaaa/dev/server/comp/php/apps/frontend/modules/trombi"
<Directory "/home/aaaaa/dev/server/comp/php/apps/frontend/modules/trombi">
AllowOverride All
Allow from All
</Directory>Cet alias ne fonctionnera jamais ! Tu ne passes pas par le controller (index.php dans web/), là où tout le moteur est exécuté.
Commence par enlever cet alias de la conf d'apache.
Dans Symfony, pour avoir des URLs personnalisées tu as juste à configurer les routes comme tu le souhaites:
photo_format:
url: /trombi/photo/:format/:id.jpg
param: { module: trombi , action: show }
Inutile donc d'avoir un alias /trombi, tu le fais via l'url de la route dans routing.yml, ce qui est beaucoup plus ismple et fait pour ça
!
Hors ligne
Bonjour Sybio,
Tout d'abord merci de ta réponse. Je suis loin d'avoir compris le fonctionnement de symfony.
J'ai fait comme tu as dit j'ai enlevé l'alias du virtual host dans Apache
Dans le routing.yml j'ai indiqué
photo_format:
url: /trombi/:format/:id.jpg
param: { module: trombi , action: show }
requirements: { format: '(vignette) | (identite)' }J'ai mis le requirement car le format peut être de deux types possibles
Ce qui fait que quand je tape http://DNS/frontend_dev.php/trombi/photo/vignette/8755.jpg j'obtiens comme erreur
Action "trombi/photo" does not exist.
Alors que trombi c'est le nom du module et photo le nom du dossier qui contient les dossiers vignette et identite qui contiennent les photos. De plus vu que dans le routing.yml j'ai indiqué l'action show je pensais que symfony comprenait que pour cette url le module trombi est demandé ainsi que l'action show de ce module. Je me suis encore trompé ?
Corrige-moi si je me trompe mais c'est dans frontend_dev.php que je dois indiquer que photo correspond à un dossier ?
Désolé de toutes ces questions mais j'ai du mal à comprendre malgré la lecture de tutoriel comme Jobeet.
EDIT
En créant une action nommée executeVignette et executeIdentite dans actions.class.php et un template associé à chaqu'une des deux actions.
Dans le routing j'ai voulu faire
photo_format:
url: /photo/:format/:id.jpg // j'ai changé le nom du module de trombi en photo
param: { module: photo , action: '(vignette) | (identite)' }
requirements: { format: '(vignette) | (identite)' }mais j'ai une erreur Action "photo/vignetteidentite" does not exist.
Cela veut dire que pour chaque format de photo dont je dispose je vais devoir creer une route spécifique ?
photo_vignette:
url: /photo/vignette/:id.jpg // j'ai changé le nom du module de trombi en photo
param: { module: photo , action: vignette }puis
photo_identite:
url: /photo/vignette/:id.jpg
param: { module: photo , action: identite }Si j'ai que 2 formats c'est pas la mort mais si ça augmente ca va faire beaucoup non ? De plus il faudra donc que je creer les actions et les templates qui y sont attachés. Pour un projet symfony avoir beaucoup de template et d'action dans action.class.php est-il gênant ou non ?
Dernière modification par apprenti (20/05/2011 11:19:30)
Hors ligne
(Re)bonjour,
Désolé de vous embêtez mais j'ai une seconde question sur le même sujet.
J'ai l'adresse URL suivante http://local-tbs/frontend_dev.php/photo/vignette/207300.jpg ou 207300 correspond à un id en base de donnée
Le code me semble bon mais j'ai l'erreur This request has been forwarded to a 404 error page by the action "photo/vignette".
Ce qui veut dire que l'id n'a pas été trouvé dans la base de donnée. Pourtant l'id existe bien.
Le routing de ma route est la suivante :
photo_vignette:
url: /photo/vignette/:id.jpg
param: { module: photo , action: vignette }
requirements:
sf_method: [get]Mon code de l'action vignette est la suivante
public function executeVignette(sfWebRequest $request)
{
$this->employes = Doctrine_Core::getTable('Employe')->find(array($request->getParameter('id')));
$this->forward404Unless($this->employe);
}// Dans ce code je veux que symfony récupère un employé selon son id qui à été transmit en paramètre.
Le code du template de vignette est le suivant
<h1>Agents List</h1>
<table>
<thead>
<tr>
<th>Id</th>
<th>Civilite</th>
<th>Mail</th>
<th>Created at</th>
<th>Updated at</th>
<th>Deleted at</th>
</tr>
</thead>
<tbody>
<?php foreach ($employes as $employe): ?>
<tr>
<td><a href="<?php echo url_for('photo/show?id='.$employe->getId()) ?>"><?php echo $employe->getId() ?></a></td>
<td><?php echo $employe->getCivilite() ?></td>
<td><?php echo $employe->getMail() ?></td>
<td><?php echo $employe->getCreatedAt() ?></td>
<td><?php echo $employe->getUpdatedAt() ?></td>
<td><?php echo $employe->getDeletedAt() ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>// Affichage des informations relative à cet employe.
Je ne vois pas l'erreur.
D'avance je vous remercie de vos suggestions.
Hors ligne
DJo a écrit:
Ne serait-ce pas $this->forward404Unless($this->employe); qui est executé car l'ID n'existe pas ?
Oui en effet mais justement le problème est que l'id existe dans la base de donnée. C'est aussi ce que me dit la barre de debogage de symfony
Match route "photo_vignette" (/photo/vignette/:id.jpg) for /photo/vignette/207300.jpg with parameters array ( 'module' => 'photo', 'action' => 'vignette', 'id' => '207300',) 2 Info sfFilterChain Executing filter "sfRenderingFilter" 3 Info sfFilterChain Executing filter "sfExecutionFilter" 4 Info photoActions Call "photoActions->executeVignette()" 5 Info Doctrine_Connection_Pgsql exec : SET NAMES 'UTF8' - () 6 Info Doctrine_Connection_Statement execute : SELECT a.id AS a__id, a.civilite AS a__civilite, a.mail AS a__mail, a.created_at AS a__created_at, a.updated_at AS a__updated_at, a.deleted_at AS a__deleted_at FROM employe a WHERE (a.id = ?) LIMIT 1 - (207300) 7 Error sfError404Exception This request has been forwarded to a 404 error page by the action "photo/vignette".
Pourtant j'ai la table de la base de donnée sous les yeux et je peux certifier que 207300 est bien présent dans la colonne id de la table agent. C'est pour ça que je ne comprends pas.
Hors ligne
Quand tu récupères l'employé, tu as un s pour $this->employes, alors que dans le forward tu l'as oublié: $this->employe ! $this->employe n'existe pas, le forward 404 est donc exécuté !
Si j'ai que 2 formats c'est pas la mort mais si ça augmente ca va faire beaucoup non ? De plus il faudra donc que je creer les actions et les templates qui y sont attachés. Pour un projet symfony avoir beaucoup de template et d'action dans action.class.php est-il gênant ou non ?
Quand à ton URL, pour le paramètre format, c'est vrai que mettre plus de 3-4 formats risque de devenir lourd à lire ! (requirements: { format: '(vignette) | (identite)' }). Je te conseil donc de tester soit directement dans l'action si le format récupéré correspond à l'un de ta liste, via une méthode par exemple, sinon tu lances un forward404 ! Plus compliqué, tu peux également créer une route personnalisée http://www.symfony-project.org/more-wit … ed-Routing
Hors ligne
Bonjour Sybio,
Merci de ta réponse.
Je n'avais pas posté la résolution de ce post mais c'est en corrigeant les éléments que tu as cité.
Désolé .
Hors ligne