Catalog - uniqcle/Bitrix GitHub Wiki
Фасетный индекс. Битрикс предрассчитал какие возможные вариации в фильтре с учетом комбинаций будут отобраны.
Контент->Инфоблоки->Фасетные индексы
Свойства для каждого раздела
Магазин->Свойства товаров
Магазин->Настройки каталога->Свойства элементов
здесь скрываем свойство для всех
Изменить
для раздела каталога Свойства элементов
здесь добавляем свойство, кот. нужно отобразить. Далее шестиреночка->Настройка формы редактирования
оставить Значение свойств
В файле urlrewrite.php создаем правило
//Карточка товара
9 =>
array (
'CONDITION' => '#^/skillbox/catalog_new/([A-Za-z0-9_-]+)/item/([A-Za-z0-9_-]+)/[?]{0,1}(.*)#',
'RULE' => "SECTION_CODE=\$1&ELEMENT_CODE=\$2",
'ID' => '',
'PATH' => '/catalog_new/detail.php',
'SORT' => 100,
),
//Каталог товаров с фильтром
8 =>
array (
'CONDITION' => '#^/skillbox/catalog_new/([A-Za-z0-9_-]+)/[?]{0,1}(.*)#',
'RULE' => "SECTION_CODE=\$1",
'ID' => '',
'PATH' => '/catalog_new/index.php',
'SORT' => 100,
),
...
);
'RULE'
помещается в глобальный массив $_REQUEST
.
Проверка на сайте https://regex101.com/
Не забываем экранировать \ символы
\/catalog_new\/([A-Za-z0-9_-]+)\/[?]{0,1}(.*)
Настройки ИБ
#SITE_DIR#/catalog_new/
URL страницы информационного блока
#SITE_DIR#/catalog_new/#SECTION_CODE#/
URL страницы раздела
#SITE_DIR#/catalog_new/#SECTION_CODE_PATH#/item/#ELEMENT_CODE#/
URL страницы детального просмотра
Затем размещаем необходимые компоненты на страницх detail.php
(Элемент каталога детально
)
<?
define("HIDE_SIDEBAR", true);
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
?>
Детальная страница
<?php pre($_REQUEST); ?>
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>
и index.php
(Компонент Элемента раздела
) и назначем необходимые параметры на вход, чтобы отображали необходимую информацию от нас.
Добавляем компоненты Умный фильтр
и Элементы разделов
на страницу catalog/index.php
Компонент Элементы раздела
В настройках Код раздела
: ={$_REQUEST["SECTION_CODE"]}
Имя массива со значениями фильтра для фильтрации элементов:
: arFilter
Проверить параметр "INCLUDE_SUBSECTIONS" => "Y" для отображения товаров в подкатегориях, а также
"PRICE_CODE" => array('BASE'),
для отображения цены товара
Нужно проверить, что приходит в глобальном массиве $_REQUEST. Значения пойдут на параметры в компоненты.
/catalog_new/
<?
define("HIDE_SIDEBAR", true);
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
?>
Каталог с товарами и фильтром
<?php //pre($_REQUEST); ?>
<?php
// Ограничения для компонента. Фильтр. Аналог фильтра GetList
$arFilter = [
'ACTIVE' => 'Y',
];
?>
<?$APPLICATION->IncludeComponent(
"bitrix:catalog.smart.filter",
"",
Array(
"CACHE_GROUPS" => "N",
"CACHE_TIME" => "36000000",
"CACHE_TYPE" => "A",
"CONVERT_CURRENCY" => "N",
"DISPLAY_ELEMENT_COUNT" => "Y",
"FILTER_NAME" => "arFilter",
"FILTER_VIEW_MODE" => "vertical",
"HIDE_NOT_AVAILABLE" => "N",
"IBLOCK_ID" => "2",
"IBLOCK_TYPE" => "catalog",
"PAGER_PARAMS_NAME" => "arrPager",
"POPUP_POSITION" => "left",
"PREFILTER_NAME" => "smartPreFilter",
"PRICE_CODE" => array("BASE"),
"SAVE_IN_SESSION" => "N",
"SECTION_CODE" => $_REQUEST["SECTION_CODE"],
"SECTION_DESCRIPTION" => "-",
"SECTION_ID" => "",
"SECTION_TITLE" => "-",
"SEF_MODE" => "N",
"TEMPLATE_THEME" => "blue",
"XML_EXPORT" => "N"
)
);?><?$APPLICATION->IncludeComponent(
"bitrix:catalog.section",
"",
Array(
"ACTION_VARIABLE" => "action",
"ADD_PICT_PROP" => "-",
"ADD_PROPERTIES_TO_BASKET" => "Y",
"ADD_SECTIONS_CHAIN" => "N",
"ADD_TO_BASKET_ACTION" => "ADD",
"AJAX_MODE" => "N",
"AJAX_OPTION_ADDITIONAL" => "",
"AJAX_OPTION_HISTORY" => "N",
"AJAX_OPTION_JUMP" => "N",
"AJAX_OPTION_STYLE" => "Y",
"BACKGROUND_IMAGE" => "-",
"BASKET_URL" => "/personal/basket.php",
"BROWSER_TITLE" => "-",
"CACHE_FILTER" => "N",
"CACHE_GROUPS" => "Y",
"CACHE_TIME" => "36000000",
"CACHE_TYPE" => "A",
"COMPATIBLE_MODE" => "Y",
"CONVERT_CURRENCY" => "N",
"CUSTOM_FILTER" => "",
"DETAIL_URL" => "",
"DISABLE_INIT_JS_IN_COMPONENT" => "N",
"DISPLAY_BOTTOM_PAGER" => "Y",
"DISPLAY_COMPARE" => "N",
"DISPLAY_TOP_PAGER" => "N",
"ELEMENT_SORT_FIELD" => "sort",
"ELEMENT_SORT_FIELD2" => "id",
"ELEMENT_SORT_ORDER" => "asc",
"ELEMENT_SORT_ORDER2" => "desc",
"ENLARGE_PRODUCT" => "STRICT",
"FILTER_NAME" => "arFilter",
"HIDE_NOT_AVAILABLE" => "N",
"HIDE_NOT_AVAILABLE_OFFERS" => "N",
"IBLOCK_ID" => "2",
"IBLOCK_TYPE" => "catalog",
"INCLUDE_SUBSECTIONS" => "Y", // Важно! Чтоб стояло Y
"LABEL_PROP" => array(),
"LAZY_LOAD" => "N",
"LINE_ELEMENT_COUNT" => "3",
"LOAD_ON_SCROLL" => "N",
"MESSAGE_404" => "",
"MESS_BTN_ADD_TO_BASKET" => "В корзину",
"MESS_BTN_BUY" => "Купить",
"MESS_BTN_DETAIL" => "Подробнее",
"MESS_BTN_SUBSCRIBE" => "Подписаться",
"MESS_NOT_AVAILABLE" => "Нет в наличии",
"META_DESCRIPTION" => "-",
"META_KEYWORDS" => "-",
"OFFERS_FIELD_CODE" => array("NAME",""),
"OFFERS_LIMIT" => "5",
"OFFERS_SORT_FIELD" => "sort",
"OFFERS_SORT_FIELD2" => "id",
"OFFERS_SORT_ORDER" => "asc",
"OFFERS_SORT_ORDER2" => "desc",
"PAGER_BASE_LINK_ENABLE" => "N",
"PAGER_DESC_NUMBERING" => "N",
"PAGER_DESC_NUMBERING_CACHE_TIME" => "36000",
"PAGER_SHOW_ALL" => "N",
"PAGER_SHOW_ALWAYS" => "N",
"PAGER_TEMPLATE" => ".default",
"PAGER_TITLE" => "Товары",
"PAGE_ELEMENT_COUNT" => "18",
"PARTIAL_PRODUCT_PROPERTIES" => "N",
"PRICE_CODE" => array(), // Важно! Чтоб стояло array("BASE")
"PRICE_VAT_INCLUDE" => "Y",
"PRODUCT_BLOCKS_ORDER" => "price,props,sku,quantityLimit,quantity,buttons",
"PRODUCT_DISPLAY_MODE" => "N",
"PRODUCT_ID_VARIABLE" => "id",
"PRODUCT_PROPS_VARIABLE" => "prop",
"PRODUCT_QUANTITY_VARIABLE" => "quantity",
"PRODUCT_ROW_VARIANTS" => "[{'VARIANT':'2','BIG_DATA':false},{'VARIANT':'2','BIG_DATA':false},{'VARIANT':'2','BIG_DATA':false},{'VARIANT':'2','BIG_DATA':false},{'VARIANT':'2','BIG_DATA':false},{'VARIANT':'2','BIG_DATA':false}]",
"PRODUCT_SUBSCRIPTION" => "Y",
"PROPERTY_CODE_MOBILE" => array("MATERIAL"),
"RCM_PROD_ID" => "",
"RCM_TYPE" => "personal",
"SECTION_CODE" => $_REQUEST["SECTION_CODE"],
"SECTION_ID" => "",
"SECTION_ID_VARIABLE" => "SECTION_ID",
"SECTION_URL" => "",
"SECTION_USER_FIELDS" => array("",""),
"SEF_MODE" => "N",
"SET_BROWSER_TITLE" => "Y",
"SET_LAST_MODIFIED" => "N",
"SET_META_DESCRIPTION" => "Y",
"SET_META_KEYWORDS" => "Y",
"SET_STATUS_404" => "N",
"SET_TITLE" => "Y",
"SHOW_404" => "N",
"SHOW_ALL_WO_SECTION" => "N",
"SHOW_CLOSE_POPUP" => "N",
"SHOW_DISCOUNT_PERCENT" => "N",
"SHOW_FROM_SECTION" => "N",
"SHOW_MAX_QUANTITY" => "N",
"SHOW_OLD_PRICE" => "N",
"SHOW_PRICE_COUNT" => "1",
"SHOW_SLIDER" => "Y",
"SLIDER_INTERVAL" => "3000",
"SLIDER_PROGRESS" => "N",
"TEMPLATE_THEME" => "blue",
"USE_ENHANCED_ECOMMERCE" => "N",
"USE_MAIN_ELEMENT_SECTION" => "N",
"USE_PRICE_COUNT" => "N",
"USE_PRODUCT_QUANTITY" => "N"
)
);?>
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>
Обратить внимание на параметры!
"INCLUDE_SUBSECTIONS" => "Y",
"SECTION_CODE" => $_REQUEST["SECTION_CODE"],
#SITE_DIR#/skillbox/catalog_new/
#SITE_DIR#/skillbox/catalog_new/#SECTION_CODE#/
#SITE_DIR#/skillbox/catalog_new/#SECTION_CODE#/item/#ELEMENT_CODE#/
-
Копируем шаблон компонента
Умный фильтр
в текущий шаблон сайта и подключаем его. -
Копируем шаблон компонента
Элементы раздела
в текущий шаблон сайта и подключаем его на страницеcatalog/index.php
. -
Верстку внедряем в шаблон компонентов
Предварительно можно разместить всю верстку на странице
catalog/index.php
В шаблоне компонентов template.php
все удаляем и выводим $arResult
Отображение цены в шаблоне
Цену отображаем с учетом всех скидок. ['MIN_PRICE']['[PRINT_VALUE]']
Логика: При смене события на "select" идет редирект на страницу с учетом сортировки.
На странице index.php
<?php
// Получаем параметр GET
$request = \Bitrix\Main\Application::getInstance()->getContext()->getRequest()->getQueryList();
$paramSort = strtoupper( $request->get('SORT_BY') ); // Получение конкретного параметра
// В зависимости от пришедших параметров устанавливаем значения для компонента
switch($paramSort){
case 'COST_MAX_MIN':
$sortField1 = 'catalog_PRICE_'.CONST_BASE_PRICE; //Берется из GetList
$sortOrder1 = 'DESC';
break;
case 'COST_MIN_MAX':
$sortField1 = 'catalog_PRICE_'.CONST_BASE_PRICE;
$sortOrder1 = 'ASC';
break;
case 'NEW':
$sortField1 = 'created';
$sortOrder1 = 'DESC';
break;
case 'RATING':
$sortField1 = 'property_RATING';
$sortOrder1 = 'DESC';
break;
case 'NAME': // У имени стандартая сортировка
default:
$sortField1 = 'name';
$sortOrder1 = 'asc';
$paramSort = 'NAME';
break;
}
# Всегда одна сортировка
$sortField2 = 'id';
$sortOrder2 = 'desc';
?>
<?$APPLICATION->IncludeComponent(
"bitrix:catalog.section",
"skillbox_section",
...
"PRICE_CODE" => array('BASE'), // Тип цены
"ELEMENT_SORT_FIELD" => $sortField1, // Поле сортировки
"ELEMENT_SORT_FIELD2" => $sortField2,
"ELEMENT_SORT_ORDER" => $sortOrder1, // SORT_ORDER Направление сортировки
"ELEMENT_SORT_ORDER2" => $sortOrder2,
...
# uniqcle
"SORT_AVAILABLE" => [
'NAME' => 'По названию',
'COST_MAX_MIN' =>'Сначала дорогие',
'COST_MIN_MAX' => 'Сначала дешевые',
'NEW' => 'Новинки',
'RATING' => 'Популярные',
],
"SORT_NOW" => $paramSort
)
);?>
</section>
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>
На странице template.php
<? if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die(); ?>
<?php
use Bitrix\Main\Application,
Bitrix\Main\Web\Uri;
?>
<?php define('SKILLBOX_ODD', true); ?>
<?php
//pre($arResult);
//pre( $arParams, 1);
$request = Application::getInstance()->getContext()->getRequest();
$uriString = $request->getRequestUri();
$uri = new Uri($uriString); // Получаем объект
?>
<section class="catalog-list">
<h1><?=$arResult['NAME'];?></h1>
<form action="#" class="form-sort">
<label>Сортировать по</label>
<select class="sort js_sort_event">
<?php foreach($arParams['SORT_AVAILABLE'] as $code => $name): ?>
<?php
$uri->deleteParams(array("SORT_BY"));
$uri->addParams(array("SORT_BY" => $code));
$redirect = $uri->getUri();
?>
<option value="<?=$redirect;?>"<?php if($code == $arParams['SORT_NOW']): ?> selected="selected" <?php endif; ?>>
<?=$name;?>
</option>
<?php endforeach; ?>
</select>
<a href="#" class="sort-form"> </a>
<!--<a href="#" class="sort-form sort-desc"> </a>-->
<label>Показать</label>
<select class="sort">
<option value="0">12 на странице</option>
<option value="1">24 на странице</option>
</select>
</form>
<?php foreach($arResult['ITEMS'] as $arItem): ?>
<!--товары-->
...
На странице script.js
$(function(){
$('.js_sort_event').on('change', function(e){
e.preventDefault();
window.location.href = $(this).val();
return false;
});
});
catalog_tech/index.php
<?php
$paramElemCount = \Bitrix\Main\Application::getInstance()->getContext()->getRequest()->getQueryList()->get('ELEMCOUNT');
$paramElemCount = (int)$paramElemCount;
if(empty($paramElemCount)){
$paramElemCount = 6;
}
?>
<?$APPLICATION->IncludeComponent("bitrix:catalog.section",
"skillbox_section",
Array(
...
"PAGE_ELEMENT_COUNT" => $paramElemCount, // Количество элементов на странице
...
#paramElementCount
"PARAM_ELEMENT_COUNT" => [
6 => "6",
12 => "12"
],
"COUNT_DEFAULT" => $paramElemCount // Кол-во на странице по умолч.
),
false
);?>
</section>
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>
Шаблон /local/templates/skillbox/components/bitrix/catalog.section/skillbox_section/template.php
...
<label>Показать</label>
<select class="sort js_count_event">
<?php foreach($arParams['PARAM_ELEMENT_COUNT'] as $keyElem => $itemElem ): ?>
<?php
$uri->deleteParams(array('ELEMCOUNT'));
$uri->addParams(array('ELEMCOUNT' => $keyElem));
$redirect = $uri->getUri();
?>
<option value="<?=$redirect;?>" <?php if($keyElem == $arParams['COUNT_DEFAULT']) echo "selected = selected"; ?>><?=$itemElem;?> на странице</option>
<?php endforeach; ?>
</select>
script.js
$(function(){
$('.js_sort_event').on('change', function(e){
e.preventDefault();
window.location.href = $(this).val();
return false;
});
$('.js_count_event').on('change', function(e){
e.preventDefault();
window.location.href = $(this).val();
return false;
});
});
Компонент /bitrix/components/bitrix/system.pagenavigation/
- Копируем компонент на локалку
- Копируем компонент в свой шаблон
- Далее подключаем его к
catalog.section
- Модифицируем
Копируем в /bitrix/components/bitrix/
на локалку
- В PhpStorm
Remove Path From Excluded
на папкеbitrix
- На папке
system.pagenavigation
нажимаемDownload from here
(загружаем только этот компонент) - На папке
bitrix
нажимаемExclude Path
(обратно исключаем папки от отслеживание)
Копируем в свой шаблон
- Создаем папку
system.pagenavigation
вlocal/templates/skillbox/components/bitrix/
- Копируем шаблон
.default
вlocal/templates/skillbox/components/bitrix/system.pagenavigation
и заменяем его наskillbox
- Удаляем
/bitrix/components/bitrix/system.pagenavigation
на локалке
Подключаем его к catalog.section
- Называем шаблон. Например,
skillbox
- В параметрах
catalog.section
подключаем
...
"PAGER_TEMPLATE" => "skillbox", // Шаблон постраничной навигации
...
Модифицируем
- Выводим
arResult
в шаблонеcatalog.section
- Все что содержит
NAV
может понадобиться, в частности$arResult['NAV_STRING']
содержит html-код - В параметрах
catalog.section
...
"PAGE_ELEMENT_COUNT" => "18", // Количество элементов на странице
...
- Переносим верстку в шаблон
system.pagenavigation
[NavRecordCount] => 12 // Общее кол-во записей
[NavPageCount] => 6 // Кол-во страниц
[NavPageNomer] => 1 // Номер активной страницы
local/templates/skillbox/components/bitrix/system.pagenavigation/skillbox/template.php
Шаблон template
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
/** @var array $arParams */
/** @var array $arResult */
/** @global CMain $APPLICATION */
/** @global CUser $USER */
/** @global CDatabase $DB */
/** @var CBitrixComponentTemplate $this */
/** @var string $templateName */
/** @var string $templateFile */
/** @var string $templateFolder */
/** @var string $componentPath */
/** @var CBitrixComponent $component */
$this->setFrameMode(true);
if(!$arResult["NavShowAlways"])
{
if ($arResult["NavRecordCount"] == 0 || ($arResult["NavPageCount"] == 1 && $arResult["NavShowAll"] == false))
return;
}
$strNavQueryString = ($arResult["NavQueryString"] != "" ? $arResult["NavQueryString"]."&" : "");
$strNavQueryStringFull = ($arResult["NavQueryString"] != "" ? "?".$arResult["NavQueryString"] : "");
// Верх оставляем
?>
<!-- Условие обратной сортировки пагинации -->
<!-- до else можно код не править -->
<?if($arResult["bDescPageNumbering"] === true):?>
<?=$arResult["NavFirstRecordShow"]?> <?=GetMessage("nav_to")?> <?=$arResult["NavLastRecordShow"]?> <?=GetMessage("nav_of")?> <?=$arResult["NavRecordCount"]?><br /></font>
<?if ($arResult["NavPageNomer"] < $arResult["NavPageCount"]):?>...<?endif?>
<?while($arResult["nStartPage"] >= $arResult["nEndPage"]):?>...<?endwhile?>
<?if ($arResult["NavPageNomer"] > 1):?>...<?endif?>
<?else:?>
<!-- Если больше чем одна страничка, показываем блок с пагинацией-->
<!-- в принципе можно и не ставить это условие -->
<?php if($arResult['NavPageCount'] > 1): ?>
<section class="pagination-block">
<!-- Предыдущая -->
<!--Если текущий страница больше чем 1, т.е находимся не на первой-->
<!-- в этом случае нам нужна ссылка на предыдущую страницу -->
<?if ($arResult["NavPageNomer"] > 1):?>
<?if($arResult["bSavePage"]):?>
<a class="key" href="<?=$arResult["sUrlPath"]?>?<?=$strNavQueryString?>PAGEN_<?=$arResult["NavNum"]?>=<?=($arResult["NavPageNomer"]-1)?>"><?=GetMessage("nav_prev")?></a>
<?else:?>
<!-- Дополнительная провка. Если больше чем 2-я страничка-->
<?if ($arResult["NavPageNomer"] > 2):?>
<a class="key" href="<?=$arResult["sUrlPath"]?>?<?=$strNavQueryString?>PAGEN_<?=$arResult["NavNum"]?>=<?=($arResult["NavPageNomer"]-1)?>"><?=GetMessage("nav_prev")?></a>
<?else:?>
<a class="key" href="<?=$arResult["sUrlPath"]?><?=$strNavQueryStringFull?>"><?=GetMessage("nav_prev")?></a>
<?endif?>
<?endif?>
<?endif?>
<!-- Номера страниц-->
<div class="pagination-page">
<!-- Цикло пока стартовая страница меньше конечной страницы-->
<?while($arResult["nStartPage"] <= $arResult["nEndPage"]):?>
<!-- Если текущая страница -->
<?if ($arResult["nStartPage"] == $arResult["NavPageNomer"]):?>
<a href="#" class="key active"><?=$arResult["nStartPage"]?></a>
<?elseif($arResult["nStartPage"] == 1 && $arResult["bSavePage"] == false):?>
<a class = "key" href="<?=$arResult["sUrlPath"]?><?=$strNavQueryStringFull?>"><?=$arResult["nStartPage"]?></a>
<?else:?>
<a class = "key" href="<?=$arResult["sUrlPath"]?>?<?=$strNavQueryString?>PAGEN_<?=$arResult["NavNum"]?>=<?=$arResult["nStartPage"]?>"><?=$arResult["nStartPage"]?></a>
<?endif?>
<?$arResult["nStartPage"]++?>
<?endwhile?>
</div>
<!-- Блок сколько показано на странице результата -->
<?if($arResult["NavPageNomer"] < $arResult["NavPageCount"]):?>
<a class="key" href="<?=$arResult["sUrlPath"]?>?<?=$strNavQueryString?>PAGEN_<?=$arResult["NavNum"]?>=<?=($arResult["NavPageNomer"]+1)?>"><?=GetMessage("nav_next")?></a>
<?endif?>
<span class="pagination-text">Показано <?=$arResult["NavFirstRecordShow"]?> <?=GetMessage("nav_to")?> <?=$arResult["NavLastRecordShow"]?> <?=GetMessage("nav_of")?> <?=$arResult["NavRecordCount"]?> результатов </span>
</section>
<?php endif; ?>
<?endif?>
<?if ($arResult["bShowAll"]):?>
<noindex>
<?if ($arResult["NavShowAll"]):?>
| <a href="<?=$arResult["sUrlPath"]?>?<?=$strNavQueryString?>SHOWALL_<?=$arResult["NavNum"]?>=0" rel="nofollow"><?=GetMessage("nav_paged")?></a>
<?else:?>
| <a href="<?=$arResult["sUrlPath"]?>?<?=$strNavQueryString?>SHOWALL_<?=$arResult["NavNum"]?>=1" rel="nofollow"><?=GetMessage("nav_all")?></a>
<?endif?>
</noindex>
<?endif?>
В шаблоне catalog.section
выводим пагинацию
<?php
echo $arResult['NAV_STRING'];
?>
- Механизм "Показать еще" в Битрикс
- Ajax подгрузка контента при прокрутке страницы Битрикс
- Постраничная навигация
- Количество страниц в пагинации 1С-Битрикс
Необходимо
- На странице
detail.php
разместить компонент детальной карточки товараКонтент-каталог-элемент каталога детально
- передать необходимые параметры.
...
Код элемента: ={$_REQUEST["ELEMENT_CODE"]}
Код раздела: ={$_REQUEST["SECTION_CODE"]}
Тип цены: BASE
-
Скопировать с сервера
/catalog_tech/detail.php
на локалку -
Скопировать шаблон в шаблон сайта.
<?$APPLICATION->IncludeComponent("bitrix:catalog.element",
"skillbox_element",
Array(
- Очищаем шаблон
template
и добавляем туда верстку.