CMS Automne
http://www.automne-cms.org/forum/

Un module GAnalytics
http://www.automne-cms.org/forum/viewtopic.php?f=5&t=595
Page 1 sur 1

Auteur:  Chrys [ Mar Déc 15, 2009 11:04 am ]
Sujet du message:  Un module GAnalytics

Avant de commencer, merci à Damien pour qui je n'ai était qu'un guide et qui peut se vanter d'avoir écrit les quelques lignes de code de ce tuto.

Voici donc un petit tuto qui va vous guider pour la création d'un module non polymod dans Automne 3.x.x
Nul doute que cela en aidera plus d'un, j'espère avoir quelques commentaires pour "porter" ce module sous Automne 4.x.x

Quelques mots sur le besoin.
J'utilise les fonctionnalités offerte par GAnalytics pour la récolte des statistiques de fréquentation.
Comme vous le savez, Automne peut gérer plusieurs sites avec des noms de domaine différents.
Imaginons alors que sur mon serveur, je configure Automne pour utiliser deux sites
- http://www.monsite.fr
- http://www.monsite.en
Me voilà avec deux sites, l'un en français, l'autre en anglais. J'inscris dans l'outil GAnalytics ses deux noms de domaine et j'obtiens deux clés différentes pour l'insertion du code dans mes pages.
- UA-1234567-1 pour le site http://www.monsite.fr
- UA-1234567-2 pour le site http://www.monsite.en

Je peux faire des modèles de pages différents pour chaque langue, alors dans chaque modèle, j'incluerai le code adéquat pour effectuer la récolte des statistiques.
Le modèle des pages françaises inclut le code UA-1234567-1 et le modèle des pages anglaises, le code UA-1234567-2
Imaginons
- la page ID 11, page française qui inclut le code UA-1234567-1, j'y accède normalement avec l'URL : http://www.monsite.fr/web/11-ma-page.php
- la page ID 21, page anglaise qui inclut le code UA-1234567-2, j'y accède normalement avec l'URL : http://www.monsite.en/web/21-ma-page.php

Le problème est que je peux accéder à la page française avec le nom de domaine anglais (http://www.monsite.en/web/11-ma-page.php) et donc la clé présente dans la page est fausse (puisque c'est celle inscrite pour le nom de domaine http://www.monsite.fr).

Deux solutions :
1. Mettre du code PHP dans le modèle des pages pour insérer la bonne clé.
Le problème est qu'à chaque fois que je crée un nouveau modèle, il me faut penser à ajouter ce bloc PHP.
De plus, si j'ajoute un nouveau site Automne (par exemple http://www.monsite.es pour une version espagnole), je dois modifier tous mes modèles :-(
2. Créer une rangée qui contient du code PHP pour insérer la bonne clé.
En cas d'ajout d'un nouveau site, je n'ai que la rangée à modifier puis regénérer mon site. L'inconvénient (mineur) est que je dois ajouter un espace client dans tous mes modèles à l'endroit ou doit apparaitre l'insertion des GAnalytics.
Je dois également informer tous mes rédacteurs (genre j'en ai un peloton ;-) ) de ne pas oublier d'insérer cette rangée lors de la création de nouvelles pages (même si je peux la fixer comme rangée par défaut...)

Vous vous doutez bien qu'il existe en fait une troisième solution, le module GAnalytics.
Nous insérerons une balise spécifique dans les modèles (<ganalytics />) qui sera interprété lors de la génération des pages.

Auteur:  Chrys [ Mar Déc 15, 2009 11:07 am ]
Sujet du message:  Re: Un module GAnalytics

Première Etape : SQL
Avant de créer le module proprement dit, je crée une table pour enregistrer les clé GAnalytics pour chaque domaine configuré dans Automne.
Code :
CREATE TABLE `ganalytics` (
   `hostname` VARCHAR( 255 ) NOT NULL ,
   `id_ganalytics` VARCHAR( 255 ) NOT NULL ,
   PRIMARY KEY ( `hostname` )
) CHARACTER SET = latin1;


Je crée également une table de paramètre qui me permet de conserver en variable le script à intégrer en cas d'évolution (mineur) du code GAnalytics à inclure.
Notez que dans cette table, je prévoie un type de données (au cas ou) et que la valeur insérée contient une variable %id_site% qui sera exploitée lors du traitement.
Cette variable sera remplacée par la clé GAnalytics adéquate.
Code :
CREATE TABLE `ganalytics_parameters` (
   `id` INT( 5 ) NOT NULL ,
   `value` TEXT NOT NULL ,
   `type` VARCHAR( 255 ) NOT NULL ,
   PRIMARY KEY ( `id` )
) CHARACTER SET = latin1;

INSERT INTO `ganalytics_parameters` ( `id` , `value`,`type` )
VALUES (
'2', '
<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src=\'" + gaJsHost + "google-analytics.com/ga.js\' type=\'text/javascript\'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
var pageTracker = _gat._getTracker("%id_site%");
pageTracker._initData();
pageTracker._trackPageview();
</script>
', 'textarea'
);


Si vous utiliser un autre outil de récolte des fréquentations, vous pouvez ajuster l'insertion et y placer d'autres variables.

Auteur:  Chrys [ Mar Déc 15, 2009 11:11 am ]
Sujet du message:  Re: Un module GAnalytics

Deuxième Etape : La classe du module
Nous allons créer une classe qui va nous permettre de gérer les clés des noms de domaines.
La première étape est donc de créer un fichier ganalytics.php que vous placerez dans /automne/classes/modules/
Le nom du fichier est important, vous êtes néanmoins libre de le nommer comme vous le souhaitez. Notez néanmoins la valeur de la constante qui reprend le nom du module (le nom du fichier...)
Voici la déclaration de la classe et de son constructeur, la nouvelle classe doit étendre la classe Automne CMS_module.
Code :
define("MOD_GANALYTICS_CODENAME", "ganalytics");
class CMS_module_ganalytics extends CMS_module {   
   function CMS_module_ganalytics() {
      //Initialize object.
      parent::CMS_module(MOD_GANALYTICS_CODENAME);
   }
}


Voici les méthodes d'accès aux données, rien de particulier...
Code :
   function sql_delete_all_ganalytics(){
      $sql = "DELETE FROM ganalytics";
      $q = new CMS_query($sql);
   }
   function sql_insert_ganalytics($hostname_code = array()){
      if(count($hostname_code) > 0){
         $sql = "INSERT INTO ganalytics VALUES ".implode(",",$hostname_code);
         $q = new CMS_query($sql);
      }
   }
   function sql_update_ganalytics_parameters($datas = array()){
      foreach($datas as $param => $value){
         $sql = "UPDATE `ganalytics_parameters` SET `value` ='".addslashes($value)."' WHERE `id` ='".$param."'";
         $q = new CMS_query($sql);
      }
   }
   function sql_select_all_ganalytics_parameters(){
      $sql = "SELECT * FROM ganalytics_parameters";
      $q = new CMS_query($sql);
      return $q;
   }


Enfin les méthodes d'interprértation du tag <ganalytics /> que l'on insérera dans nos modèles, vous trouverez la signature et les informations de ses méthodes dans la classe CMS_module.
La première méthode permet de déclarer les tags pour lesquels un traitement sera effectué, il permet le cas échéant de fournir des paramètres supplémentaires lors du traitement, ce qui n'est pas notre cas ici.
Code :
   function getWantedTags($treatmentMode, $visualizationMode) {
      $return = array();
      switch ($treatmentMode) {
         case MODULE_TREATMENT_PAGECONTENT_TAGS :
            $return = array (
               "ganalytics" => array("selfClosed" => true, "parameters" => array()),
            );
         break;
      }
      return $return;
   }


La seconde méthode est le traitement du tag proporement dit. Le code n'est pas très compliqué, je récupère le paramètre contenant le script, et l'ensemble des clés.
Je génère ensuite un script PHP qui sera inclut dans chaque page. Ce script insérera la clé en fonction du http_host au moment de l'appel de la page.
Code :
   define("MESSAGE_NO_TAGS_GANALYTICS", 13);
   function treatWantedTag(&$tag, $tagContent, $treatmentMode, $visualizationMode, &$treatedObject, $treatmentParameters)
   {
      switch ($treatmentMode) {
         case MODULE_TREATMENT_PAGECONTENT_TAGS :
            if (!is_a($treatedObject,"CMS_page")) {
               $this->_raiseError('CMS_module_'.MOD_GANALYTICS_CODENAME.' : treatWantedTag : $treatedObject must be a CMS_page object');
               return false;
            }
            
            $tagContent = '';
            // si le mode est HTML PUBLIC
            if($visualizationMode == PAGE_VISUALMODE_HTML_PUBLIC){
               $tagContent = '<?php ';

               $tagContent .= '$sql = "SELECT * FROM ganalytics_page_except WHERE id_page = \''.$treatedObject->getID().'\'";';
               $tagContent .= '$q = new CMS_query($sql);';
               $tagContent .= '$ganalytics_page_except = $q->getArray();';
               $tagContent .= 'if($ganalytics_page_except === false){';

               $tagContent .= '$hostname = $_SERVER["HTTP_HOST"]; ';
               $tagContent .= '$site = array(); ';
               
               $sites = array();
               $sql = "SELECT * FROM ganalytics";
               $q = new CMS_query($sql);
               while ($data = $q->getArray()) {
                  $hostname = str_replace(array("http://", "https://"),"",$data["hostname"]);
                  $tagContent .= '$site["'.$hostname.'"] = "'.$data["id_ganalytics"].'"; ';
                  $hostname2 = strpos($hostname, "www.") === false ? "www.".$hostname : str_replace("www.","",$hostname);
                  $tagContent .= '$site["'.$hostname2.'"] = "'.$data["id_ganalytics"].'"; ';
               }
               $sql = "SELECT `value` FROM `ganalytics_parameters` WHERE `id`= '".$this->_id_script."'";
               $q = new CMS_query($sql);
               $script = $q->getArray();
               $tagContent .= 'if(isset($site[$hostname]) && trim($site[$hostname]) != ""){
                     $script_ganalytics = "'.str_replace('"','\"',$script['value']).'";
                     echo(str_replace("%id_site%", $site[$hostname], $script_ganalytics));
                  }else{
                     echo("<!-- GAnalytics - code site non trouvée -->");
                  }
                  ';
               $tagContent .= ' ?>';
            }
            
            return $tagContent;
               
            
         break;
      }
      return $tag->getContent();
   }

Auteur:  Chrys [ Mar Déc 15, 2009 11:21 am ]
Sujet du message:  Re: Un module GAnalytics

Troisième Etape : La page d'administration

Avant de commencer, j'insère les différents messages que j'utiliserai dans la tables d'internationalisation. Notez que le nom du module (dans les ordres SQL) correspond au nom de votre fichier (sans l'extension)
Code :
DELETE FROM I18NM_messages WHERE module='ganalytics';

INSERT INTO `I18NM_messages` (`id`, `module`, `timestamp`, `fr`, `en`) VALUES (1, 'ganalytics', NOW(), 'GAnalytics', 'GAnalytics');
INSERT INTO `I18NM_messages` (`id`, `module`, `timestamp`, `fr`, `en`) VALUES (2, 'ganalytics', NOW(), 'Script GAnalytics (la variable %id_site% sera remplacé par le code du site)', 'Script GAnalytics (la variable %id_site% sera remplacé par le code du site)');
INSERT INTO `I18NM_messages` (`id`, `module`, `timestamp`, `fr`, `en`) VALUES (3, 'ganalytics', NOW(), 'Code GAnalytics', 'Code GAnalytics');
INSERT INTO `I18NM_messages` (`id`, `module`, `timestamp`, `fr`, `en`) VALUES (4, 'ganalytics', NOW(), 'Paramètres', 'Parameters');
INSERT INTO `I18NM_messages` (`id`, `module`, `timestamp`, `fr`, `en`) VALUES (5, 'ganalytics', NOW(), 'Sauvegarder', 'Save');
INSERT INTO `I18NM_messages` (`id`, `module`, `timestamp`, `fr`, `en`) VALUES (6, 'ganalytics', NOW(), 'Régénérer toutes les pages', 'Regenerate all pages');
INSERT INTO `I18NM_messages` (`id`, `module`, `timestamp`, `fr`, `en`) VALUES (7, 'ganalytics', NOW(), 'Libellé', 'Label');
INSERT INTO `I18NM_messages` (`id`, `module`, `timestamp`, `fr`, `en`) VALUES (8, 'ganalytics', NOW(), 'Valeur', 'Value');
INSERT INTO `I18NM_messages` (`id`, `module`, `timestamp`, `fr`, `en`) VALUES (9, 'ganalytics', NOW(), 'Sauvegarde effectuée', 'Sauvegarde effectuée');
INSERT INTO `I18NM_messages` (`id`, `module`, `timestamp`, `fr`, `en`) VALUES (10, 'ganalytics', NOW(), '%id_site% doit apparaitre dans le Script GAnalytics', '%id_site% doit apparaitre dans le Script GAnalytics');
INSERT INTO `I18NM_messages` (`id`, `module`, `timestamp`, `fr`, `en`) VALUES (11, 'ganalytics', NOW(), 'Page non tagguée', 'Page non tagguée');
INSERT INTO `I18NM_messages` (`id`, `module`, `timestamp`, `fr`, `en`) VALUES (12, 'ganalytics', NOW(), 'Supprimer', 'Supprimer');
INSERT INTO `I18NM_messages` (`id`, `module`, `timestamp`, `fr`, `en`) VALUES (13, 'ganalytics', NOW(), 'Ne pas écrire le code GAnalytics', 'Ne pas écrire le code GAnalytics');


Afin de gérer dans Automne les éléments, je crée une page index.php dans /automne/admin/modules/ganalytics/
Le nom du dernier répertoire est le même que le nom du fichier vu précédemment, le nom de votre module.
Code :
require_once($_SERVER["DOCUMENT_ROOT"]."/cms_rc_admin.php");
require_once(PATH_ADMIN_SPECIAL_SESSION_CHECK_FS);

define("MESSAGE_PAGE_TITLE", 249);
define("MESSAGE_PAGE_TITLE_MODULE", 248);
define("MESSAGE_PAGE_CLEARANCE_ERROR", 65);
define("MESSAGE_PAGE_ACTION_EDIT", 261);
define("MESSAGE_PAGE_ACTION_NEW", 262);
define("MESSAGE_PAGE_FIELD_ACTIONS", 259);
define("MESSAGE_PAGE_ACTION_DELETE", 252);
define("MESSAGE_PAGE_EMPTY_SET", 265);
define("MESSAGE_PAGE_ACTION_VIEW", 1006);
define("MESSAGE_PAGE_UNKNOWN_PAGE", 66);

//CHECKS
if (!$cms_user->hasModuleClearance(MOD_GANALYTICS_CODENAME, CLEARANCE_MODULE_EDIT)) {
   header("Location: ".PATH_ADMIN_SPECIAL_ENTRY_WR."?cms_message_id=".MESSAGE_PAGE_CLEARANCE_ERROR."&".session_name()."=".session_id());
   exit;
}

$cms_module = CMS_modulesCatalog::getByCodename(MOD_GANALYTICS_CODENAME);

//render initialisation
$dialog = new CMS_dialog();
$content = '';
$dialog->setTitle($cms_language->getMessage(MESSAGE_PAGE_TITLE_MODULE, array($cms_module->getLabel($cms_language)))." :: ".$cms_language->getMessage(MESSAGE_PAGE_TITLE));
if ($cms_message) {
   $dialog->setActionMessage($cms_message);
}

//module specific
define("MESSAGE_CODE_GANALYTICS", 3);
define("MESSAGE_PARAMETRE", 4);
define("MESSAGE_SAUVEGARDER", 5);
define("MESSAGE_REGENERER", 6);
define("MESSAGE_LIBELLE", 7);
define("MESSAGE_VALEUR", 8);
define("MESSAGE_CONFIRMATION_SAUVEGARDE", 9);
define("MESSAGE_ERREUR_PARAM_SCRIPT", 10);
define("MESSAGE_PAGE_EXCEPT", 11);
define("MESSAGE_SUPPRIMER", 12);

// ****************************************************************
// ** ACTIONS MANAGEMENT                                         **
// ****************************************************************
$onglet_selectionne = 0;

// traitement code google
if(isset($_POST["action"]) && $_POST["action"] == "code_google"){
   $onglet_selectionne = 0;
   unset($_POST["action"]);
   $regenerate_all = isset($_POST["regenerate_all"]) ? true : false;
   unset($_POST["regenerate_all"]);
   $datas = $_POST;
   $sql = "";
   $enregistrement = array();
   foreach($datas as $hostname => $code){
      if($code != ""){
         $enregistrement[] = "('".$hostname."','".$code."')";
      }
   }
   // on enleve toutes les valeurs de la table ganalytics
   $cms_module->sql_delete_all_ganalytics();
   $cms_module->sql_insert_ganalytics($enregistrement);
   
   $cms_message = $cms_language->getMessage(MESSAGE_CONFIRMATION_SAUVEGARDE, false, MOD_GANALYTICS_CODENAME);
   if($regenerate_all){
      @set_time_limit(1000);
      CMS_tree::regenerateAllPages(true);
   }
   
}

// traitement parametre
if(isset($_POST["action"]) && $_POST["action"] == "parametre"){
   $onglet_selectionne = 2;
   unset($_POST["action"]);
   $regenerate_all = isset($_POST["regenerate_all"]) ? true : false;
   unset($_POST["regenerate_all"]);
   $datas = $_POST;
   $cms_message = '';
   $error = false;
   
   // verification sur les regles des champs
   foreach($datas as $param => $value){
      switch($param){
         case "2" :
            $pos = strpos($value, "%id_site%");
            if($pos === false){
               $error = true;
               $cms_message .= $cms_language->getMessage(MESSAGE_ERREUR_PARAM_SCRIPT, false, MOD_GANALYTICS_CODENAME);
            }
         break;
      }
   }
   
   // si il n'y a pas d'erreur => enregistrement
   if(!$error){
      $cms_module->sql_update_ganalytics_parameters($datas);
      $cms_message = $cms_language->getMessage(MESSAGE_CONFIRMATION_SAUVEGARDE, false, MOD_GANALYTICS_CODENAME);
      if($regenerate_all){
         @set_time_limit(1000);
         CMS_tree::regenerateAllPages(true);
      }
   }
   
}

$dialog->addOnglet();
if ($cms_message) {
   $dialog->setActionMessage($cms_message);
}

// RENDU
$message_code_ganalytics = $cms_language->getMessage(MESSAGE_CODE_GANALYTICS, false, MOD_GANALYTICS_CODENAME);
$message_page_except = $cms_language->getMessage(MESSAGE_PAGE_EXCEPT, false, MOD_GANALYTICS_CODENAME);
$content .='
<script type="text/javascript">
<!-- Definir les Styles des onglets -->
ongletstyle();
<!-- Creation de l\'objet Onglet  -->
var monOnglet = new Onglet("monOnglet", "100%", "100%", "110", "30", '.$onglet_selectionne.');
monOnglet.add(new OngletItem("'.$message_code_ganalytics.'", "'.$message_code_ganalytics.'"));
monOnglet.add(new OngletItem("'.$message_page_except.'", "'.$message_page_except.'"));
</script>

$content .='
<table width="750" border="0" cellpadding="0" cellspacing="0">
<tr>
   <td>
   <script type="text/javascript">monOnglet.displayHeader();</script>
';

// code google
// recuperation des hostnames-code google dans la variable site
$sites = array();
$sql = "SELECT * FROM ganalytics";
$q = new CMS_query($sql);
while ($data = $q->getArray()) {
   $sites[$data["hostname"]] = $data["id_ganalytics"];
}
   
$content .='<div id="og_monOnglet0" style="DISPLAY: none;top:0px;left:0px;width:100%;">
   <form action="index.php" method="post">
   <input type="hidden" name="action" value="code_google"/>
   <table width="100%" border="0" cellpadding="3" cellspacing="0" class="admin_onglet">';
$content .='<tr><td class="admin_onglet_head">Hostname</td><td class="admin_onglet_head">id site</td></tr>';

$websites = CMS_websitesCatalog::getAll('order');
$code_ganalytics = array();

// listing des hostnames presents sur automne $code_google["$hostname"] = "";
foreach($websites as $website){
   if(!isset($code_ganalytics[$website->getUrl()])) $code_ganalytics[$website->getUrl()] = "";
}

// en fonction des hostnames, proposition d'association d'un code google
foreach($code_ganalytics as $index => $co){
   $v = isset($sites[$index]) ? $sites[$index] : "";
   $style = $v == "" ? ' style="font-weight:bold;"' : '';
   $content .='<tr><td class="admin_onglet_body"'.$style.'>'.$index.'</td><td class="admin_onglet_body"><input name="'.$index.'" type="text" value="'.$v.'"/></td></tr>';
}
$content .='<tr><td class="admin_onglet_head" colspan="2"><input type="submit" class="admin_input_submit" value="'.$cms_language->getMessage(MESSAGE_SAUVEGARDER, false, MOD_GANALYTICS_CODENAME).'"/><input id="regenerate_all_code_google" type="checkbox" name="regenerate_all" value="true" /><label for="regenerate_all_code_google">'.$cms_language->getMessage(MESSAGE_REGENERER, false, MOD_GANALYTICS_CODENAME).'</label></td></tr>';   
$content .=   '</table></form></div>';

// parametre
$content .='<div id="og_monOnglet2" style="DISPLAY: none;top:0px;left:0px;width:100%;">
   <form action="index.php" method="post">
   <input type="hidden" name="action" value="parametre"/>
   <table width="100%" border="0" cellpadding="3" cellspacing="0" class="admin_onglet">';
$content .='<tr><td class="admin_onglet_head">'.$cms_language->getMessage(MESSAGE_LIBELLE, false, MOD_GANALYTICS_CODENAME).'</td><td class="admin_onglet_head">'.$cms_language->getMessage(MESSAGE_VALEUR, false, MOD_GANALYTICS_CODENAME).'</td></tr>';

$q = $cms_module->sql_select_all_ganalytics_parameters();
while ($data = $q->getArray()) {
   $champ = "";
   switch($data["type"]){
      case "textarea" :
         $champ = '<textarea name="'.$data["id"].'" style="width:400px;height:100px;">'.$data["value"].'</textarea>';
      break;
      
      case "text" :
         $champ = '<input type="text" name="'.$data["id"].'" style="width:400px;" value="'.stripslashes(htmlentities($data["value"])).'"/>';
      break;
   }
   $content .='<tr><td class="admin_onglet_body">'.$cms_language->getMessage($data["id"], false, MOD_GANALYTICS_CODENAME).'</td><td class="admin_onglet_body"><textarea name="'.$data["id"].'" style="width:400px;height:100px;">'.$data["value"].'</textarea></td></tr>';
}
$content .='<tr><td class="admin_onglet_head" colspan="2"><input type="submit" class="admin_input_submit" value="'.$cms_language->getMessage(MESSAGE_SAUVEGARDER, false, MOD_GANALYTICS_CODENAME).'"/><input id="regenerate_all_parametre" type="checkbox" name="regenerate_all" value="true" /><label for="regenerate_all_parametre">'.$cms_language->getMessage(MESSAGE_REGENERER, false, MOD_GANALYTICS_CODENAME).'</label></td></tr>';
$content .=   '</table></form></div>';

$content .= '</td></tr><script type="text/javascript">monOnglet.displayFooter();</script>
</table>';

$dialog->setContent($content);
$dialog->show();
?>


Le code semble long mais ne contient aucune difficulté, noter qu'il est possible de lancer la régénération totale du site.
J'utilise la classe CMS_websitesCatalog pour obtenir la liste des sites mais n'en récupère qu'une liste des noms de domaines uniques (vous pouvez avoir différents sites (Automne) avec le même nom de domaine, on aura alors la même clé pour les deux sites.

Auteur:  Chrys [ Mar Déc 15, 2009 11:23 am ]
Sujet du message:  Re: Un module GAnalytics

Quatrième Etape : Déclaration du module dans Automne
Un ordre SQL simple pour déclarer le module dans Automne
Vous reconnaitrez dans cet ordre SQL le nom de votre module utilisé dans les étapes précédentes.
Vous pouvez gérer ensuite les accès au module comme tout autre module standard polymod.
Code :
DELETE FROM modules WHERE codename_mod='ganalytics';
INSERT INTO modules VALUES ('', 1, 'ganalytics', 'index.php', 0, 0);

Auteur:  Chrys [ Mar Déc 15, 2009 11:24 am ]
Sujet du message:  Re: Un module GAnalytics

Cinquième Etape : Modification des modèles

Il ne me reste plus qu'à insérer dans mes modèles la balise <ganalytics /> puis régénérer les pages qui s'appuient sur les modèles impactés.

Auteur:  Chrys [ Mar Déc 15, 2009 11:38 am ]
Sujet du message:  Re: Un module GAnalytics

Sixième Etape : Gérer l'exclusion de pages

Une petite évolution pour permettre d'exclure les pages pour lesquels je ne souhaite pas les GAnalytics. Je vous laisse découvrir les quelques lignes de codes qui suivent
SQL : une table pour enregistrer les ID des pages exclues
Code :
CREATE TABLE `ganalytics_page_except` (
`id_page` INT( 5 ) NOT NULL ,
PRIMARY KEY ( `id_page`)
) CHARACTER SET = latin1;


Modification de la classe du module :
Cette modification comprend un ajout de méthodes d'accès aux données et la modification de la méthode responsable du traitement du tag. Lorsque la page est en édition, une case à cocher est inséré à l'endroit des GAnalytics, sélectionner la case à cocher enregistre l'identifiant de la page dans la table des pages exclues, ce traitement est effectué en AJAX. Vous devrez donc placer le fichier jquery-1.3.2.min.js (ou une version ultérieure) dans /automne/admin/modules/ganalytics/
Ce traitement utilise également une image ajax-loader.gif placé au même endroit.
Le fichier final de la classe du module est le suivant
Code :
<?php
define("MOD_GANALYTICS_CODENAME", "ganalytics");

class CMS_module_ganalytics extends CMS_module {   
   var $_id_script = 2;
   
   /**
     * Constructor.
     * initializes the module object
     *
     * @return void
     * @access public
     */
   function CMS_module_ganalytics() {
      //Initialize object.
      parent::CMS_module(MOD_GANALYTICS_CODENAME);
      
   }
   
   /*
    * supprime toutes les données de la table ganalytics
    */
   function sql_delete_all_ganalytics() {
      $sql = "DELETE FROM ganalytics";
      $q = new CMS_query($sql);
   }
   
   /*
    * insert les données sur la table ganalytics
    * $hostname_code est un tableau contenant des valeurs du type('$hostname', '$code')
    */
   function sql_insert_ganalytics($hostname_code = array()) {
      if(count($hostname_code) > 0){
         $sql = "INSERT INTO ganalytics VALUES ".implode(",",$hostname_code);
         $q = new CMS_query($sql);
      }
   }
   
   /*
    * supprime les données sur la table ganalytics_page_except pour les id_page contenu dans le tableau $id_pages
    * $id_pages est un tableau contenant des valeurs du type index => id_page
    */
   function sql_delete_ganalytics_page_except($id_pages = array()) {
      if(count($id_pages) > 0){
         $sql = 'DELETE FROM ganalytics_page_except WHERE id_page IN ('.implode(",",$id_pages).')';
         $q = new CMS_query($sql);
         $q->getArray();
      }
   }
   
   /*
    * insert la donnée $id_page dans la table ganalytics
    */
   function sql_insert_ganalytics_page_except($id_page) {
      if($id_page != ""){
         $sql = "INSERT INTO `ganalytics_page_except` (`id_page`) VALUES ('".$id_page."')";
         $q = new CMS_query($sql);
         $q->getArray();
      }
   }
   
   /*
    * retourne l'objet CMS_query avec toutes les données de la table ganalytics_page_except
    */
   function sql_select_all_ganalytics_page_except() {
      $sql = "SELECT * FROM ganalytics_page_except";
      $q = new CMS_query($sql);
      return $q;
   }
   
   /*
    * met à jour les données sur la table ganalytics_parameters
    * $datas est un tableau contenant des valeurs du type id => value
    */
   function sql_update_ganalytics_parameters($datas = array()) {
      foreach($datas as $param => $value){
         $sql = "UPDATE `ganalytics_parameters` SET `value` ='".addslashes($value)."' WHERE `id` ='".$param."'";
         $q = new CMS_query($sql);
      }
   }
   
   /*
    * retourne l'objet CMS_query avec toutes les données de la table ganalytics_parameters
    */
   function sql_select_all_ganalytics_parameters() {
      $sql = "SELECT * FROM ganalytics_parameters";
      $q = new CMS_query($sql);
      return $q;
   }
   
   /**
     * Get the tags to be treated by this module for the specified treatment mode, visualization mode and object.
     * @param integer $treatmentMode The current treatment mode (see constants on top of CMS_modulesTags class for accepted values).
     * @param integer $visualizationMode The current visualization mode (see constants on top of cms_page class for accepted values).
     * @return array of tags to be treated.
     * @access public
     */
   function getWantedTags($treatmentMode, $visualizationMode) {
      $return = array();
      switch ($treatmentMode) {
         case MODULE_TREATMENT_PAGECONTENT_TAGS :
            $return = array (
               "ganalytics" => array("selfClosed" => true, "parameters" => array()),
            );
         break;
      }
      return $return;
   }
   
   /**
     * Treat given content tag by this module for the specified treatment mode, visualization mode and object.
     *
     * @param string $tag The CMS_XMLTag.
      * @param string $tagContent previous tag content.
     * @param integer $treatmentMode The current treatment mode (see constants on top of CMS_modulesTags class for accepted values).
     * @param integer $visualizationMode The current visualization mode (see constants on top of cms_page class for accepted values).
     * @param object $treatedObject The reference object to treat.
     * @param array $treatmentParameters : optionnal parameters used for the treatment. Usually an array of objects.
     * @return string the tag content treated.
     * @access public
     */
   function treatWantedTag(&$tag, $tagContent, $treatmentMode, $visualizationMode, &$treatedObject, $treatmentParameters) {
      global $cms_language;
      switch ($treatmentMode) {
         case MODULE_TREATMENT_PAGECONTENT_TAGS :
            if (!is_a($treatedObject,"CMS_page")) {
               $this->_raiseError('CMS_module_'.MOD_GANALYTICS_CODENAME.' : treatWantedTag : $treatedObject must be a CMS_page object');
               return false;
            }
            define("MESSAGE_NO_TAGS_GANALYTICS", 13);
            $tagContent = '';
            // si le mode est HTML PUBLIC
            if($visualizationMode == PAGE_VISUALMODE_HTML_PUBLIC){
               $tagContent = '<?php ';
               $tagContent .= '$sql = "SELECT * FROM ganalytics_page_except WHERE id_page = \''.$treatedObject->getID().'\'";';
               $tagContent .= '$q = new CMS_query($sql);';
               $tagContent .= '$ganalytics_page_except = $q->getArray();';
               $tagContent .= 'if($ganalytics_page_except === false){';
               $tagContent .= '$hostname = $_SERVER["HTTP_HOST"]; ';
               $tagContent .= '$site = array(); ';
               
               $sites = array();
               $sql = "SELECT * FROM ganalytics";
               $q = new CMS_query($sql);
               while ($data = $q->getArray()) {
                  $hostname = str_replace(array("http://", "https://"),"",$data["hostname"]);
                  $tagContent .= '$site["'.$hostname.'"] = "'.$data["id_ganalytics"].'"; ';
                  $hostname2 = strpos($hostname, "www.") === false ? "www.".$hostname : str_replace("www.","",$hostname);
                  $tagContent .= '$site["'.$hostname2.'"] = "'.$data["id_ganalytics"].'"; ';
               }
               $sql = "SELECT `value` FROM `ganalytics_parameters` WHERE `id`= '".$this->_id_script."'";
               $q = new CMS_query($sql);
               $script = $q->getArray();
               $tagContent .= 'if(isset($site[$hostname]) && trim($site[$hostname]) != ""){
                     $script_ganalytics = "'.str_replace('"','\"',$script['value']).'";
                     echo(str_replace("%id_site%", $site[$hostname], $script_ganalytics));
                  }else{
                     echo("<!-- GAnalytics - code site non trouvée -->");
                  }
                  ';
               $tagContent .= '}else{';
               $tagContent .= 'echo("<!-- GAnalytics - page non tagguee -->");}';
               $tagContent .= ' ?>';
            }
            // mode edition de la page
            if($visualizationMode == PAGE_VISUALMODE_FORM){
               $tagContent = '<script type="text/javascript" src="/automne/admin/modules/ganalytics/jquery-1.3.2.min.js"></script>';
               $tagContent .= '<script type="text/javascript">
                  $(document).ready(function(){
                     $("#ganalytics_page_except").change(function(){
                        $("#ganalytics_page_except_form_element").hide();
                        $("#ganalytics_page_except_load").show();
                        var tag_a_enlever = $(this).attr("checked");
                        $.post($("#form_ganalytics_page_except").attr("action"),{id_page:"'.$treatedObject->getID().'", add : tag_a_enlever},
                           function(data){
                              $("#ganalytics_page_except_load").hide();
                              $("#ganalytics_page_except_form_element").show();
                              if(data != "OK") alert("erreur");
                           }
                        )
                     })
                  });
               </script>';
               $sql = "SELECT * FROM ganalytics_page_except WHERE id_page = '".$treatedObject->getID()."'";
               $q = new CMS_query($sql);
               $page_except = $q->getArray();
               if($page_except === false){
                  $checked = '';
               }else{
                  $checked = 'checked="checked"';
               }
               $tagContent .='<form id="form_ganalytics_page_except" action="/automne/admin/modules/ganalytics/page.php" method="post">';
               $tagContent .='<div id="ganalytics_page_except_load" style="display:none"><img src="/automne/admin/modules/ganalytics/ajax-loader.gif" alt="loading"/></div>';
               $tagContent .='<div id="ganalytics_page_except_form_element" style="background:#EEECEB;"><input type="checkbox" id="ganalytics_page_except" name="ganalytics_page_except" value="true"'.$checked.'/><label for="ganalytics_page_except" style="color:#FB7A35">'.$cms_language->getMessage(MESSAGE_NO_TAGS_GANALYTICS, false, MOD_GANALYTICS_CODENAME).'</label></div>';
               $tagContent .='</form>';
            }
            
            return $tagContent;
            
         break;
      }
      return $tag->getContent();
   }
}
?>

Auteur:  Chrys [ Mar Déc 15, 2009 11:41 am ]
Sujet du message:  Re: Un module GAnalytics

Sixième Etape : Gérer l'exclusion de pages (suite...)

Le fichier responsable du traitement AJAX de l'inscription ou non de la page dans la table des pages exclues est le fichier page.php dans /automne/classes/modules/ganalytics (que vous pouvez voir dans l'attribut action du formulaire qui contient la case à cocher)
Code :
<?php
require_once($_SERVER["DOCUMENT_ROOT"]."/cms_rc_admin.php");
require_once(PATH_ADMIN_SPECIAL_SESSION_CHECK_FS);

if(isset($_POST["id_page"]) && isset($_POST["add"])){
   $cms_module = CMS_modulesCatalog::getByCodename(MOD_GANALYTICS_CODENAME);
   
   if($_POST["add"] == "true"){
      // pas de tag a insérer => enregister dans la table
      $cms_module->sql_insert_ganalytics_page_except($_POST["id_page"]);
   }else{
      // tag à insérer => supprimer dans la table
      $cms_module->sql_delete_ganalytics_page_except(array("id" => $_POST["id_page"]));
   }
   echo("OK");
}

?>

Auteur:  Chrys [ Mar Déc 15, 2009 11:47 am ]
Sujet du message:  Re: Un module GAnalytics

Sixième Etape : Gérer l'exclusion de pages (... et fin)

Enfin, modification de l'interface d'administration pour ajouter la visualisation des pages exclues et détecter des pages supprimées. Voici le fichier index.php complet (dans /automne/admin/modules/ganalytics/) :
Code :
<?php
require_once($_SERVER["DOCUMENT_ROOT"]."/cms_rc_admin.php");
require_once(PATH_ADMIN_SPECIAL_SESSION_CHECK_FS);

define("MESSAGE_PAGE_TITLE", 249);
define("MESSAGE_PAGE_TITLE_MODULE", 248);
define("MESSAGE_PAGE_CLEARANCE_ERROR", 65);
define("MESSAGE_PAGE_ACTION_EDIT", 261);
define("MESSAGE_PAGE_ACTION_NEW", 262);
define("MESSAGE_PAGE_FIELD_ACTIONS", 259);
define("MESSAGE_PAGE_ACTION_DELETE", 252);
define("MESSAGE_PAGE_EMPTY_SET", 265);
define("MESSAGE_PAGE_ACTION_VIEW", 1006);
define("MESSAGE_PAGE_UNKNOWN_PAGE", 66);

//CHECKS
if (!$cms_user->hasModuleClearance(MOD_GANALYTICS_CODENAME, CLEARANCE_MODULE_EDIT)) {
   header("Location: ".PATH_ADMIN_SPECIAL_ENTRY_WR."?cms_message_id=".MESSAGE_PAGE_CLEARANCE_ERROR."&".session_name()."=".session_id());
   exit;
}

$cms_module = CMS_modulesCatalog::getByCodename(MOD_GANALYTICS_CODENAME);

//render initialisation
$dialog = new CMS_dialog();
$content = '';
$dialog->setTitle($cms_language->getMessage(MESSAGE_PAGE_TITLE_MODULE, array($cms_module->getLabel($cms_language)))." :: ".$cms_language->getMessage(MESSAGE_PAGE_TITLE));
if ($cms_message) {
   $dialog->setActionMessage($cms_message);
}


//module specific
define("MESSAGE_CODE_GANALYTICS", 3);
define("MESSAGE_PARAMETRE", 4);
define("MESSAGE_SAUVEGARDER", 5);
define("MESSAGE_REGENERER", 6);
define("MESSAGE_LIBELLE", 7);
define("MESSAGE_VALEUR", 8);
define("MESSAGE_CONFIRMATION_SAUVEGARDE", 9);
define("MESSAGE_ERREUR_PARAM_SCRIPT", 10);
define("MESSAGE_PAGE_EXCEPT", 11);
define("MESSAGE_SUPPRIMER", 12);
define("MESSAGE_NV_PAGE_NON_VALIDEE", 14);

// ****************************************************************
// ** ACTIONS MANAGEMENT                                         **
// ****************************************************************
$onglet_selectionne = 0;

// traitement code google
if(isset($_POST["action"]) && $_POST["action"] == "code_google"){
   $onglet_selectionne = 0;
   unset($_POST["action"]);
   $regenerate_all = isset($_POST["regenerate_all"]) ? true : false;
   unset($_POST["regenerate_all"]);
   $datas = $_POST;
   $sql = "";
   $enregistrement = array();
   foreach($datas as $hostname => $code){
      if($code != ""){
         $enregistrement[] = "('".$hostname."','".$code."')";
      }
   }
   // on enleve toutes les valeurs de la table ganalytics
   $cms_module->sql_delete_all_ganalytics();
   $cms_module->sql_insert_ganalytics($enregistrement);
   
   $cms_message = $cms_language->getMessage(MESSAGE_CONFIRMATION_SAUVEGARDE, false, MOD_GANALYTICS_CODENAME);
   if($regenerate_all){
      @set_time_limit(1000);
      CMS_tree::regenerateAllPages(true);
   }
   
}

// traitement page_except
if(isset($_POST["action"]) && $_POST["action"] == "page_except"){
   $onglet_selectionne = 1;
   unset($_POST["action"]);
   $datas = $_POST;
   if(isset($datas["page"])){
      $cms_module->sql_delete_ganalytics_page_except($datas["page"]);
      $cms_message = $cms_language->getMessage(MESSAGE_CONFIRMATION_SAUVEGARDE, false, MOD_GANALYTICS_CODENAME);
   }   
}


// traitement parametre
if(isset($_POST["action"]) && $_POST["action"] == "parametre"){
   $onglet_selectionne = 2;
   unset($_POST["action"]);
   $regenerate_all = isset($_POST["regenerate_all"]) ? true : false;
   unset($_POST["regenerate_all"]);
   $datas = $_POST;
   $cms_message = '';
   $error = false;
   
   // verification sur les regles des champs
   foreach($datas as $param => $value){
      switch($param){
         case "2" :
            $pos = strpos($value, "%id_site%");
            if($pos === false){
               $error = true;
               $cms_message .= $cms_language->getMessage(MESSAGE_ERREUR_PARAM_SCRIPT, false, MOD_GANALYTICS_CODENAME);
            }
         break;
      }
   }
   
   // si il n'y a pas d'erreur => enregistrement
   if(!$error){
      $cms_module->sql_update_ganalytics_parameters($datas);
      $cms_message = $cms_language->getMessage(MESSAGE_CONFIRMATION_SAUVEGARDE, false, MOD_GANALYTICS_CODENAME);
      if($regenerate_all){
         @set_time_limit(1000);
         CMS_tree::regenerateAllPages(true);
      }
   }
   
}

$dialog->addOnglet();
if ($cms_message) {
   $dialog->setActionMessage($cms_message);
}

// RENDU
$message_code_ganalytics = $cms_language->getMessage(MESSAGE_CODE_GANALYTICS, false, MOD_GANALYTICS_CODENAME);
$message_page_except = $cms_language->getMessage(MESSAGE_PAGE_EXCEPT, false, MOD_GANALYTICS_CODENAME);
$message_parametre = $cms_language->getMessage(MESSAGE_PARAMETRE, false, MOD_GANALYTICS_CODENAME);
$content .='
<script type="text/javascript">
<!-- Definir les Styles des onglets -->
ongletstyle();
<!-- Creation de l\'objet Onglet  -->
var monOnglet = new Onglet("monOnglet", "100%", "100%", "110", "30", '.$onglet_selectionne.');
monOnglet.add(new OngletItem("'.$message_code_ganalytics.'", "'.$message_code_ganalytics.'"));
monOnglet.add(new OngletItem("'.$message_page_except.'", "'.$message_page_except.'"));
monOnglet.add(new OngletItem("'.$message_parametre.'", "'.$message_parametre.'"));
</script>
<script type="text/javascript" src="/automne/admin/modules/ganalytics/jquery-1.3.2.min.js"></script>
<script type="text/javascript">
   $(document).ready(function(){
      $("#page_except_all").change(function(){
         var check = $(this).attr("checked");
         $(".checkbox_page_except").attr("checked",check);
      });
   });
</script>';

$content .='
<table width="750" border="0" cellpadding="0" cellspacing="0">
<tr>
   <td>
   <script type="text/javascript">monOnglet.displayHeader();</script>
';

// code google
// recuperation des hostnames-code google dans la variable site
$sites = array();
$sql = "SELECT * FROM ganalytics";
$q = new CMS_query($sql);
while ($data = $q->getArray()) {
   $sites[$data["hostname"]] = $data["id_ganalytics"];
}
   
$content .='<div id="og_monOnglet0" style="DISPLAY: none;top:0px;left:0px;width:100%;">
   <form action="index.php" method="post">
   <input type="hidden" name="action" value="code_google"/>
   <table width="100%" border="0" cellpadding="3" cellspacing="0" class="admin_onglet">';
$content .='<tr><td class="admin_onglet_head">Hostname</td><td class="admin_onglet_head">id site</td></tr>';

$websites = CMS_websitesCatalog::getAll('order');
$code_ganalytics = array();

// listing des hostnames presents sur automne $code_google["$hostname"] = "";
foreach($websites as $website){
   if(!isset($code_ganalytics[$website->getUrl()])) $code_ganalytics[$website->getUrl()] = "";
}

// en fonction des hostnames, proposition d'association d'un code google
foreach($code_ganalytics as $index => $co){
   $v = isset($sites[$index]) ? $sites[$index] : "";
   $style = $v == "" ? ' style="font-weight:bold;"' : '';
   $content .='<tr><td class="admin_onglet_body"'.$style.'>'.$index.'</td><td class="admin_onglet_body"><input name="'.$index.'" type="text" value="'.$v.'"/></td></tr>';
}
$content .='<tr><td class="admin_onglet_head" colspan="2"><input type="submit" class="admin_input_submit" value="'.$cms_language->getMessage(MESSAGE_SAUVEGARDER, false, MOD_GANALYTICS_CODENAME).'"/><input id="regenerate_all_code_google" type="checkbox" name="regenerate_all" value="true" /><label for="regenerate_all_code_google">'.$cms_language->getMessage(MESSAGE_REGENERER, false, MOD_GANALYTICS_CODENAME).'</label></td></tr>';   
$content .=   '</table></form></div>';



// page except
$content .='<div id="og_monOnglet1" style="DISPLAY: none;top:0px;left:0px;width:100%;">
   <form action="index.php" method="post">
   <input type="hidden" name="action" value="page_except"/>
   <table width="100%" border="0" cellpadding="3" cellspacing="0" class="admin_onglet">';
$content .='<tr><td class="admin_onglet_head" style="width:5%"><input type="checkbox" id="page_except_all" name="page_except_all" value="true"/></td><td class="admin_onglet_head" style="width:7%">id</td><td class="admin_onglet_head">url</td></tr>';   
$q = $cms_module->sql_select_all_ganalytics_page_except();
while ($data = $q->getArray()) {
   $tree = new CMS_tree();
   $page = $tree->getPageByID($data["id_page"]);
   if($page === false){
      $page_url = '-';
      $style = ' style="font-weight:bold;"';
   }else{
      $page_url = $page->getURL() == "" ? $cms_language->getMessage(MESSAGE_NV_PAGE_NON_VALIDEE, false, MOD_GANALYTICS_CODENAME) : '<a href="'.$page->getURL().'" target="_blank">'.$page->getURL().'</a>';
      $style = "";
   }
   $content .='<tr'.$style.'><td class="admin_onglet_body"><input class="checkbox_page_except" type="checkbox" name="page[]" value="'.$data["id_page"].'"/></td><td class="admin_onglet_body">'.$data["id_page"].'</td><td class="admin_onglet_body">'.$page_url.'</td></tr>';
}
$content .='<tr><td class="admin_onglet_head" colspan="3"><input type="submit" class="admin_input_submit" value="'.$cms_language->getMessage(MESSAGE_SUPPRIMER, false, MOD_GANALYTICS_CODENAME).'"/></td></tr>';
$content .=   '</table></form></div>';


// parametre
$content .='<div id="og_monOnglet2" style="DISPLAY: none;top:0px;left:0px;width:100%;">
   <form action="index.php" method="post">
   <input type="hidden" name="action" value="parametre"/>
   <table width="100%" border="0" cellpadding="3" cellspacing="0" class="admin_onglet">';
$content .='<tr><td class="admin_onglet_head">'.$cms_language->getMessage(MESSAGE_LIBELLE, false, MOD_GANALYTICS_CODENAME).'</td><td class="admin_onglet_head">'.$cms_language->getMessage(MESSAGE_VALEUR, false, MOD_GANALYTICS_CODENAME).'</td></tr>';

$q = $cms_module->sql_select_all_ganalytics_parameters();
while ($data = $q->getArray()) {
   $champ = "";
   switch($data["type"]){
      case "textarea" :
         $champ = '<textarea name="'.$data["id"].'" style="width:400px;height:100px;">'.$data["value"].'</textarea>';
      break;
      
      case "text" :
         $champ = '<input type="text" name="'.$data["id"].'" style="width:400px;" value="'.stripslashes(htmlentities($data["value"])).'"/>';
      break;
   }
   $content .='<tr><td class="admin_onglet_body">'.$cms_language->getMessage($data["id"], false, MOD_GANALYTICS_CODENAME).'</td><td class="admin_onglet_body"><textarea name="'.$data["id"].'" style="width:400px;height:100px;">'.$data["value"].'</textarea></td></tr>';
}
$content .='<tr><td class="admin_onglet_head" colspan="2"><input type="submit" class="admin_input_submit" value="'.$cms_language->getMessage(MESSAGE_SAUVEGARDER, false, MOD_GANALYTICS_CODENAME).'"/><input id="regenerate_all_parametre" type="checkbox" name="regenerate_all" value="true" /><label for="regenerate_all_parametre">'.$cms_language->getMessage(MESSAGE_REGENERER, false, MOD_GANALYTICS_CODENAME).'</label></td></tr>';
$content .=   '</table></form></div>';

$content .= '</td></tr><script type="text/javascript">monOnglet.displayFooter();</script>
</table>';

$dialog->setContent($content);
$dialog->show();
?>

Auteur:  Chrys [ Mar Déc 15, 2009 11:48 am ]
Sujet du message:  Re: Un module GAnalytics

Dernière Etape : A vous de jouer.

Merci de tous vos retours, critiques, encouragement...

Encore merci à Damien sans qui je n'aurai pas eu le temps d'écrire ce petit tuto... d'autres à suivre :wink:

Auteur:  Sébastien [ Mar Déc 15, 2009 12:24 pm ]
Sujet du message:  Re: Un module GAnalytics

Bonjour Chrys,

Merci pour ce tuto de module :D

Quelques points rapidement :
- Grosso modo ça doit marcher aussi sur un Automne 4

- Il vaut mieux éviter de mettre du SQL directement dans les fichiers servant à générer l'admin (privilégier le SQL dans les classes).

- Tu as une faille importante de sécurité là (méthode "sql_update_ganalytics_parameters") :
Code :
$sql = "UPDATE `ganalytics_parameters` SET `value` ='".addslashes($value)."' WHERE `id` ='".$param."'";

Il ne faut JAMAIS protéger les valeurs insérées en base uniquement avec un addslahes, ça n'empêche pas toutes les injections SQL. Problème identique dans les méthodes "sql_insert_ganalytics, sql_insert_ganalytics_page_except, sql_delete_ganalytics_page_except".
Une méthode d'Automne permet de se protéger efficacement contre les injections SQL : sensitiveIO::sanitizeSQLString. Ta requête devient alors :
Code :
$sql = "UPDATE `ganalytics_parameters` SET `value` ='".sensitiveIO::sanitizeSQLString($value)."' WHERE `id` ='".sensitiveIO::sanitizeSQLString($param)."'";

- Appelle plutôt ton tag <atm-ganalytics />. Dans la v4, le préfixe "atm" est employé pour vérifier qu'un tag est XHTML ou pas.

- J'aurai remplacé le tag <atm-ganalytics /> par le code suivant (à la place de tout le code PHP / SQL que tu as mis) :
Code :
<?php
//ici les require necessaires ...
require_once(...);
...
$cms_module = CMS_modulesCatalog::getByCodename(MOD_GANALYTICS_CODENAME);
echo $cms_module->getGACode(\''.$treatedObject->getID().'\');
?>

Il y a plusieurs raisons pour ça :
- Limiter la taille du code écrit en dur dans la page (lecture du code plus simple)
- En cas de changement des données de ton module, par exemple : modification des codes GA déclarés, changement de site ou de domaine pour une page, ajout d'une exception sur une page, etc, tu n'as pas besoin de régénérer toutes les pages pour mettre à jour ton code GA final : ça sera fait dynamiquement lors de l'appel à la fonction "getGACode" de ton module. C'est cette fonction qui doit contenir tout ton code que tu met actuellement dans ta page.

Enfin pour finir, peux tu proposer un patch pour simplifier l'installation de ce module ?

Seb

Auteur:  Sébastien [ Mar Déc 15, 2009 12:27 pm ]
Sujet du message:  Re: Un module GAnalytics

Tu as aussi une erreur dans ta fonction getWantedTags le nom du tag "ganalytics" est incorrect.

Auteur:  Chrys [ Mar Déc 15, 2009 1:29 pm ]
Sujet du message:  Re: Un module GAnalytics

Merci Sébastien pour ces retours, je corrige tout ça.

Page 1 sur 1 Le fuseau horaire est UTC [Heure d’été]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/