2012-08-13 26 views
5

Necesito agregar un archivo JS de forma condicional y programáticamente dentro de un archivo de bloque. Probé con estos códigos:¿Cómo agregar JS programáticamente en 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'); 
} 

Sin embargo, independientemente de lo que el ajuste es, se carga ninguna de este archivo. Incluso traté de eliminar la condición y cargar explícitamente solo un archivo, pero todavía no funciona. ¿Qué he hecho mal aquí?

+1

¿Funciona el enunciado condicional para un eco/impresión simple? –

+0

Gracias Alan por su respuesta. Sí, el condicional sí proporciona 0 o 1 si lo hago eco. Sin embargo, traté de eliminar todas las líneas excepto una línea: $ this-> getLayout() -> getBlock ('head') -> addJs ('ruta-a-archivo/archivo1.js'); Pero todavía no funciona. La ruta es después del directorio raíz js. – user1576748

+1

¿De qué archivo de plantilla de bloque está llamando? –

Respuesta

18

El problema aquí es probablemente uno de orden de procesamiento. Supongo que su código PHP se está evaluando después de que se haya renderizado el bloque principal. Si bien su código está actualizando con éxito la instancia de la clase de bloque principal, está sucediendo después de que se haya generado la salida desde esa instancia.

La mejor solución será añadir las llamadas addJs() en XML disposición para que puedan ser procesados ​​antes de su representación. Sería bueno si hubiera un atributo ifnotconfig, pero por ahora puede usar un ayudante.

Crear una clase de ayuda con un método que devuelve la ruta de escritura basada en los ajustes de configuración, a continuación, utilizar esto como el argumento de retorno.

<?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'; 
     } 
    } 
} 

Luego, en el diseño 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

¡Excelente! Eres rock ! funciona, excepto que hay un error tipográfico en el código en "si" línea. hay soporte cerrado que no sean necesarios antes de rizar soporte. de todos modos, muchas gracias. – user1576748

+1

Los peligros de (1) no probar y (2) codificación mientras estaba jet-lag. Corregido :-) – benmarks

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

Es el código correcto, busca si tu camino es correcto.

+0

Gracias por su respuesta. Sí, el camino es correcto. Es relativo a la carpeta raíz js. Incluso traté de copiar mi archivo js a esa raíz de la carpeta js (sin subcarpeta) y acceder directamente a este como addJs ('archivo1.js'); – user1576748

+0

Intenta poner el código: getJsUrl(); ?> jsFile.js "y ver qué código escribe. Los xml addjs son los mismos. – Guerra

+1

¿Qué sucede si quieres agregar un ejemplo de ruta absoluta? http://somedomain.com/js/some.js – awavi

1

Sé que esto se le preguntó hace mucho tiempo, pero en caso de que alguien está buscando esto, yo sugeriría a utilizar esto en su local.xml:

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

Por supuesto, esto es para archivos JS ubicados en la carpeta/js /. Use el método apropiado si quiere agregar skin_js o skin_css.

PS. Probado en CE 1.9

Cuestiones relacionadas