Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Hello à tous,
J'aimerais implémenter la méthode que j'utilise habituellement pour générer mes mots clés mais cette fois-ci avec Zend ,mais j'ai besoin d'aide des habitués de la plateforme.
En fait la première chose c'est que je veux c'est stocker dans ma base de données les mots clés afin que l'on puisse les modifier via le back-office par la suite.
Pour moi le concept est le suivant lors du chargement d'une page on passe par un controller-action. On peut donc dire que controller-action ex: (client-modifier) est une clé unique. Ensuite on check dans la base si la clé "client-modifier" existe si ce n'est pas le cas on l'insert dans la base de donnée comme ça on se trouve avec par défaut avec un mot clé qui sera dans notre cas "client-modifier" que l'on pourra modifier à sa guise par la suite via le back-office. Zend pourra ensuite charger automatiquement le mot clé en recherchant la valeur ayant pour clé "controller-action".
1) Est-ce que c'est censé de faire ça ? J'ai regardé sur le forum je n'ai pas vu de technique du genre, mais en tout cas le but reste qu'un utilisateur loggué via le back-office puisse modifier ces mots-clés.
2) Est-ce qu'il existe un controller principal qu'on peut créer et qui est utilisé en permanence par l'application. (genre dans cakephp oui oui cake et bien ça s'appelle app_controller.php dans Zend je sais pas si c'est le même principe)
Bon après on va dire oui mais les mots clés n'ont plus d'incidences etc... ( mais je vais utiliser le même concept pour les autres types de meta )
Une idée ?
Hors ligne
Bonjour,
1) Pour lister toutes les actions de tes controllers, il y a l'objet Reflexion qui est présent nativement dans PHP. Il te permet de récupérer toutes les méthodes, c'est pas plus simple ? Ou alors j'ai rien compris
2) Regarde du coté des plugins, ou si tu veux rester dans le même esprit que Cake, tu peux par exemple créer une class Controller ( héritant de la class Abstract de Zend), que tu feras hérité de tous tes controlleurs.
Tu y implémentes la méthode init() ( elle est exécutée en premier par le controlleur si il est présente ).
Attention a bien mettre parent::init(); si jamais tu t'en sers deja !
Bon courage
Hors ligne
La solution logique avec le ZF, c'est d'utiliser un helper d'action :
http://framework.zend.com/manual/en/zen … ingyourown
Tu peux voir un schéma de fonctionnement à l'adresse suivante :
http://www.kitpages.fr/zf_helper_plugin.php
A+, Philippe
Hors ligne
Re hello,
J'ai fait petit plugin pour gérer cela (merci d'être indulgent je suis à mes débuts )
A chaque page le plugin vérifie si les balises méta existent pour la page/action concernée, si ce n'est pas le cas 3 balises sont ajoutés pour chaque langues du site. (dans mon cas 2 langues). Ensuite le plugin renvoie à la vue les balises Métas de la page en cours.
Après il faudra vous faire une interface pour modifier ces données (si vous voulez pas passer par phpmyadmin )
Requis :
une table "Metas" avec les champs suivants :
-- -- Structure de la table `metas` -- CREATE TABLE IF NOT EXISTS `metas` ( `id` int(11) NOT NULL AUTO_INCREMENT, `meta` text NOT NULL, `meta_type` varchar(50) NOT NULL, `controller_action` varchar(50) NOT NULL, `id_langue` int(11) NOT NULL, `date_add` datetime NOT NULL, `date_upd` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=19 ;
Dans votre fichier index il faut avoir ceci :
// Sauve les paramètres http dans le registre $frontController = Zend_Controller_Front::getInstance(); $request_http = new Zend_Controller_Request_Http(); $frontController->setRequest($request_http); $registry->request_http=$request_http;
Et le plugin
<?php class Plugin_Meta extends Zend_Controller_Plugin_Abstract { /* * Plugin pour les balises Meta * - Enregistre automatiquement les Metas * - Passe à la vue les Metas de la page en cours * !!! Effectue cette opération uniquement si le controlleur/action existe */ public function preDispatch() { $registry = Zend_Registry::getInstance(); $request_http = $registry->request_http; $session = $registry->session; // Récupère le nom de l'action et la classe et tente de créer l'objet puis de lui tester sa méthode $dispatcher = Zend_Controller_Front::getInstance()->getDispatcher(); $controllerClass = $dispatcher->getControllerClass($request_http); $controllerclassName = $dispatcher->loadClass($controllerClass); $action = $dispatcher->getActionMethod($request_http); $controllerObject = new ReflectionClass($controllerclassName); // Si la méthode existe tente d'enregistrer les balises meta if($controllerObject->hasMethod($action)){ // Nom de la clé unique -> controller + action $controller_action = $request_http->getControllerName().'-'.$request_http->getActionName(); // On vérifie si les métas existent pour la page $db = $registry->db; $req = $db->select() ->from(_METAS_,'COUNT(*) as nbre') ->where('controller_action="'.$controller_action.'"'); $res = $db->fetchAll($req); $nbre = $res[0]['nbre']; // Si les métas n'existent pas on les ajoute if($nbre<=0){ // Deux boucles (1=francais/2=allemand) for($i=1;$i<=2;$i++){ $date = new Zend_Date(); $meta = new Model_Meta(); $meta = $meta->createRow(); $meta->meta = $controller_action; $meta->meta_type = 'title'; $meta->controller_action = $controller_action; $meta->id_langue = $i; $meta->date_add = $date->get('YYYY-MM-dd HH:mm:ss'); $meta->date_upd = $date->get('YYYY-MM-dd HH:mm:ss'); $meta->save(); $meta = new Model_Meta(); $meta = $meta->createRow(); $meta->meta = $controller_action; $meta->meta_type = 'keywords'; $meta->controller_action = $controller_action; $meta->id_langue = $i; $meta->date_add = $date->get('YYYY-MM-dd HH:mm:ss'); $meta->date_upd = $date->get('YYYY-MM-dd HH:mm:ss'); $meta->save(); $meta = new Model_Meta(); $meta = $meta->createRow(); $meta->meta = $controller_action; $meta->meta_type = 'description'; $meta->controller_action = $controller_action; $meta->id_langue = $i; $meta->date_add = $date->get('YYYY-MM-dd HH:mm:ss'); $meta->date_upd = $date->get('YYYY-MM-dd HH:mm:ss'); $meta->save(); } } // On sélectionne les métas pour la page affichée // Meta Title $req = $db->select() ->from(_METAS_) ->where('controller_action="'.$controller_action.'" AND meta_type="title" AND id_langue='.$session->id_langue); $res = $db->fetchAll($req); $meta_title = $res[0]['meta']; $view = Zend_Layout::getMvcInstance()->getView('layout'); $view->meta_title = $meta_title; // Meta Keywords $req = $db->select() ->from(_METAS_) ->where('controller_action="'.$controller_action.'" AND meta_type="keywords" AND id_langue='.$session->id_langue); $res = $db->fetchAll($req); $meta_keywords = $res[0]['meta']; $view = Zend_Layout::getMvcInstance()->getView('layout'); $view->meta_keywords = $meta_keywords; // Meta Description $req = $db->select() ->from(_METAS_) ->where('controller_action="'.$controller_action.'" AND meta_type="description" AND id_langue='.$session->id_langue); $res = $db->fetchAll($req); $meta_description = $res[0]['meta']; $view = Zend_Layout::getMvcInstance()->getView('layout'); $view->meta_description = $meta_description; } } }
Dernière modification par m1b (12-01-2010 13:40:58)
Hors ligne
Bon petite modification ajoutée à présent, les métas sont enregistrées uniquement pour des controlleurs/actions qui existent (surtout dans le cas ou des petits malins modifient les urls)
Hors ligne
J'aurais bien vu le même traitement dans un helper au lieu d'un plugin.
La différence est que dans un plugin, tu n'est pas encore certain que l'action est choisie définitivement. Si un autre plugin (typiquement une vérification de droits) change le module/controller/action, tu vas afficher (ou enregistrer) tes métas sur la mauvaise page.
Un helper se comporte un peu comme un plugin, mais le preDispatch est lancé après les preDispatch des plugins et normalement l'action ne doit plus bouger.
Accessoirement dans un helper, ton controller est déjà instancié et il est accessible plus simplement (tu n'as pas besoin d'utiliser le dispatcher "manuellement"). Je pense que ça simplifierait un peu ton code de tout basculer dans un helper.
Bon cela dit ça ne change rien au principe de ton système, je note le truc dans un coin de ma tête, c'est intéressant !
A+, Philippe
Hors ligne