7 décembre 2012

Magento : ajouter des données aux pages CMS

On a parfois besoin d'ajouter des informations spécifiques aux pages CMS existant dans Magento. Pour cela, il faut créer un module qui va intervenir au niveau de la construction du formulaire d'édition d'une page et aussi éventuellement de l'enregistrement d'une page. Au niveau du stockage, vous pouvez modifier la table existante des pages CMS ou créer une nouvelle table et y stocker les informations spécifiques + l'id de la page concernée. La 2ème solution a évidemment l'avantage de préserver l'intégrité de ce que fournit Magento de base. Pour le module d'exemple que je vais détailler ci-après, j'ai choisi la 1ère solution pour simplifier la compréhension et rester centré sur la problématique de base ce post.

Puisque l'on a de toutes façons besoin d'un module, il faut commencer par le déclarer. Voici le contenu du fichier Aurmil_Cms.xml à placer dans app/etc/modules :
<?xml version="1.0"?>
<config>
    <modules>
        <Aurmil_Cms>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Cms />
            </depends>
        </Aurmil_Cms>
    </modules>
</config>
Il faut ensuite créer le fichier app/code/local/Aurmil/Cms/etc/config.xml et les dossiers parents nécessaires :
<?xml version="1.0"?>
<config>
    <modules>
        <Aurmil_Cms>
            <version>0.1.0</version>
        </Aurmil_Cms>
    </modules>
</config>

On a ensuite besoin de modifier la table cms_page. On va donc créer le fichier app/code/local/Aurmil/Cms/sql/aurmil_cms_setup/install-0.1.0.php :
$installer = $this;
$installer->startSetup();
$installer->run("
ALTER TABLE `cms_page` ADD COLUMN `is_test` TINYINT(1) NOT NULL DEFAULT 0;
");
$installer->endSetup();
Puis le déclarer dans config.xml :
<global>
    <resources>
        <aurmil_cms_setup>
            <setup>
                <module>Aurmil_Cms</module>
            </setup>
        </aurmil_cms_setup>
    </resources>
</global>

On va maintenant s'occuper du formulaire de création/édition des pages. On va pour cela observer un évènement spécifique et ajouter notre champ. Observation de l'évènement dans config.xml :
<adminhtml>
    <events>
        <adminhtml_cms_page_edit_tab_main_prepare_form>
            <observers>
                <aurmil_cms_prepare_main_page_form>
                    <class>aurmil_cms/observer</class>
                    <method>prepareMainPageForm</method>
                </aurmil_cms_prepare_main_page_form>
            </observers>
        </adminhtml_cms_page_edit_tab_main_prepare_form>
    </events>
</adminhtml>
Déclaration des modèles (pour l'observateur) dans le noeud global de config.xml :
<models>
     <aurmil_cms>
        <class>Aurmil_Cms_Model</class>
     </aurmil_cms>
</models>
Code associé à l'évènement dans app/code/local/Aurmil/Cms/Model/Observer.php :
class Aurmil_Cms_Model_Observer
{
    public function prepareMainPageForm($observer)
    {
        /* @var $form Varien_Data_Form */
        $form = $observer->getForm();

        /* @var $fieldset Varien_Data_Form_Element_Fieldset */
        $fieldset = $form->addFieldset('aurmil_cms_fieldset', array(
            'legend' => 'Aurmil CMS',
            'class' => 'fieldset-wide'
        ));

        /* @var $fieldset Varien_Data_Form_Element_Select */
        $fieldset->addField('is_test', 'select', array(
            'name'     => 'is_test',
            'label'     => 'Is Test Page?',
            'title'     => 'Is Test Page?',
            'values'    => Mage::getSingleton('adminhtml/system_config_source_yesno')->toOptionArray(),
        ));
    }
}

Au niveau de l'enregistrement, si vous gérez une donnée simple, vous n'avez rien de plus à faire. Par contre pour une donnée "complexe" (ex : une image), vous devrez observer l'évènement cms_page_prepare_save et effectuer les opérations nécessaires.

Si vous avez choisi d'enregistrer les données dans une table à part, vous devrez observer cet évènement dans tous les cas. Et pour que le formulaire soit correctement rempli, dans prepareMainPageForm(), vous devrez rajouter le code suivant à la déclaration de votre champ :
'value' => Mage::registry('cms_page')->getIsTest()
Au niveau de l'utilisation en front, vous pouvez :
  • créer un layout de page CMS et son template associé en vous inspirant d'un des layouts existant, y ajouter la gestion de votre nouvelle donnée ($page->getIsTest()) et choisir ce layout pour votre page
  • créer un template avec la gestion de votre donnée et ajouter ce template à votre page via un block core/template ajouté au noeud "content" via le champ "Layout update XML" de votre page ou via le fichier de layout page.xml si c'est un comportement à généraliser
  • dupliquer simplement le template de page pour y ajouter la gestion de votre donnée
Il est tout à fait possible qu'il existe d'autres solutions.

Aucun commentaire:

Enregistrer un commentaire