Поддержка отложенного выбора шаблона сайта

Рейтинг: 0.6191  
На голосовании
Предложил Пользователь 3089 25.07.2017 00:53:13

Поддержка отложенного выбора шаблона сайта

В настоящий момент есть всего один штатный способ определить шаблон сайта - настройки сайта.

Также можно поиграть с предикатами для шаблонов на основе констант, определяемых до подключения Битрикс (наиболее прямой путь здесь вообще SITE_TEMPLATE_ID, но тогда настройки сайта не требуются вовсе).

Главным образом идея возникла из-за страницы ошибки 404. Да, по ней уже сломано немало копий (1, 2). Не так давно и Битрикс предложила "решение" и даже отчиталась о внедрении соответствующей идеи.

Увы, при таком подходе буфер вывода частично (как в \Bitrix\Iblock\Component\Tools::process404) или полностью очищается, делая ненужной работу части страницы. А Битрикс итак тяжел из-за обилия функционала. Стоит ли делать лишнюю работу?

Есть прямой путь для решения такой и других проблем со сменой шаблона сайта уже после его выбора по настройкам сайта - явная установка шаблона на d7. Да так, чтобы эта установка сработала и в конце страницы.

Альтернативы "для старта":
  • Программная установка шаблона сайта на d7 до вывода визуального пролога (API для этого).
  • Событие (старое или новое на d7) для участия в выборе шаблона сайта.

Но их есть смысл делать только если планировать завершить дело отложенным выбором шаблона сайта. Тогда не придется городить огород с описанными выше решениями. Да и красиво упакованный в process404 костыль от Битрикс тоже будет не очень то и нужен.

По мотивам обращения в поддержку 1562681.

Рейтинг: 0  
Пользователь 620839 21.01.2018 21:25:58
это что не помогает?

https://www.olegpro.ru/post/opredelenie_shablona_sayta_po_svoey_logike_v_1s_bitriks.html
\Bitrix\Main\EventManager::getInstance()->addEventHandler(    'main',
    'OnGetCurrentSiteTemplate',
    function (\Bitrix\Main\Event $e) {
        $template = $e->getParameter('template');
 
        $newTemplateName = 'main';
 
        if (
            $_SERVER['HTTP_HOST'] === '1c.site.ru'
            && $template === '.default'
        ) {
            return new \Bitrix\Main\EventResult(
                \Bitrix\Main\EventResult::SUCCESS,
                $newTemplateName
            );
        }
    }
);
Рейтинг: 0  
Пользователь 620839 21.01.2018 21:25:59
это что не помогает?

https://www.olegpro.ru/post/opredelenie_shablona_sayta_po_svoey_logike_v_1s_bitriks.html
\Bitrix\Main\EventManager::getInstance()->addEventHandler(    'main',
    'OnGetCurrentSiteTemplate',
    function (\Bitrix\Main\Event $e) {
        $template = $e->getParameter('template');
 
        $newTemplateName = 'main';
 
        if (
            $_SERVER['HTTP_HOST'] === '1c.site.ru'
            && $template === '.default'
        ) {
            return new \Bitrix\Main\EventResult(
                \Bitrix\Main\EventResult::SUCCESS,
                $newTemplateName
            );
        }
    }
);
Рейтинг: 0  
Пользователь 3089 22.01.2018 09:06:21
'main',   'OnGetCurrentSiteTemplate'
Это помогает "для старта" (если читать мой текст), старт хороший.

Шаг 1.11 - это не самое начало работы страницы, но и не тело и, тем более, не эпилог. Это событие - более продвинутый способ определения предикатов для выбора шаблона. Он учитывает сессию, пользователя, текущий сайт, результаты работы обработчика OnPageStart, init.php.

Отложенный выбор полезен для нормальной работы с ошибкой 404. Вот этого нет.