загрузка страницы And Drupal jQuery

Я полагаю, что единственный способ вызвать перезагрузку в css - это изменить версию в URL-адресе импорта, как вы упомянули в своем вопросе.

Не уверен, поможет ли это, но , используя php и apache, вы можете использовать filemtime() вместе с правилами перезаписи для автоматического обновления имени версии css всякий раз, когда в файл вносятся изменения.

Вот пример:

// Pass in the url path to the file '/frontend/css/main.css' for example
function css_auto_version($file) {
    // Return $file if the path is faulty to prevent errors.
    if(strpos($file, '/') !== 0 || !file_exists(

Я полагаю, что единственный способ вызвать перезагрузку в css - это изменить версию в URL-адресе импорта, как вы упомянули в своем вопросе.

Не уверен, поможет ли это, но , используя php и apache, вы можете использовать filemtime() вместе с правилами перезаписи для автоматического обновления имени версии css всякий раз, когда в файл вносятся изменения.

Вот пример:

[110]

Затем в вашем файле .htaccess для корня документа вам нужно добавить следующее:

RewriteEngine on
RewriteRule ^(.*)\.[\d]{10}\.(css)$ $1.$2 [L]

Это правило переписывания в основном говорит apache вместо этого ищет /frontend/css/main.TIMESTAMP.css в /frontend/css/main.css.

Теперь вы можете использовать эту функцию в своем php-шаблоне, как этот echo css_auto_version('/frontend/css/main.css');, и имя файла в пути всегда будет содержать метку времени последнего изменения файла. Любой браузер с более старой версией кэшированного файла поверит, что это совершенно другой файл, и перезагрузит его с сервера. Правило перезаписи удалит отметку времени в запросах и позволит серверу найти правильный файл CSS и отправить его обратно в браузер.

Поскольку вы не можете использовать php внутри css-файла, вам, вероятно, придется включить правила @import в тег style в HTML и включить туда php.

Вы можете узнать больше о filemtime здесь https://www.w3schools.com/php/func_filesystem_filemtime.asp

Если вы действительно хотите просто всегда принудительно перезагружать, Независимо от того, изменился ли файл на самом деле, я бы предложил установить в ответе заголовки http как no-cache. Вы можете прочитать больше об этом здесь:

HTTP Cache-control https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control [ 1120]

PHP header () https://www.w3schools.com/php/func_http_header.asp

Надеюсь, это поможет!

SERVER['DOCUMENT_ROOT'] . $file)) return $file; // filemtime() returns a timestamp showing the last time the file was changed. $mtime = filemtime(

Я полагаю, что единственный способ вызвать перезагрузку в css - это изменить версию в URL-адресе импорта, как вы упомянули в своем вопросе.

Не уверен, поможет ли это, но , используя php и apache, вы можете использовать filemtime() вместе с правилами перезаписи для автоматического обновления имени версии css всякий раз, когда в файл вносятся изменения.

Вот пример:

[110]

Затем в вашем файле .htaccess для корня документа вам нужно добавить следующее:

RewriteEngine on
RewriteRule ^(.*)\.[\d]{10}\.(css)$ $1.$2 [L]

Это правило переписывания в основном говорит apache вместо этого ищет /frontend/css/main.TIMESTAMP.css в /frontend/css/main.css.

Теперь вы можете использовать эту функцию в своем php-шаблоне, как этот echo css_auto_version('/frontend/css/main.css');, и имя файла в пути всегда будет содержать метку времени последнего изменения файла. Любой браузер с более старой версией кэшированного файла поверит, что это совершенно другой файл, и перезагрузит его с сервера. Правило перезаписи удалит отметку времени в запросах и позволит серверу найти правильный файл CSS и отправить его обратно в браузер.

Поскольку вы не можете использовать php внутри css-файла, вам, вероятно, придется включить правила @import в тег style в HTML и включить туда php.

Вы можете узнать больше о filemtime здесь https://www.w3schools.com/php/func_filesystem_filemtime.asp

Если вы действительно хотите просто всегда принудительно перезагружать, Независимо от того, изменился ли файл на самом деле, я бы предложил установить в ответе заголовки http как no-cache. Вы можете прочитать больше об этом здесь:

HTTP Cache-control https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control [ 1120]

PHP header () https://www.w3schools.com/php/func_http_header.asp

Надеюсь, это поможет!

SERVER['DOCUMENT_ROOT'] . $file); // return '/frontend/css/main.TIMESTAMP.css' return preg_replace('{\\.([^./]+)$}', ".$mtime.\$1", $file); }

Затем в вашем файле .htaccess для корня документа вам нужно добавить следующее:

RewriteEngine on
RewriteRule ^(.*)\.[\d]{10}\.(css)$ $1.$2 [L]

Это правило переписывания в основном говорит apache вместо этого ищет /frontend/css/main.TIMESTAMP.css в /frontend/css/main.css.

Теперь вы можете использовать эту функцию в своем php-шаблоне, как этот echo css_auto_version('/frontend/css/main.css');, и имя файла в пути всегда будет содержать метку времени последнего изменения файла. Любой браузер с более старой версией кэшированного файла поверит, что это совершенно другой файл, и перезагрузит его с сервера. Правило перезаписи удалит отметку времени в запросах и позволит серверу найти правильный файл CSS и отправить его обратно в браузер.

Поскольку вы не можете использовать php внутри css-файла, вам, вероятно, придется включить правила @import в тег style в HTML и включить туда php.

Вы можете узнать больше о filemtime здесь https://www.w3schools.com/php/func_filesystem_filemtime.asp

Если вы действительно хотите просто всегда принудительно перезагружать, Независимо от того, изменился ли файл на самом деле, я бы предложил установить в ответе заголовки http как no-cache. Вы можете прочитать больше об этом здесь:

HTTP Cache-control https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control [ 1120]

PHP header () https://www.w3schools.com/php/func_http_header.asp

Надеюсь, это поможет!

7
задан NullUserException 30 November 2011 в 18:23
поделиться

2 ответа

VonC соответственно ответил, "как" часть вопроса, таким образом, я сфокусируюсь на "где" часть.

Если сценарий является определенным для темы, то естественное место для помещения файла сценария находится в теме. Проблема состоит в том, что к этому времени Drupal добирается до темы, $scripts переменная была уже "представлена" (в языке Drupal) в HTML. Для добавления сценария в слое темы необходимо добавить сценарий и восстановить $scripts переменная.

Принятие Вас использует Drupal 6, это вошло бы в Ваш theme_preprocess_page() функция:

drupal_add_js(drupal_get_path('theme', 'theme_name') .'/example.js', 'theme');
$variables['scripts'] = drupal_get_js();

Просто измените второй аргумент drupal_get_path() для отражения названия темы затем измените имя файла сценария от example.js к чему Вы назвали свой сценарий.

2
ответ дан 7 December 2019 в 03:22
поделиться

Не специалист Drupal, но эта запись в блоге предлагает, чтобы с Drupal 6 Вы не должны были включать $(document).ready() функция в нашем jQuery кодирует вообще.

Вместо этого Вы могли поместить весь код в функции, из которой Вы присваиваетесь как свойство Drupal.behaviors.

В misc/ directory из установки Drupal у нас не только есть jquery.js файл, но и у нас также есть drupal.js (и несколько других js файлов, управляя функциональностью, характерной для определенных страниц или администраторских функций, например, upload.js), который управляет общим использованием jQuery в Drupal.

Это объявляет объект JavaScript Drupal в целях содержания свойств, к которым должны получить доступ и использовать другие js файлы. Например, свойство Drupal.settings используется для передачи массива настроек модуля к коду js для того модуля. Вы делаете это просто путем вызова drupal_add_js () в коде php и проверки, что второй параметр передается в как "установка", например:

drupal_add_js(array('mymodule' => $array_of_settings), 'setting'); 

В Вашем js файле, затем, можно получить доступ к этим настройкам в Drupal.settings.mymodule. Вы таким образом расширили объект Drupal.settings с помощью mymodule свойства, которое является самостоятельно объектом, содержащим все Ваши настройки.

Другое свойство объекта Drupal является объектом поведений, т.е. Drupal.behaviors, и когда мы хотим, чтобы наш модуль добавил новые поведения jQuery, мы просто расширяем этот объект. Весь код jQuery для Вашего модуля мог быть структурирован как это:

Drupal.behaviors.myModuleBehavior = function (context) 
{
    //do some fancy stuff
};

Но, можно ли задаться вопросом, все, что делает, объявляют функцию - как это даже становится названным? Ну, об этом все заботятся в drupal.js. Это имеет a $(document).ready функция, которая звонит Drupal.attachBehaviors функция, который в свою очередь циклы через Drupal.behaviors объект называя каждые из его свойств, при этом эти весь функции, объявленные различными модулями как выше, и передающий в документе как контекст.

Причина того, чтобы сделать его, которым этот путь состоит в том, что, если Ваш код jQuery выполняет вызовы Ajax, которые приводят к новым элементам DOM, добавляемым к странице, Вы могли бы хотеть, чтобы Ваши поведения (например, скрывающий все h3 элементы или безотносительно) были присоединены к тому новому содержанию также. Но так как это не существовало, когда DOM был загружен и Drupal.attachBehaviors работал это не имеет никаких поведений присоединенными. С вышеупомянутой установкой, тем не менее, все, что необходимо сделать, звонить Drupal.behaviors.myModuleBehavior(newcontext), где newcontext было бы новое, поставленное AJAX содержание, таким образом гарантировав, чтобы поведения не становились приложенными к целому документу снова и снова. Посмотрите здесь для полного примера того, как использовать этот код

7
ответ дан 7 December 2019 в 03:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: