Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

Принудительная перегрузка основных CSS файлов шаблона

00 голосов
6
Здравствуйте, умные люди ;)

Для тех кому влом читать:
Какими способами принудительно, на стороне клиента, можно перегружать главные css файлы шаблона?

Наверняка у многих из Вас возникала следующая проблема:

У проекта с довольно внушительной посещаемостью, меняется главная таблица каскадных стилей.
Естественно в кеше у всех пользователей лежит старый файл.
Изменения в новом файле довольно внушительные, и все пользователи со старой таблицей видят некорректно отображаемую структуру страницы.

Файлы компонентов отлично перегружаются (в зависимости от настроек кеширования), им ведь добавляется идентификатор типа style.css?1257844589.

А вот как быть с главными файлами стилей?

Можно конечно извратиться, и на определенное время менять названия и принудительно подгружать в коде шаблона новые версии файлов, но ведь это довольно гемморно. Или такой способ имеет место быть за неимением автоматизации?

Поделитесь пожалуйста Вашими соображениями по этому поводу.
спросил 17 Март, 13 от Traxexx (900 баллов)

6 Ответы

00 голосов
Неужели ни у кого такая потребность не возникала?
ответил 17 Март, 13 от Traxexx (900 баллов)
00 голосов
Можно не "на определенное время менять названия", а постоянно использовать файл стилей с вашим (динамическим) именем. Либо напрямую в шаблоне сайта указать <link>, либо через $APPLICATION->SetAdditionalCSS().
ответил 19 Март, 13 от Ixie (540 баллов)
00 голосов
Ну насчет переименовываний, подставлений функций или просто новых цсс линков, это вопрос всем известный в том числе и мне.

А вот как насчет автоматизации всего этого дела? Что вы имели ввиду под "динамическим" именем? :)
ответил 31 Май, 13 от Traxexx (900 баллов)
00 голосов
Решил данную проблему следующим образом:
По аналогии с подключением CSS в компонентах, модифицировал подключение основных CSS шаблона.

Для этого в классе CAllMain (/bitrix/modules/main/classes/general/main.php) изменил функцию GetCSS() (в районе 630-640 строк).

Заменил код:
Код
if($bLink || file_exists($filename))
{
   $res .= '<link href="'.$css_path.'" type="text/css" rel="stylesheet"'.($bXhtmlStyle? ' /':'').'>'."\n";
}


на
Код
if($bLink || file_exists($filename))
{
   $bOpera = (strpos($_SERVER["HTTP_USER_AGENT"], "Opera") !== false);
   $res .= '<link href="'.$css_path.($bOpera? '':'?'.filemtime($filename)).'" type="text/css" rel="stylesheet"'.($bXhtmlStyle? ' /':'').'>'."\n";
}


Теперь ссылки на файлы стилей выглядят как:
Код
<link href="/bitrix/templates/tmplt_29/styles.css?1261654555" type="text/css" rel="stylesheet" />
<link href="/bitrix/templates/tmplt_29/template_styles.css?1258035373" type="text/css" rel="stylesheet" />


Подобную вещь можно реализовать и для файлов скриптов .js

Жалко только что изменения эти временные - так как при обновлении файлов ядра системы файл main.php обновляется :(. Было бы не плохо, если бы специалисты компании 1С-Битрикс оценили корректность данной модификации, и внесли ее на постоянной основе в ядро системы.

З.Ы. Кстати, сам слепо скопировал эту проверку на UserAgent, а так и не понял, почему для Оперы отключается эта опция. Причем, как то хитро отключается, даже в стандартных компонентах: например в меню timestamp пропадает, а компоненте news.list - нет. Если кто просветит меня - буду благодарен (сам я не верстальщик и в тонкостях UserAgent'ов разбираюсь слабо)
ответил 29 Авг, 13 от Masenn (140 баллов)
00 голосов
Немного я погорячился с местом вставки данной конструкции.
Ее надо вынести за пределы цикла
Код
foreach($arCSS as $css_path)


Корректнее будет заменить код:
Код
elseif(defined("SITE_TEMPLATE_ID"))
{
   $path = BX_PERSONAL_ROOT."/templates/".SITE_TEMPLATE_ID;
   $arCSS[] = $path."/styles.css";
   $arCSS[] = $path."/template_styles.css";
}


на
Код
elseif(defined("SITE_TEMPLATE_ID"))
{
   $path = BX_PERSONAL_ROOT."/templates/".SITE_TEMPLATE_ID;
   $fullpath = $_SERVER["DOCUMENT_ROOT"].$path."/styles.css";
   $arCSS[] = $path."/styles.css".(file_exists($fullpath) ? '?'.filemtime($fullpath) : '');
   $fullpath = $_SERVER["DOCUMENT_ROOT"].$path."/template_styles.css";
   $arCSS[] = $path."/template_styles.css".(file_exists($fullpath) ? '?'.filemtime($fullpath) : '');
}

(строки 610-620)
ответил 28 Ноя, 13 от Masenn (140 баллов)
00 голосов
Только не забудьте предупредить людей, что этой модификации достаточно для потери техподдержки Битрикса. Почитайте лицензионное соглашение.
А грамотный вариант - вот
ответил 10 Март, 14 от Pomnep (13,960 баллов)

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

0 голосов
0 ответов
0 голосов
3 ответов
спросил 02 Дек, 13 от Juliette (320 баллов)
0 голосов
6 ответов
0 голосов
1 ответ
0 голосов
2 ответов
спросил 12 Июнь, 13 от Hakasama (300 баллов)