Google CDN jQuery con Local Fallback en Magento Layout XML

18

He hecho lo siguiente para incluir jQuery de Google CDN en Magento:

<default>
    <reference name="head">
        <block type="core/text" name="google.cdn.jquery">
            <action method="setText">
                <text><![CDATA[<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script><script type="text/javascript">jQuery.noConflict();</script>]]>
                </text>
            </action>
        </block>
    </reference>
</default>

Sin embargo, cuando quiero implementarlo con un respaldo local, que funciona bastante bien, termino agregándolo a mi .phtml como tal:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script>
if (!window.jQuery) {
    document.write('<script src="/path/to/your/jquery"><\/script>');
}
</script>
  • ¿Hay una forma más elegante de hacer esto en local.xml que empujar el respaldo al <text>nodo como lo estoy haciendo jQuery.noConflict?

Editar:

Para llamar la atención sobre la otra parte de la pregunta, ¿hay módulos comunitarios que incluyan jQuery para usted? Si tienen un jQuery local, está bien, si usan Google CDN, incluso mejor. Si esto no está ahí afuera, me encantaría crear uno.

  • ¿Hay extensiones de acceso que manejen esto sin que yo tenga que arrancarlo yo mismo?
philwinkle
fuente
1
Un módulo comunitario muy simple para incluir JQuery (semi-self-link): github.com/netz98/N98_BaseJQuery : solo incluye un JQuery local. La idea a través de CDN es agradable, siéntase libre de mejorar a través de Solicitudes de extracción :-)
Alex
Por curiosidad: ¿No es confiable la CDN o por qué se necesita el respaldo? ¿Qué tipo de experiencia práctica tienes allí?
Alex
2
Algunos países (Irán, Siria, etc.) pueden, en ocasiones, bloquear Google y Google CDN. Esta es mi experiencia personal. También he visto cosas como tiempos de espera de respuesta que esto mitiga.
philwinkle
Entender. Por lo tanto, sería genial si puede aportar una solución al módulo.
Alex
Gran descubrimiento: no vi el módulo N98 cuando buscaba algo adecuado. Creo que contribuiré allí. ¡Gracias! Sin embargo, puede tener que ser con el <text>método descrito anteriormente ... no estoy seguro si esa es una solución aceptable. El módulo N98 utiliza un js separadas incluyen archivos para llamar noConflict, sin embargo, supongo ...
philwinkle

Respuestas:

18

Al final del día, es preferible hacerlo a través de Layout XML. He descubierto que la opción de reserva local se implementa mejor en una declaración de una sola línea minimizada con el Compilador de cierre de Google.

<default>
    <reference name="head">
        <block type="core/text" name="google.cdn.jquery">
            <action method="setText">
                <text><![CDATA[<script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script><script>window.jQuery||document.write('<script src="/path/to/your/jquery.js">\x3c/script>');</script><script>jQuery.noConflict();</script>]]></text>
            </action>
        </block>
    </reference>
</default>
philwinkle
fuente
esto no funciona
fmsthird
2

Busqué durante mucho tiempo el código de los archivos head.phtml y los archivos y bloques, pero no hay forma de cambiar las plantillas para inyectar código en el <head>.

Soy un idiota, ya escribiste todo y supervisé algunas veces <?php echo $this->getChildHtml() ?>en head.phtml: - /

Así que solo usaría un core/templatebloque y una plantilla para esto. Es fácil de leer, fácil de entender y fácil de administrar.

Fabian Blechschmidt
fuente
El problema que estoy tratando de superar es la capacidad de agregar / eliminar este bloque de ciertos tipos de páginas y diseños a voluntad sin tener que incluir forzosamente el phtml cada vez. En este momento es suficiente un bloqueo estático, pero solo porque está disponible en casi todas partes ...
#
No veo el problema aquí. Lo agrega a <default> y lo elimina, en todas partes donde no desea tenerlo, como cualquier otro bloque. Puede pensar en agregar ay core/text_listagregar allí todo lo que desee (si es más de un archivo) para eliminarlo fácilmente en otras páginas.
Fabian Blechschmidt