Шаблоны страницы
В Bitrix Framework страница — это PHP-файл, который состоит из трех частей.
-
Header или шапка сайта — общие элементы сайта.
-
Основная рабочая область — уникальный контент страницы, который может быть:
-
статическим — обычный HTML-контент: текст, изображения, таблицы,
-
динамическим — контент создан с помощью компонентов.
-
-
Footer или подвал — завершающие элементы сайта.
Страницы формируются динамически на основе шаблона сайта, компонентов и статических элементов.
Свойства страниц
На отображение и поведение страницы влияют ее свойства: заголовок, ключевые слова, описание. Свойства можно задать:
-
на странице в рабочей области или между служебной и визуальной частью шапки сайта,
-
в файле
.section.phpраздела — это общие настройки для всех страниц внутри раздела.
Шаблоны страниц
Шаблон страницы — это PHP-файл, который содержит структуру страницы и соответствует правилам оформления.
Собственные шаблоны страниц размещайте в папках пользовательских шаблонов сайта:
-
/local/templates/.default/page_templates— для всех шаблонов сайта, -
/local/templates/[идентификатор_шаблона]/page_templates— для конкретного шаблона сайта.
Штатные примеры шаблонов страниц находятся в /bitrix/templates/.default/page_templates и /bitrix/templates/[идентификатор_шаблона]/page_templates. Их можно скопировать в /local/templates/ и использовать как основу для своего шаблона.
Каждая папка может содержать:
-
файлы шаблонов страниц,
-
служебный файл
.content.php— он хранит названия шаблонов и порядок их вывода.
Разработка шаблонов страниц
Существует два типа шаблонов страниц.
-
Пассивный шаблон — это PHP-файл с готовым содержимым новой страницы. Он может содержать HTML-разметку, PHP-код и вызовы компонентов. При создании страницы контент-менеджер редактирует заготовленное содержимое в визуальном редакторе.
-
Активный шаблон — это шаблон с дополнительным шагом мастера создания страницы. Он запрашивает параметры у контент-менеджера и формирует содержимое страницы с учетом выбранных значений.
Пассивный шаблон
Пассивный шаблон — это шаблон с заготовленным контентом для новой страницы.
Как создать пассивный шаблон
Первый способ. Скопировать штатный шаблон
/bitrix/templates/.default/page_templates/standard.php в /local/templates/.default/page_templates/ и отредактировать копию.
Второй способ. Создать шаблон с нуля.
-
Продумайте структуру страницы. Это может быть HTML, текст, изображения, таблицы, компоненты и PHP-код.
-
В папке
/local/templates/[идентификатор_шаблона]/page_templatesсоздайте файл, напримерnew.php. -
В файле разместите код шаблона.
-
Убедитесь, что в начале и конце файла есть вызовы
header.phpиfooter.php. Они обязательны.
<?php
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$APPLICATION->SetTitle("Title");
?>
<p>Добавьте контент на страницу</p>
<?php require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>
Как подключить пассивный шаблон
Чтобы шаблон появился в меню создания страницы, в файл /local/templates/[идентификатор_шаблона]/page_templates/.content.php добавьте строку:
$TEMPLATE['new.php'] = ['name' => 'Новый шаблон', 'sort' => 4];
-
'new.php'— имя файла шаблона, -
'Новый шаблон'— название, которое увидит контент-менеджер, -
'sort' => 4— порядок отображения.
Пример содержимого файла:
<?php
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true)
{
die();
}
$TEMPLATE['standard.php'] = ['name' => 'Стандартная страница', 'sort' => 1];
$TEMPLATE['new.php'] = ['name' => 'Новый шаблон', 'sort' => 4];
Языковые файлы
Используйте языковые файлы для шаблонов, если сайт использует несколько языков. В файле .content.php загрузите сообщения методом Loc::loadMessages(__FILE__). Метод Loc::getMessage('new') вернет название шаблона по ключу new:
<?php
use Bitrix\Main\Localization\Loc;
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true)
{
die();
}
Loc::loadMessages(__FILE__);
$TEMPLATE['standard.php'] = ['name' => Loc::getMessage('standard'), 'sort' => 1];
$TEMPLATE['new.php'] = ['name' => Loc::getMessage('new'), 'sort' => 4];
Языковые файлы пользовательского шаблона храните в папке lang того шаблона сайта, где расположен файл страницы:
-
для общего шаблона —
/local/templates/.default/lang/, -
для шаблона конкретного сайта —
/local/templates/[идентификатор_шаблона]/lang/.
Например, названия шаблонов на русском языке добавьте в файл /local/templates/[идентификатор_шаблона]/lang/ru/page_templates/.content.php:
<?php
$MESS['standard'] = 'Стандартная страница';
$MESS['new'] = 'Новый шаблон';
Для английского языка создайте файл /local/templates/[идентификатор_шаблона]/lang/en/page_templates/.content.php и задайте те же ключи с переводами. Например, $MESS['new'] = 'New template';.
Если берете за основу штатный шаблон, пример языковых файлов можно посмотреть в /bitrix/templates/.default/lang/ru/page_templates/.content.php или в папке нужного штатного шаблона.
Пример создания пассивного шаблона
Создайте общий шаблон страницы объявления, который доступен для всех шаблонов сайта. Скачайте изображение для объявления и разместите его на сайте в файле /upload/page-templates/announcement.svg. Этот файл используется в пассивном и активном примерах ниже.
-
В папке
/local/templates/.default/page_templatesсоздайте файлannouncement.php. -
Добавьте код шаблона и проверьте наличие подключенных
header.phpиfooter.php.<?php require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/header.php'); $APPLICATION->SetTitle('Объявление'); ?> <h3>Объявление!</h3> <hr> <br> <table cellpadding="10" cellspacing="1" align="center" style="width: 500px;"> <tbody> <tr> <td> <img width="131" src="/upload/page-templates/announcement.svg" height="157"> </td> <td> Внимание! Важная информация о [<i>внесите нужную информацию</i>].<br> ... </td> </tr> </tbody> </table> <br> <hr> <span style="color: #555555;"><i>Напишите нам, что вы думаете об этом объявлении. Для этого воспользуйтесь формой обратной связи. Спасибо!</i></span><br> <br> <?php $APPLICATION->IncludeComponent( 'bitrix:main.feedback', '', [ 'EMAIL_TO' => 'sale@example.com', 'EVENT_MESSAGE_ID' => ['7'], 'OK_TEXT' => 'Спасибо за ваше мнение!', 'REQUIRED_FIELDS' => ['NAME', 'EMAIL'], 'USE_CAPTCHA' => 'Y', ] );?> <?php require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/footer.php'); ?> -
В файле
.content.phpзагрузите языковые сообщения и добавьте запись для шаблонаannouncement.php:<?php use Bitrix\Main\Localization\Loc; if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) { die(); } Loc::loadMessages(__FILE__); $TEMPLATE['announcement.php'] = ['name' => Loc::getMessage('announcement'), 'sort' => 2]; -
Настройте языковые файлы:
- для русского языка в файле
/local/templates/.default/lang/ru/page_templates/.content.php,
$MESS['announcement'] = 'Важное объявление';- для английского языка в файле
/local/templates/.default/lang/en/page_templates/.content.php.
$MESS['announcement'] = 'Important announcement'; - для русского языка в файле
В результате шаблон будет доступен при создании страницы.

При создании новой страницы по этому шаблону контент-менеджер увидит визуальный редактор с заполненными элементами.

Активный шаблон
Активный шаблон — это шаблон, который при создании страницы запрашивает дополнительные данные у контент-менеджера. Эти данные можно использовать для настройки структуры или содержимого страницы.

Примеры шаблонов
Свой активный шаблон можно создать на основе штатных примеров.
-
Пример
forumнаходится в/bitrix/templates/.default/page_templates/forum. Он есть и в чистой установке 1С-Битрикс: Управление сайтом. -
Пример
bootstrapвходит в шаблон сайтаeshop_bootstrap_v4, который устанавливает мастер интернет-магазина. После установки этого шаблона пример находится в/bitrix/templates/eshop_bootstrap_v4/page_templates/bootstrap. В чистой установке до запуска мастера этой папки может не быть.
Код файла template.php шаблона bootstrap
<?php
use Bitrix\Main\Localization\Loc;
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();
CPageTemplate::IncludeLangFile(__FILE__);
class CBootstrapPageTemplate
{
function GetDescription()
{
return [
"name" => Loc::getMessage("bt_wizard_name"),
"description" => Loc::getMessage("bt_wizard_title"),
"modules" => ["bitrix.eshop"],
];
}
function GetFormHtml()
{
$s = '
<tr class="section">
<td colspan="4">'.Loc::getMessage("BT_TYPE").'</td>
</tr>
';
$s .= '
<tr>
<td style="vertical-align: top; padding-top:10px">
<input type="radio" name="BT_COL" value="1" id="BT_COL_1" checked>
<label for="BT_COL_1">'.Loc::getMessage("BT_COL_1").'</label><br>
<img src="/bitrix/images/bitrix.eshop/col_1.png" style="margin-top: 7px; padding-left: 17px;"/><br>
</td>
<td style="padding-top:10px">
<input type="radio" name="BT_COL" value="2_1" id="BT_COL_2_1">
<label for="BT_COL_2_1">'.Loc::getMessage("BT_COL_2_1").'</label><br>
<img src="/bitrix/images/bitrix.eshop/col_2_1.png" style="margin-top: 7px; padding-left: 17px;"/><br>
</td>
<td style="padding-top:10px">
<input type="radio" name="BT_COL" value="1_2" id="BT_COL_1_2">
<label for="BT_COL_1_2">'.Loc::getMessage("BT_COL_1_2").'</label><br>
<img src="/bitrix/images/bitrix.eshop/col_1_2.png" style="margin-top: 7px; padding-left: 17px;"/><br>
</td>
<td style="padding-top:10px">
<input type="radio" name="BT_COL" value="1_2_1" id="BT_COL_1_2_1">
<label for="BT_COL_1_2_1">'.Loc::getMessage("BT_COL_1_2_1").'</label><br>
<img src="/bitrix/images/bitrix.eshop/col_1_2_1.png" style="margin-top: 7px; padding-left: 17px;"/><br>
</td>
</tr>
<tr>
<td style="padding-top:20px">
<input type="radio" name="BT_COL" value="1_1" id="BT_COL_1_1">
<label for="BT_COL_1_1">'.Loc::getMessage("BT_COL_1_1").'</label><br>
<img src="/bitrix/images/bitrix.eshop/col_1_1.png" style="margin-top: 7px; padding-left: 17px;"/><br>
</td>
<td style="padding-top:20px">
<input type="radio" name="BT_COL" value="1_1_1" id="BT_COL_1_1_1">
<label for="BT_COL_1_1_1">'.Loc::getMessage("BT_COL_1_1_1").'</label><br>
<img src="/bitrix/images/bitrix.eshop/col_1_1_1.png" style="margin-top: 7px; padding-left: 17px;"/><br>
</td>
<td style="padding-top:20px">
<input type="radio" name="BT_COL" value="5" id="BT_COL_5">
<label for="BT_COL_5">'.Loc::getMessage("BT_COL_5").'</label><br>
<img src="/bitrix/images/bitrix.eshop/col_5.png" style="margin-top: 7px; padding-left: 17px;"/><br>
</td>
<td style="padding-top:20px">
<input type="radio" name="BT_COL" value="4" id="BT_COL_4">
<label for="BT_COL_4">'.Loc::getMessage("BT_COL_4").'</label><br>
<img src="/bitrix/images/bitrix.eshop/col_4.png" style="margin-top: 7px; padding-left: 17px;"/>
</td>
</tr>
';
return $s;
}
function GetContent($arParams)
{
$gridHtml = '
<div class="row">';
if (isset($_POST['BT_COL']))
{
switch ($_POST['BT_COL'])
{
case '1':
{
$gridHtml.= '
<div class="col-xs-12"></div>';
break;
}
case '2_1':
{
$gridHtml.= '
<div class="col-sm-8"></div>
<div class="col-sm-4"></div>';
break;
}
case '1_2':
{
$gridHtml.= '
<div class="col-sm-4"></div>
<div class="col-sm-8"></div>';
break;
}
case '1_2_1':
{
$gridHtml.= '
<div class="col-sm-3"></div>
<div class="col-sm-6"></div>
<div class="col-sm-3"></div>';
break;
}
case '1_1':
{
$gridHtml.= '
<div class="col-sm-6"></div>
<div class="col-sm-6"></div>';
break;
}
case '1_1_1':
{
$gridHtml.= '
<div class="col-sm-4"></div>
<div class="col-sm-4"></div>
<div class="col-sm-4"></div>';
break;
}
case '5':
{
$gridHtml.= '
<div class="col-sm-8"></div>
<div class="col-sm-4"></div>
</div>
<div class="row">
<div class="col-xs-12"></div>
</div>
<div class="row">
<div class="col-sm-8"></div>
<div class="col-sm-4"></div>';
break;
}
case '4':
{
$gridHtml.= '
<div class="col-sm-8"></div>
<div class="col-sm-4"></div>
</div>
<div class="row">
<div class="col-xs-4"></div>
<div class="col-xs-8"></div>';
break;
}
}
}
$gridHtml.= '
</div>
';
$s = '<?php require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");?>';
$s.= $gridHtml;
$s.= '<?php require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>';
return $s;
}
}
$pageTemplate = new CBootstrapPageTemplate;
?>
Шаблон bootstrap имеет название Шаблоны сеток страницы. Он предлагает выбрать вариант сетки страницы.

Чтобы создать страницу по шаблону bootstrap, выполните следующие действия:
-
На панели управления нажмите Создать страницу > По шаблону > Шаблоны сеток страницы.
-
В мастере создания заполните параметры страницы и нажмите Далее.
-
Выберите вариант сетки страницы и нажмите Готово.

Структура шаблона
В папке шаблона обязательно должен быть файл template.php. Он содержит логику шаблона.
Дополнительно могут быть другие файлы и папки:
-
папка
/lang— языковые файлы, -
папка
/images— изображения для шаблона.
Как подключить активный шаблон
Чтобы добавить шаблон в меню, достаточно создать папку и файл шаблона. Редактировать вспомогательные файлы не нужно.
Как подключить языковые файлы
Названия и подписи шаблона рекомендуется задавать через языковые файлы, а не указывать напрямую в файле шаблона template.php.
Пример файла с русскими языковыми фразами для шаблона bootstrap: /bitrix/templates/eshop_bootstrap_v4/page_templates/bootstrap/lang/ru/template.php.
<?php
$MESS['bt_wizard_name'] = "Шаблоны сеток страницы";
$MESS['bt_wizard_title'] = "Раздел с шаблоном сетки";
$MESS['BT_TYPE'] = "Выберите вариант шаблона сетки страницы";
$MESS['BT_COL_1'] = "Одна колонка";
$MESS['BT_COL_2_1'] = "Правое меню";
$MESS['BT_COL_1_2'] = "Левое меню";
$MESS['BT_COL_1_2_1'] = "Два меню";
$MESS['BT_COL_1_1'] = "Две колонки";
$MESS['BT_COL_1_1_1'] = "Три колонки";
$MESS['BT_COL_5'] = "Главная";
$MESS['BT_COL_4'] = "Мозаика";
?>
Пример создания активного шаблона
Активный шаблон будет создан на основе штатного шаблона bootstrap и пассивного шаблона announcement.php. В форме создания страницы новый шаблон будет выводить два вопроса.

-
Скопируйте штатный шаблон
/bitrix/templates/eshop_bootstrap_v4/page_templates/bootstrapв папку пользовательского шаблона/local/templates/<идентификатор_шаблона>/page_templates/new_template. -
Откройте файл
template.phpи внесите изменения в код.<?php use Bitrix\Main\Localization\Loc; if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die(); CPageTemplate::IncludeLangFile(__FILE__); class CMyNewPageTemplate { function GetDescription() { return [ 'name' => Loc::getMessage('bt_wizard_name'), 'description' => Loc::getMessage('bt_wizard_title'), ]; } // Описываем новый шаг мастера создания страницы function GetFormHtml() { // Первый вопрос $s = ' <tr class="section"> <td>'.Loc::getMessage("BT_TYPE_1").'</td> </tr> '; // Варианты ответа на первый вопрос $s .= ' <tr> <td style="vertical-align: top; padding-top:10px"> <input type="radio" name="BT_COL_1" value="1_1" id="BT_COL_1_1" checked> <label for="BT_COL_1_1">'.Loc::getMessage("BT_COL_1_1").'</label><br> </td> </tr> <tr> <td style="padding-top:10px"> <input type="radio" name="BT_COL_1" value="1_2" id="BT_COL_1_2"> <label for="BT_COL_1_2">'.Loc::getMessage("BT_COL_1_2").'</label><br> </td> </tr> '; // Второй вопрос $s .= ' <tr class="section"> <td>'.Loc::getMessage("BT_TYPE_2").'</td> </tr> '; // Варианты ответа на второй вопрос $s .= ' <tr> <td style="vertical-align: top; padding-top:10px"> <input type="radio" name="BT_COL_2" value="2_1" id="BT_COL_2_1" checked> <label for="BT_COL_2_1">'.Loc::getMessage("BT_COL_2_1").'</label><br> </td> </tr> <tr> <td style="padding-top:10px"> <input type="radio" name="BT_COL_2" value="2_2" id="BT_COL_2_2"> <label for="BT_COL_2_2">'.Loc::getMessage("BT_COL_2_2").'</label><br> </td> </tr> '; return $s; } // Описываем шаблон в зависимости от выбранных вариантов function GetContent($arParams) { // Начало шаблона Объявление $myNewHtml = ' <h3>Объявление!</h3> <hr> <br> <table cellpadding="10" cellspacing="1" align="center" style="width: 500px;"> <tbody> <tr> <td>'; // Изменение шаблона в зависимости от ответа на первой вопрос об изображении if (isset($_POST['BT_COL_1'])) { switch ($_POST['BT_COL_1']) { case '1_1': { $myNewHtml.= ' <img width="131" src="/upload/page-templates/announcement.svg" height="157">'; break; } case '1_2': { $myNewHtml.= ' '; break; } } } // Продолжение шаблона $myNewHtml .= ' </td> <td> Внимание! Важная информация о [<i>внесите нужную информацию</i>].<br> ... </td> </tr> </tbody> </table> <br>'; // Изменение шаблона в зависимости от ответа на второй вопрос об обратной связи if (isset($_POST['BT_COL_2'])) { switch ($_POST['BT_COL_2']) { case '2_1': { $myNewHtml.= ' <hr> <span style="color: #555555;"><i>Напишите нам, что вы думаете об этом объявлении. Для этого воспользуйтесь формой обратной связи. Спасибо!</i></span><br> <br> <?php $APPLICATION->IncludeComponent( "bitrix:main.feedback", "", [ "EMAIL_TO" => "sale@example.ru", "EVENT_MESSAGE_ID" => ["7"], "OK_TEXT" => "Спасибо за ваше мнение!", "REQUIRED_FIELDS" => ["NAME", "EMAIL"], "USE_CAPTCHA" => "Y" ] );?>'; break; } case '2_2': { $myNewHtml.= ' '; break; } } } // Формируем готовый шаблон $s = '<?php require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");?>'; $s.= $myNewHtml; $s.= '<?php require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>'; return $s; } } $pageTemplate = new CMyNewPageTemplate; ?> -
Отредактируйте файл с языковыми сообщениями
/new_template/lang/ru/template.php.<?php $MESS['bt_wizard_name'] = "Объявление"; $MESS['bt_wizard_title'] = "Уточнение по шаблону"; $MESS['BT_TYPE_1'] = "Оставить стандартное изображение?"; $MESS['BT_COL_1_1'] = "Да"; $MESS['BT_COL_1_2'] = "Нет, установлю своё"; $MESS['BT_TYPE_2'] = "Нужен блок формы обратной связи?"; $MESS['BT_COL_2_1'] = "Да, нужен"; $MESS['BT_COL_2_2'] = "Нет, не нужен"; ?>
В результате в мастере создания страницы появится новый шаг с выбором параметров.