Un de mes derniers casse-tête a été d’inclure un JS externe dans mon head, sur l’index du checkout.
Jusque là vous me direz : « Mais c’est très simple avec les layout Magento »…
Oui mais la difficulté résidait dans le fait que je devait jouer avec mes paramètres présents dans Système > Configuration.
J’ai recherché si c’était possible avec des « ifconfig » dans mon XML, mais ce paramètre permet uniquement de reconnaître une valeur booléenne.
Il m’est alors venu une idée, absolument infaillible, simple, et qui peut s’appliquer pour plein de choses !
Trève de bavardage voici le layout de mon module (Layout déclaré bien sûr, dans le config XML de votre module) :
<?xml version="1.0" encoding="UTF-8"?> <layout> <checkout_onepage_index> <reference name="head"> <block type="mymodule/html_head" name="script_mymodule" /> </reference> </checkout_onepage_index> </layout>
Dans le config.xml de mon module je déclare les blocks
<?xml version="1.0"?> <config> <!-- ... --> <global> <!-- ... --> <blocks> <mymodule> <class>Mypackage_Mymodule_Block</class> </mymodule> </blocks> <!-- ... --> </global> <!-- ... --> </config>
Dans le dossier « Block » de mon module, je créé le dossier « Html », avec un fichier Head.php qui devra étendre « Mage_Page_Block_Html_Head » :
Attention : Vérifiez auparavant que le block Mage_Page_Block_Html_Head n’est pas surchargé ailleurs sur votre site ! Si les fonctionnalités pour ajouter un JS/CSS externe sont déjà implémentées par un module extérieur, vous n’aurez besoin que de la méthode _prepareLayout()
<?php class Mypackage_Mymodule_Block_Html_Head extends Mage_Page_Block_Html_Head { protected function _prepareLayout() { parent::_prepareLayout(); if(Mage::getStoreConfig('mysection/mymodule/active')){ $urlProd = Mage::getStoreConfig('mysection/mymodule/url_prod'); $urlTest = Mage::getStoreConfig('mysection/mymodule/url_test'); $mode = Mage::getStoreConfig('mysection/mymodule/mode'); $src = ($mode == "prod")? $urlProd : $urlTest; $this->addExternalJs($src); } else { $this->_data['items'] = array(); } return $this; } /** * Add External JavaScript file to HEAD entity * * @param string $name * @param string $params * @return Mage_Page_Block_Html_Head */ public function addExternalJs($name, $params = "") { $this->addItem('external_js', $name, $params); return $this; } /** * Add CSS file to HEAD entity * * @param External string $name * @param string $params * @return Mage_Page_Block_Html_Head */ public function addExternalCss($name, $params = "") { $this->addItem('external_css', $name, $params); return $this; } /** * Classify HTML head item and queue it into "lines" array * * @see self::getCssJsHtml() * @param array &$lines * @param string $itemIf * @param string $itemType * @param string $itemParams * @param string $itemName * @param array $itemThe */ protected function _separateOtherHtmlHeadElements(&$lines, $itemIf, $itemType, $itemParams, $itemName, $itemThe) { $params = $itemParams ? ' ' . $itemParams : ''; $href = $itemName; switch ($itemType) { case 'rss': $lines[$itemIf]['other'][] = sprintf('<link href="%s"%s rel="alternate" type="application/rss+xml" />', $href, $params ); break; case 'link_rel': $lines[$itemIf]['other'][] = sprintf('<link%s href="%s" />', $params, $href); break; case 'external_js': $lines[$itemIf]['other'][] = sprintf('<script type="text/javascript" src="%s" %s></script>', $href, $params); break; case 'external_css': $lines[$itemIf]['other'][] = sprintf('<link rel="stylesheet" type="text/css" href="%s" %s/>', $href, $params); break; } } }
Et voilà, j’ai un appel à un JS externe différent selon les valeurs dans mon administration Magento.
Après adaptez le fonctionnement a vos besoins, ceci est juste un exemple que j’ai du implémenter !
Pour ajouter un CSS externe :
$this->addExternalCSS($votre_url);
Il ne vous est pas interdit non plus d’utiliser les méthodes de la classe héritée :
public function addCss($name, $params = "") public function addJs($name, $params = "") public function addCssIe($name, $params = "") public function addJsIe($name, $params = "") public function addLinkRel($rel, $href) public function addItem($type, $name, $params=null, $if=null, $cond=null)
Vous pouvez même ajouter vos types d’item et les interpréter dans la méthode _separateOtherHtmlHeadElements !