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