Un petit tip utile pour ce vendredi sur la plateforme Magento.
Par défaut, la version community ne comporte pas de sauvegarde des modifications des pages CMS.
Cette fonction peut cependant être très utile en cas d’une erreur ou d’une suppression intempestive d’un contenu.

Voici donc un petit tips pour remédier à tout cela rapidement ( sans interface d’administration pour l’instant…, juste une sauvegarde de la base de données).

Nous allons commencer par créer un module magento que nous allons nommer “CmsVersionning”.
Pour cet article celui-ci sera situé dans l’arborescence “app/local/Hhennes/CmsVersionning/” (à adapter selon vos préférences)

Nous commençons par le fichier xml de configuration du module à placer dans app/etc/modules

 <?xml version="1.0"?>
<config>
    <modules>
        <Hhennes_CmsVersionning>
            <active>true</active>
            <codePool>local</codePool>
        </Hhennes_CmsVersionning>
    </modules>
</config>

Passons à présent au processus de création de ce module :

Pour commencer nous allons créer le fichier de configuration.
Dans app/local/Hhennes/CmsVersionning/ créez un dossier “etc” et dans celui-ci votre fichier “config.xml” avec le contenu suivant :

<?xml version="1.0"?>
<config>
    <modules>
        <Hhennes_CmsVersionning>
            <version>1.0</version>
        </Hhennes_CmsVersionning>
    </modules>
	<global>
		<models>
			<CmsVersionning>
			<class>Hhennes_CmsVersionning_Model</class>
			</CmsVersionning>
		</models>        
		<events>
            <cms_page_save_before>
               <observers>
                   <make_version>
                       <type>singleton</type>
                       <class>Hhennes_CmsVersionning_Model_Observer</class>
                       <method>makePageVersion</method>    
                  </make_version>    
               </observers>    
            </cms_page_save_before>    
        </events>
	</global>
</config>

Analysons le contenu de ce fichier de configuration.

Avant l’enregistrement d’une page cms, magento lance l’événement “cms_page_save_before”, à ce moment la, nous récupérons les informations de la page pour les enregistrer dans une table de la base de données et ainsi les sauvegarder
via la méthode “makePageVersion” de la classe Hhennes_CmsVersionning_Model_Observer.

Passons à present au contenu du module.

Pour commencer nous allons créer une table dans la base de données pour enregistrer les informations des anciennes pages cms.
Les informations conservées étant :
– L’id de la page
– Son titre
– La balise Meta description
– La balise Meta Keywords
– l’url réécrite de la page
– le contenu de la page
– la date de création de la version

Voici la requête à exécuter dans PhpMyAdmin

CREATE TABLE IF NOT EXISTS `mag_cms_page_versions` (
  `page_version_id` INT(11) NOT NULL AUTO_INCREMENT,
  `page_id` INT(11) NOT NULL,
  `title` VARCHAR(255) NOT NULL,
  `meta_keywords` text NOT NULL,
  `meta_description` text NOT NULL,
  `identifier` VARCHAR(255) NOT NULL,
  `content` text NOT NULL,
  `version_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY  (`page_version_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1

Une fois la table créé, place maintenant à l’observer qui sera chargé d’enregistrer les données dans cette table.
Créez un dossier “Model” et un fichier “Observer.php” dans le dossier de notre module.

Voici le contenu de ce fichier :

<?php
class Hhennes_CmsVersionning_Model_Observer {
 
 /**
 *  Page version observer
 *  Avant chaque enregistrement d'une page, la version précédente est sauvegardée
 */
 public function makePageVersion(Varien_Event_Observer $observer ) {
 
 //Récupération de l'objet "Page"
 $page = $observer->getEvent()->getObject();
 
 $write = Mage::getSingleton('core/resource')->getConnection('core_write');
 
 $query = "INSERT INTO mag_cms_page_versions (page_version_id,page_id,title,meta_keywords,meta_description,identifier,content) VALUES ('',?,?,?,?,?,?)";
 
 //Insertion des données de sauvegardes dans la table créée.
 $write->query($query,array($page->getPageId(),$page->getTitle(),$page->getMetaKeywords(),$page->getMetaDescription(),$page->getIdentifier(),$page->getContent()));
 
 }
 
}
 
?>

Dans le détail, le fichier observer récupère le contenu de la version enregistrée et l’insère dans notre base de données.
Les changements de pages sont donc maintenant versionnés.

Ce module étant réellement basique, il est possible de grandement l’améliorer en créant une interface dans l’adminstration, ou encore des possibilités de restaurations d’anciennes versions.
Pour cela… à vos claviers 😉