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?
Philwinkle
sumber
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>
Philwinkle
sumber
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.

Fabian Blechschmidt
sumber
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