Google CDN jQuery avec Local Fallback dans Magento Layout XML

18

J'ai fait ce qui suit pour inclure jQuery de Google CDN dans 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>

Cependant, lorsque je veux l'implémenter avec une solution de secours locale, qui fonctionne assez bien, je finis par l'ajouter à mon .phtml en tant que tel:

<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-t-il une manière plus élégante de faire cela dans local.xml que de pousser le repli dans le <text>nœud comme je le fais avec jQuery.noConflict?

Éditer:

Pour attirer l'attention sur l'autre partie de la question - existe-t-il des modules communautaires qui incluent jQuery pour vous? S'ils ont un jQuery local, c'est bien - s'ils utilisent Google CDN - c'est encore mieux. Si ce n'est pas là, j'aimerais en créer un.

  • Existe-t-il des extensions go-to qui gèrent cela sans que je doive l'amorcer moi-même?
philwinkle
la source
1
Un module de communauté très simple pour inclure JQuery (semi-auto-lien): github.com/netz98/N98_BaseJQuery - il ne comprend qu'un JQuery local. L'idée via CDN est sympa, n'hésitez pas à l'améliorer via Pull Requests :-)
Alex
Par curiosité: le CDN n'est-il pas fiable ou pourquoi la solution de rechange est-elle nécessaire? Quel genre d'expérience pratique avez-vous là-bas?
Alex
2
Certains pays (Iran, Syrie et autres) peuvent parfois bloquer Google et Google CDN. C'est mon expérience personnelle. J'ai également vu des choses comme les délais d'attente de réponse que cela atténue.
philwinkle
Comprendre. Il serait donc intéressant de pouvoir apporter une solution au module.
Alex
Super trouvaille - je n'ai pas vu le module N98 lorsque je cherchais quelque chose de convenable. Je pense que je vais contribuer là-bas. Merci! Cependant, cela peut être dû à la <text>méthode décrite ci-dessus ... je ne sais pas si c'est une solution acceptable. Le module n98 utilise un fichier js include séparé pour appeler noConflict, cependant, je suppose ...
philwinkle

Réponses:

18

À la fin de la journée, il est préférable de le faire via Layout XML. J'ai trouvé que l'option de secours locale est mieux implémentée dans une déclaration sur une seule ligne minimisée avec le 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
la source
cela ne fonctionne pas
fmsthird
2

J'ai longtemps cherché dans le code des fichiers head.phtml et les fichiers et blocs autour mais il n'y a aucun moyen sans changer les modèles pour injecter du code dans le <head>.

Je suis un idiot, vous avez déjà tout écrit et j'ai supervisé quelques fois le <?php echo $this->getChildHtml() ?>dans head.phtml: - /

Je voudrais donc simplement utiliser un core/templatebloc et un modèle pour cela. Il est facile à lire, à comprendre et à gérer.

Fabian Blechschmidt
la source
Le problème que j'essaie de surmonter est la possibilité d'ajouter / supprimer ce bloc de certains types de pages et mises en page à volonté sans avoir à inclure de force le phtml à chaque fois. À l'heure actuelle, un bloc statique suffit, mais uniquement parce qu'il est disponible partout dans le monde ...
philwinkle
Je ne vois pas le problème ici. Vous l'ajoutez à <par défaut> et le supprimez, partout où vous ne voulez pas l'avoir, comme tous les autres blocs. Vous pouvez penser à ajouter un core/text_listet à y ajouter tout ce que vous voulez (s'il s'agit de plusieurs fichiers) pour le supprimer plus facilement sur d'autres pages.
Fabian Blechschmidt