2012-08-13 16 views
5

Ho bisogno di aggiungere un file JS in modo condizionale e programmatico all'interno di un file di blocco. Ho provato con questi codici:Come aggiungere JS a livello di codice in Magento?

if (Mage::getStoreConfig('mymodule/settings/enable')) { 
$this->getLayout()->getBlock('head')->addJs('path-to-file/file1.js'); 
} else { 
$this->getLayout()->getBlock('head')->addJs('path-to-file/file2.js'); 
} 

Tuttavia, indipendentemente da quale sia l'impostazione, nessuno di questi file viene caricato. Ho persino provato ad eliminare la condizione e caricare esplicitamente un solo file, ma non funziona ancora. Cosa ho fatto di sbagliato qui?

+1

L'istruzione condizionale funziona per un semplice eco/stampa? –

+0

Grazie Alan per la tua risposta. Sì, il condizionale fornisce 0 o 1 se lo echo. Tuttavia, ho cercato di eliminare tutte le righe tranne una riga: $ this-> getLayout() -> getBlock ('head') -> addJs ('percorso-file/file1.js'); Ma ancora non funziona. Il percorso è dopo la directory root di js. – user1576748

+1

Da quale file di modello del blocco si sta chiamando? –

risposta

18

Il problema qui è probabilmente uno di ordine di elaborazione. La mia ipotesi è che il codice PHP venga valutato dopo il rendering del blocco principale. Mentre il codice sta aggiornando con successo l'istanza della classe head block, sta accadendo dopo che l'output è stato generato da quell'istanza.

La soluzione migliore sarà aggiungere le chiamate addJs() nel formato XML in modo che vengano elaborate prima del rendering. Sarebbe bello se ci fosse un attributo ifnotconfig, ma per ora puoi usare un helper.

Creare una classe helper con un metodo che restituisce il percorso di script in base alle impostazioni di configurazione, quindi utilizzare questo come argomento di ritorno.

<?php 
class My_Module_Helper_Class extends Mage_Core_Helper_Abstract 
{ 
    public function getJsBasedOnConfig() 
    { 
     if (Mage::getStoreConfigFlag('mymodule/settings/enable')) { 
      return 'path-to-file/file1.js'; 
     } 
     else { 
      return 'path-to-file/file2.js'; 
     } 
    } 
} 

Poi nel layout XML:

<?xml version="1.0"?> 
<layout> 
    <default> 
     <reference name="head"> 
      <action method="addJs"> 
       <file helper="classgroup/class/getJsBasedOnConfig" /> 
       <!-- i.e. Mage::helper('module/helper')->getJsBasedOnConfig() --> 
      </action> 
     </reference> 
    </default> 
</layout> 
+0

Eccellente! Sei rock ! Funziona, eccetto che c'è un errore di battitura nel tuo codice sulla linea "if" C'è una parentesi chiusa non necessaria prima della parentesi di arricciatura In ogni caso, grazie mille – user1576748

+1

I pericoli di (1) non testare e (2) codice durante il jet-lag. Corretto :-) – benmarks

3
$this->getLayout()->getBlock('head')->addJs('path'); 

È il codice giusto, cerca se il tuo percorso è giusto.

+0

Grazie per la risposta. Sì, il percorso è giusto. È relativo alla cartella root di js. Ho anche provato a copiare il mio file js nella cartella root js (senza sottocartella) e accedervi direttamente come questo addJs ('file1.js'); – user1576748

+0

Prova a inserire il codice: getJsUrl(); ?> jsFile.js "e vedi quale codice scrive. Gli addjs xml sono gli stessi – Guerra

+1

E se vuoi aggiungere un esempio di percorso assoluto http://somedomain.com/js/some.js – awavi

1

So che questo è stato chiesto molto tempo fa, ma nel caso in cui qualcuno è alla ricerca di questo, vorrei suggerire di utilizzare questo nel vostro local.xml:

<layout> 
    <default> 
     <reference name="head"> 
      <action ifconfig="path/to/config" method="addJs"> 
       <script>pathto/file.js</script> 
      </action> 
     </reference> 
    </default> 
</layout> 

Naturalmente questo è per i file JS situati in/js/cartella. Utilizzare il metodo appropriato se si desidera aggiungere skin_js o skin_css.

PS. Testato su CE 1.9

Problemi correlati