Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 04-01-2010 15:28:19

m1b
Membre
Date d'inscription: 04-05-2009
Messages: 44

Conception : Metas dynamiques

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 smile ,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 smile 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 ? smile

Hors ligne

 

#2 04-01-2010 16:11:33

Guillhomme
Membre
Date d'inscription: 09-10-2008
Messages: 102

Re: Conception : Metas dynamiques

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 smile

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 wink

Hors ligne

 

#3 04-01-2010 16:12:46

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: Conception : Metas dynamiques

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


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#4 11-01-2010 16:32:14

m1b
Membre
Date d'inscription: 04-05-2009
Messages: 44

Re: Conception : Metas dynamiques

Re hello,

J'ai fait petit plugin pour gérer cela (merci d'être indulgent je suis à mes débuts smile)
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 tongue)

Requis :
une table "Metas" avec les champs suivants :

Code:

--
-- 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 :

Code:

// 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

Code:

<?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

 

#5 12-01-2010 13:42:22

m1b
Membre
Date d'inscription: 04-05-2009
Messages: 44

Re: Conception : Metas dynamiques

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

 

#6 12-01-2010 15:52:33

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: Conception : Metas dynamiques

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


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages