Google CDN jQuery dengan Fallback Lokal di Magento Layout XML


18

Saya telah melakukan yang berikut untuk memasukkan jQuery dari Google CDN di 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>

Namun ketika saya ingin mengimplementasikannya dengan fallback lokal, yang berfungsi dengan baik, saya akhirnya menambahkannya ke .phtml saya seperti:

<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>
  • Apakah ada cara yang lebih elegan untuk melakukan ini di local.xml daripada mendorong fallback ke <text>node seperti yang saya lakukan jQuery.noConflict?

Edit:

Untuk menarik perhatian ke bagian lain dari pertanyaan - apakah ada modul komunitas yang menyertakan jQuery untuk Anda? Jika mereka memiliki jQuery lokal, itu bagus - jika mereka menggunakan Google CDN - bahkan lebih baik. Jika ini tidak ada, saya ingin membuatnya.

  • Apakah ada ekstensi masuk yang menangani ini tanpa saya harus bootstrap sendiri?

1
Satu modul komunitas yang sangat sederhana untuk menyertakan JQuery (semi-self-link): github.com/netz98/N98_BaseJQuery - hanya menyertakan JQuery lokal. Gagasan melalui CDN bagus, jangan ragu untuk meningkatkan melalui Tarik Permintaan :-)
Alex

Karena penasaran: Apakah CDN tidak dapat diandalkan atau mengapa mundur diperlukan? Pengalaman praktis seperti apa yang Anda miliki di sana?
Alex

2
Beberapa negara (Iran, Suriah, dkk) kadang-kadang dapat memblokir Google dan Google CDN. Ini adalah pengalaman pribadi saya. Saya juga telah melihat hal-hal seperti timeout respons yang mengurangi ini.
philwinkle

Memahami. Jadi akan lebih keren jika Anda dapat berkontribusi solusi untuk modul.
Alex

Great find - Saya tidak melihat modul N98 ketika mencari sesuatu yang cocok. Saya pikir saya akan berkontribusi di sana. Terima kasih! Namun mungkin harus dengan <text>metode seperti yang dijelaskan di atas ... tidak yakin apakah itu solusi yang dapat diterima. Modul n98 menggunakan js terpisah termasuk file untuk memanggil noConflict, meskipun, saya kira ...
philwinkle

Jawaban:


18

Pada akhirnya, melakukan ini melalui Layout XML lebih disukai. Saya telah menemukan bahwa opsi fallback lokal paling baik diimplementasikan dalam pernyataan satu baris yang diperkecil dengan 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>

ini tidak berhasil
fmsthird

2

Saya mencari untuk waktu yang lama melalui kode file head.phtml dan file dan blok sekitar tetapi tidak ada cara tanpa mengubah template untuk menyuntikkan kode ke dalam <head>.

Saya idiot, Anda sudah menulis semuanya dan saya mengawasi beberapa kali <?php echo $this->getChildHtml() ?>dalam head.phtml: - /

Jadi saya hanya akan menggunakan core/templateblok dan template untuk ini. Mudah dibaca, mudah dimengerti, dan mudah dikelola.


Masalah yang saya coba atasi adalah kemampuan untuk menambah / menghapus blok ini dari jenis halaman dan tata letak sesuka hati tanpa harus memasukkan phtml dengan paksa setiap saat. Saat ini blok statis sudah mencukupi, tetapi hanya karena itu tersedia dari sebagian besar tempat ...
philwinkle

Saya tidak melihat masalah di sini. Anda menambahkannya ke <default> dan menghapusnya, di mana pun Anda tidak ingin memilikinya, seperti setiap blok lainnya. Anda dapat berpikir tentang menambahkan core/text_listdan menambahkan di sana semua hal yang Anda inginkan (jika lebih dari satu file) untuk lebih mudah menghapusnya di halaman lain.
Fabian Blechschmidt
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.