JQuery CDN do Google com fallback local no XML do layout Magento

18

Fiz o seguinte para incluir o jQuery do Google CDN no 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>

No entanto, quando eu quero implementá-lo com um fallback local, que funciona muito bem, acabo adicionando-o ao meu .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>
  • Existe uma maneira mais elegante de fazer isso no local.xml do que empurrar o fallback para o <text>nó como estou fazendo jQuery.noConflict?

Editar:

Para chamar a atenção para a outra parte da pergunta - existem módulos da comunidade que incluem o jQuery para você? Se eles têm um jQuery local, tudo bem - se eles usam o Google CDN - ainda melhor. Se isso não estiver lá, eu adoraria criar um.

  • Existem extensões de acesso que lidam com isso sem que eu precise inicializá-lo eu mesmo?
philwinkle
fonte
11
Um módulo da comunidade muito simples para incluir o JQuery (semi-link automático): github.com/netz98/N98_BaseJQuery - ele inclui apenas um JQuery local. A idéia via CDN é boa, sinta-se à vontade para melhorar via Pull Requests :-) #
Alex Alex
Por curiosidade: a CDN não é confiável ou por que o fallback é necessário? Que tipo de experiência prática você tem aí?
9773 Alex
2
Alguns países (Irã, Síria etc.) podem, às vezes, bloquear o Google e o Google CDN. Está é minha experiência pessoal. Também vi coisas como tempos limite de resposta que isso atenua.
Philwinkle
Compreendo. Portanto, seria legal se você puder contribuir com uma solução para o módulo.
Alex
Ótima descoberta - não vi o módulo N98 ao procurar algo adequado. Eu acho que vou contribuir por lá. Obrigado! No entanto, pode ter que ser com o <text>método descrito acima ... não tenho certeza se essa é uma solução aceitável. O módulo N98 usa um js separados arquivo de inclusão para chamar noConflict, embora, suponho ...
philwinkle

Respostas:

18

No final do dia, é preferível fazer isso via XML de layout. Descobri que a opção local de fallback é melhor implementada em uma declaração de linha única minificada com o Google Closure Compiler.

<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
fonte
isso não funciona
fmsthird 4/11
2

Procurei por um longo tempo o código dos arquivos head.phtml e os arquivos e blocos, mas não há como alterar os modelos para injetar código no <head>.

Eu sou um idiota, você já escreveu tudo e eu supervisionei algumas vezes <?php echo $this->getChildHtml() ?>nohead.phtml : - /

Então, eu usaria apenas um core/templatebloco e um modelo para isso. É fácil de ler, fácil de entender e fácil de gerenciar.

Fabian Blechschmidt
fonte
O problema que estou tentando superar é a capacidade de adicionar / remover este bloco de certos tipos de página e layouts à vontade, sem ter que incluir forçosamente o phtml todas as vezes. Agora um sufixos bloco estático, mas só porque ele está disponível a partir de quase todos os lugares ...
philwinkle
Não vejo o problema aqui. Você o adiciona ao <default> e o remove, em qualquer lugar onde você não deseja tê-lo, como todos os outros blocos. Você pode adicionar um core/text_liste adicionar lá tudo o que deseja (se houver mais de um arquivo) para removê-lo mais facilmente em outras páginas.
Fabian Blechschmidt