Несмотря на наличие тем для шаблона bitrix24 разработчики не предусмотрели никаких механик позволяющий влиять на это поведение, таким образом для изменения состава тем так или иначе приходится явно использовать папку /bitrix/templates/bitrix24/themes и сохранять эти изменения в системе контроля версий.

Однако подобный вариант является достаточно варварским изменением системных файлов, что не является приемлемым в разработке коробочных версий. Существует не очень красивый способ, которым можно переопределить стандартные шаблоны не затрагивая стандартные механики.

Для того чтобы этого достичь необходимо:

  • Полностью скопировать папку с шаблонами (/bitrix/templates/bitrix24/themes)
  • Подменить системный файл по работе с темами (/bitrix/modules/intranet/tools/theme_picker.php)
  • Добавить пост-обработку обновленных тем

Проделаем указанные шаги для получения желаемой цели: получение возможности изменять состав стандартных тем.

  1. Скопируем файлы директории /bitrix/templates/bitrix24/themes в директорию /local/themes. Эту директорию будем использовать для хранения наших тем.
  2. Отредактируем файл config.php таким образом, чтобы в разделе subThemes остались только default и нужные нам темы. Раздел baseThemes изменять не нужно.
  3. Из папок dark и light удалим все ненужные папки, кроме нужных нам тем
  4. Используя структуру папки local из предполагаемого нами варианта разместим в файле legacy.php фрагмент кода 1.
  5. Создадим файл /local/php_interface/classes/Fusion/ThemePicker .php и разместим в нем фрагмент кода 2.

Содержимое файла legacy.php (фрагмент кода 1):


/* Themepicker overload start */
spl_autoload_register(function ($baseClassName) {
    if ( $baseClassName != "Bitrix\Intranet\Integration\Templates\Bitrix24\ThemePicker" ) return;

    $originalThemePickerContent = file_get_contents(
        $_SERVER['DOCUMENT_ROOT']
            ."/bitrix/modules/intranet/lib/integration/templates/bitrix24/themepicker.php"
    );
    $originalThemePickerContent = str_replace("class ThemePicker", "class ___VirtualThemePicker", mb_substr($originalThemePickerContent, 5));
    eval($originalThemePickerContent);
    unset($originalThemePickerContent);

    $overrideClassContent = file_get_contents(__DIR__.'/classes/Fusion/ThemePicker.php');
    $overrideClassContent = preg_replace('#^<\?(?:php)?\s*#', '', $overrideClassContent);
    $overrideClassContent = preg_replace('#extends ([^\s]+)#', "extends ___VirtualThemePicker", $overrideClassContent);
    $overrideClassContent = preg_replace('#namespace ([^\s]+);#',
        "namespace Bitrix\Intranet\Integration\Templates\Bitrix24;",
        $overrideClassContent
    );
    eval($overrideClassContent);
}, true, true);
/* Themepicker overload end */ 

Содержимое файла Themepicker.php (фрагмент 2):

<?php

namespace Fusion;

class ThemePicker extends Bitrix\Intranet\Integration\Templates\Bitrix24\ThemePicker
{
    public function getThemesPath()
    {
        return "/local/themes";
    }
} 

Таким образом мы произвели замену стандартного селектора тем.