Google CDN jQuery с локальным резервом в формате Magento Layout XML

18

Я сделал следующее, чтобы включить jQuery из Google CDN в 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>

Однако, когда я хочу реализовать его с локальным резервом, который работает довольно хорошо, я заканчиваю тем, что добавляю его в свой .phtml как таковой:

<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>
  • Есть ли более элегантный способ сделать это в local.xml, чем запихнуть запасной вариант в <text>узел, как я делаю jQuery.noConflict?

Редактировать:

Чтобы привлечь внимание к другой части вопроса - существуют ли модули сообщества, которые включают в себя jQuery? Если у них есть локальный jQuery, это нормально - если они используют Google CDN - даже лучше. Если этого нет, я бы с удовольствием его создал.

  • Существуют ли какие-либо расширения, которые справляются с этим, и мне самому не нужно загружать его?
philwinkle
источник
1
Один очень простой модуль сообщества для включения JQuery (полу-самостоятельная ссылка): github.com/netz98/N98_BaseJQuery - он включает только локальный JQuery. Идея через CDN хороша, не стесняйтесь улучшать через Pull Requests :-)
Alex
Из любопытства: CDN ненадежен или зачем нужен запасной вариант? Какой практический опыт у вас там?
Алекс
2
Некоторые страны (Иран, Сирия и др.) Могут иногда блокировать Google и Google CDN. Это мой личный опыт. Я также видел такие вещи, как время ожидания ответа, которое это смягчает.
Philwinkle
Понимаю. Так что было бы здорово, если бы вы могли предложить решение для модуля.
Алекс
Отличная находка - я не видел модуль N98, когда искал что-то подходящее. Я думаю, что внесу свой вклад там. Благодарность! Однако это может быть связано со <text>способом, описанным выше ... не уверен, что это приемлемое решение. Модуль n98 использует отдельный файл включения js для вызова noConflict, хотя, я полагаю ...
philwinkle

Ответы:

18

В конце концов, делать это через Layout XML предпочтительнее. Я обнаружил, что локальный резервный вариант лучше всего реализовать в виде однострочного оператора, уменьшенного с помощью компилятора 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
источник
это не работает
fmsthird
2

Я долго просматривал код файлов head.phtml, файлов и блоков вокруг, но без изменения шаблонов невозможно внедрить код в <head>.

Я идиот, вы уже все написали, и я несколько раз наблюдал <?php echo $this->getChildHtml() ?>в head.phtml: - /

Поэтому я бы просто использовал для этого core/templateблок и шаблон. Это легко читать, легко понять и легко управлять.

Фабиан Блехшмидт
источник
Проблема, которую я пытаюсь преодолеть, заключается в возможности добавлять / удалять этот блок из определенных типов страниц и макетов по желанию без необходимости принудительного включения phtml каждый раз. Прямо сейчас достаточно статического блока, но только потому, что он доступен почти везде ...
philwinkle
Я не вижу здесь проблемы. Вы добавляете его в <default> и удаляете его везде, где вы не хотите его иметь, как и в любом другом блоке. Вы можете подумать о добавлении core/text_listи добавлении туда всего, что вы хотите (если это более одного файла), чтобы легче было удалить его на других страницах.
Фабиан Блехшмидт