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 !

Ajouter du JS /CSS dans le head selon les valeurs de « System Config »
Taggé sur :                            

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Nous utilisons des cookies afin de nous assurer de vous proposer la meilleure expérience sur ce site.
Ok