Google CDN jQuery z Lokalnym Fallbackem w Magento Layout XML

18

Zrobiłem następujące, aby dołączyć jQuery z Google CDN w 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>

Jednak gdy chcę wdrożyć go z lokalną rezerwą, która działa całkiem dobrze, kończę dodając go do mojego pliku .phtml jako takiego:

<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>
  • Czy istnieje bardziej elegancki sposób na zrobienie tego w local.xml niż wepchnięcie rezerwy do <text>węzła, tak jak ja to robię jQuery.noConflict?

Edytować:

Aby zwrócić uwagę na drugą część pytania - czy istnieją dla ciebie moduły społecznościowe zawierające jQuery? Jeśli mają lokalnego jQuery, to w porządku - jeśli używają Google CDN - nawet lepiej. Jeśli tego nie ma, chciałbym je stworzyć.

  • Czy są jakieś rozszerzenia, które sobie z tym poradzą, bez konieczności samodzielnego uruchamiania?
philwinkle
źródło
1
Jeden bardzo prosty moduł społecznościowy do włączenia JQuery (semi-self-link): github.com/netz98/N98_BaseJQuery - zawiera tylko lokalny JQuery. Pomysł za pośrednictwem CDN jest fajny, zachęcamy do ulepszenia za pomocą Pull Requests :-)
Alex
Z ciekawości: czy CDN jest zawodny lub dlaczego potrzebna jest awaria? Jakie masz praktyczne doświadczenie?
Alex
2
Niektóre kraje (Iran, Syria i in.) Mogą czasami blokować sieci CDN Google i Google. To jest moje osobiste doświadczenie. Widziałem też takie ograniczenia czasu, jak to, co ogranicza.
philwinkle
Rozumiesz. Byłoby fajnie, gdybyś mógł wnieść rozwiązanie do modułu.
Alex
Świetne znalezisko - nie widziałem modułu N98, gdy szukałem czegoś odpowiedniego. Myślę, że się tam pomogę. Dzięki! Może jednak być konieczne zastosowanie <text>metody opisanej powyżej ... nie jestem pewien, czy jest to akceptowalne rozwiązanie. Moduł n98 używa osobnego pliku dołączania js do wywoływania noConflict, ale przypuszczam, że ...
philwinkle

Odpowiedzi:

18

Pod koniec dnia lepiej jest to zrobić za pomocą Layout XML. Odkryłem, że lokalną opcję zastępczą najlepiej wdrożyć w instrukcji jednowierszowej zminimalizowanej za pomocą kompilatora Google Closure.

<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
źródło
to nie działa
fmsthird
2

Długo szukałem kodu plików head.phtml oraz plików i bloków wokół, ale nie ma sposobu bez zmiany szablonów, aby wstrzyknąć kod do <head>.

Jestem idiotą, napisałeś już wszystko i nadzorował kilka razy <?php echo $this->getChildHtml() ?>w head.phtml: - /

Chciałbym po prostu użyć do tego core/templatebloku i szablonu. Jest łatwy do odczytania, łatwy do zrozumienia i zarządzania.

Fabian Blechschmidt
źródło
Problem, który próbuję przezwyciężyć, to możliwość dodawania / usuwania tego bloku z niektórych typów stron i układów w dowolnym momencie bez konieczności wymuszonego dołączania pliku phtml za każdym razem. W tej chwili wystarczy blok statyczny, ale tylko dlatego, że jest dostępny z większości miejsc ...
philwinkle
Nie widzę tutaj problemu. Dodajesz go do <domyślny> i usuwasz, wszędzie tam, gdzie nie chcesz go mieć, jak każdy inny blok. Możesz pomyśleć o dodaniu core/text_listi dodaniu tam wszystkich rzeczy, które chcesz (jeśli jest to więcej niż jeden plik), aby łatwiej je usunąć na innych stronach.
Fabian Blechschmidt