Google CDN jQuery mit lokalem Fallback in Magento Layout XML


18

Ich habe Folgendes getan, um jQuery von Google CDN in Magento aufzunehmen:

<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>

Wenn ich es jedoch mit einem lokalen Fallback implementieren möchte, was recht gut funktioniert, füge ich es meiner .phtml-Datei als solches hinzu:

<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>
  • Gibt es eine elegantere Möglichkeit, dies in local.xml zu tun, als den Fallback in den <text>Knoten zu verschieben, wie ich es tue jQuery.noConflict?

Bearbeiten:

Um die Aufmerksamkeit auf den anderen Teil der Frage zu lenken: Gibt es Community-Module, die jQuery für Sie enthalten? Wenn sie eine lokale jQuery haben, ist das in Ordnung - wenn sie Google CDN verwenden - noch besser. Wenn dies nicht da draußen ist, würde ich gerne eine erstellen.

  • Gibt es irgendwelche Erweiterungen, die damit umgehen, ohne dass ich sie selbst booten muss?

1
Ein sehr einfaches Community-Modul zum Einbinden von JQuery (Semi-Self-Link): github.com/netz98/N98_BaseJQuery - es enthält nur eine lokale JQuery. Die Idee über CDN ist nett, fühlen Sie sich frei, über Pull Requests zu verbessern :-)
Alex

Aus Neugier: Ist das CDN unzuverlässig oder warum wird der Fallback benötigt? Welche praktischen Erfahrungen haben Sie dort?
Alex

2
Einige Länder (Iran, Syrien ua) blockieren möglicherweise zeitweise Google und Google CDN. Das ist meine persönliche Erfahrung. Ich habe auch Dinge wie Antwort-Timeouts gesehen, die dadurch verringert werden.
Philwinkle

Verstehen. Es wäre also cool, wenn Sie eine Lösung für das Modul beitragen könnten.
Alex

Toller Fund - Ich habe das N98-Modul nicht gesehen, als ich nach etwas Passendem gesucht habe. Ich denke, ich werde dort beitragen. Vielen Dank! Es kann jedoch sein, dass es sich um die <text>oben beschriebene Methode handelt ... nicht sicher, ob dies eine akzeptable Lösung ist. Das n98-Modul verwendet eine separate Js-Include-Datei für den Aufruf von noConflict, aber ich nehme an ...
Philwinkle

Antworten:


18

Letztendlich ist dies über Layout XML vorzuziehen. Ich habe festgestellt, dass die lokale Fallback-Option am besten in einer einzeiligen Anweisung implementiert wird, die mit dem Google Closure Compiler minimiert wurde.

<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>

Das funktioniert nicht
fmsthird

2

Ich habe lange nach dem Code der head.phtml-Dateien und den Dateien und Blöcken gesucht, aber es gibt keine Möglichkeit, ohne Änderung der Vorlagen Code in den <head> einzufügen.

Ich bin ein Idiot, du hast schon alles geschrieben und ich habe das ein paar mal <?php echo $this->getChildHtml() ?>im Auge behalten head.phtml: - /

Also würde ich nur einen core/templateBlock und eine Vorlage dafür verwenden. Es ist leicht zu lesen, leicht zu verstehen und leicht zu verwalten.


Das Problem, das ich zu überwinden versuche, ist die Möglichkeit, diesen Block nach Belieben zu bestimmten Seitentypen und Layouts hinzuzufügen / daraus zu entfernen, ohne den HTML-Code jedes Mal erzwingen zu müssen. Im Moment reicht ein statischer Block aus, aber nur, weil er von den meisten überall verfügbar ist ...
Philwinkle

Ich sehe das Problem hier nicht. Sie fügen es zu <default> hinzu und entfernen es überall dort, wo Sie es nicht haben möchten, wie bei jedem anderen Block. Sie können darüber nachdenken, a hinzuzufügen core/text_listund dort alle gewünschten Elemente hinzuzufügen (wenn es sich um mehr als eine Datei handelt), um das Entfernen auf anderen Seiten zu vereinfachen.
Fabian Blechschmidt
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.