Введение в Битрикс
Interlabs
23 мая 2013
1 / 32
О чем речь
Как перестать бояться и ////////////полюбитьиспользовать Битрикс.
Минимум необходимой информации для того, чтобы начатьразработку и сопровождение проектов на Битрикс, без
претензий на большой опыт.
2 / 32
Файловая структураИз коробки — все в одной куче:
• кода и данные сайта;• код CMS и код сайта;• контент сайта и файлы CMS.
Огромное количество файлов — проблемы при использованииконтроля версий.
Необходимо разделить файлы CMS и сайта.
3 / 32
Альтернативная структураПриложение DOC_ROOT
app/ www/components/ bitrix -> ../lib/bitrixphp_interface/ bitrix_app/templates/ cache -> ../../var/cachedefault/ html_pages -> ../../var/html_pages... managed_cache -> ../../var/managed_cacheindex.php php_interface -> ../../app/php_interfaceurlrewrite.php stack_cache -> ../../var/stack_cache
templates -> ../../app/templates/etc index.php -> ../app/index.php/lib urlrewrite.php -> ../app/urlrewrite.php/var upload/ -> ../var/upload
Также используем BX_PERSONAL_ROOT, подробнее — в wiki.4 / 32
Файловая CMS• базовая структура сайта соответствует структуре файлов врабочем каталоге, страница = файл.
• код CMS и административные режимы вынесены вподкаталог bitrix, страницы явно подключает код CMS:
<? require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");$APPLICATION->SetTitle("1С-Битрикс: Управление сайтом 7.0"); ?>
Тело документа. Содержательная часть.
<? require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php"); ?>
• cодержимое файла может быть произвольным.• папка (раздел) = вложенный ресурс в URL.
5 / 32
Общая структура сайтаПолностью определяется файловой структурой, поэтому ееправильный выбор критически важен:
• базовая структура адресов страниц;• свойства отдельных разделов и их наследование;• хлебные крошки;• вложенные меню.
Динамический контент всегда расширяет статический, заранеепредусматриваем это:
http : //ottobock − shop.ru /medical− line︸ ︷︷ ︸статика, файл
/knee/50K13/︸ ︷︷ ︸динамика, компонент
6 / 32
Статические разделы• статический раздел — папка в контентной части;• файл index.php — отображается при запросе к папке;• скрытые файлы для хранения дополнительных свойств.
http://site.com/about/company/about/company/
.access.php - права доступа к папке;
.section.php - настройки раздела;
.submenu.menu.php — пункты вложенного меню;index.php - страница по умолчанию.
Большая часть статики — папки со страницами по умолчанию.
7 / 32
Свойства страниц и разделов• для разделов хранятся в файле .section внутри папки, длястраниц — в файле страницы.
• свойства разделов наследуются вложенными папками.• набор свойств по умолчанию:
Админ: Настройки → Настройки модулей → Управление структурой
Настройки для сайтов. Типы свойств.
Свойства могут быть получены в коде страницы, шаблона,компонента:
$APPLICATION->GetProperty("name");
8 / 32
Свойства раздела: примерНекоторые разделы показываются в темной цветовой схеме, внекоторых разделах показывается дополнительная колонка:
• создаем свойства color_scheme и sidebar;• прописываем их в нужных разделах;• вложенные разделы наследуют свойства;
В шаблоне:
$sidebar = $APPLICATION->GetProperty(’sidebar’);$color_scheme = $APPLICATION->GetPropert(’color_scheme’);
if ($sidebar) {$APPLICATION->IncludeComponent("bitrix:catalog.section.list",...
9 / 32
СтраницыСтраница = PHP-файл, включающий в себя:
• пролог и эпилог (показывается не во всех режимах);• HTML-текст страницы + произвольный PHP-код;• вызов компонент;• вызов включаемых блоков.
Адрес страницы определяется путем к файлу, для статики поумолчанию заводим папку со страницей по умолчанию.
Рекомендуется вносить все изменения через админ, меньшеошибок и значительно проще работать с компонентами.
10 / 32
Компоненты на страницах• готовые повторно используемые модули• как правило, используют базу данных (динамика)добавляются на страницу с помощью стандартного вызова:
<?$APPLICATION->IncludeComponent("bitrix:news.list","faq",Array(
"DISPLAY_DATE" => "N","DISPLAY_NAME" => "Y",...
Используем визуальный режим, если вызов нужно включить вкод — добавляем компонент на тестовую страницу и копируем.
11 / 32
Включаемые областиОтдельно редактируемая контентная область, выводимая поопределенному условию:
• включаемая область страницы: выводится на странице,файл с суффиксом _inc.php в том же каталоге;
• включаемая область раздела: выводится на всех страницахраздела, файл sect_inc.php в каталоге папки;
• включаемый файл: произвольный файл.
Подключение: CMain::IncludeFile1 или вызов компонентаbitrix:main.include.
1http://dev.1c-bitrix.ru/api_help/main/reference/cmain/includefile.php12 / 32
Использование областейВарианты использования:
• редактируемая контактная информация в шапке сайта:включаемый файл
• дополнительная колонка с контекстными блоками раздела(новости на главной, группы каталога товаров длякаталога): включаемая область раздела с рекурсивнымпоиском
• дополнительный контент для страницы за пределамиосновной контентной области: включаемая областьстраницы
13 / 32
МенюРазличные виды меню на сайте — «типы» меню (основное вшапке, дополнительное слева, вспомогательное внизу и т.д.):
Админ: Настройки → Настройки модулей → Управление структурой
Настройки для сайтов. Типы меню.
Физически — php-файл в папке раздела:
статическое: .<имя-типа-меню>.menu.php, главное меню;динамическое .<имя-типа-меню>.menu_ext.php, группы
товаров.
Внешний вид меню определяется выбором шаблона привызове компонента.
14 / 32
Меню: продолжение• вложенные разделы наследуют меню родительских, если уних нет своего собственного;
• чтобы отменить родительское меню, нужнопереопределить его без пунктов.
• для пунктов меню можно указывать дополнительныепараметры, которые можно использовать при выводе, поумолчанию один параметр;
• в файлах menu_ext.php можно использовать вызовспециализированных компонент, например,bitrix:menu.sections для формирования из инфоблока.
Руководство по использованию компонентов меню2
2http://bit.ly/18jOv9P15 / 32
Меню групп каталога<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();$aMenuLinks = array_merge(
$aMenuLinks,$GLOBALS[’APPLICATION’]->IncludeComponent("bitrix:menu.sections","",Array(
"IS_SEF" => "Y","SEF_BASE_URL" => "/catalog/medical-line/","SECTION_PAGE_URL" => "#SECTION_CODE#/","DETAIL_PAGE_URL" => "#SECTION_CODE#/#ELEMENT_CODE#","IBLOCK_TYPE" => "catalog","IBLOCK_ID" => "1","DEPTH_LEVEL" => "1","CACHE_TYPE" => "A","CACHE_TIME" => "36000000"
)));?>
16 / 32
Виды компонентовПростые
Блок страницы, выводящийдинамическую информацию.
Пример: последние десятьновостей на главной странице.
Комплексные
Динамический раздел изнескольких страниц.
Пример: раздел «Новости»:список + страницы новостей.
http : //ottobock − shop.ru /medical− line︸ ︷︷ ︸статика
/knee/50K13/︸ ︷︷ ︸комплексный компонент
Залог успеха — максимальноe использованиестандартных компонентов.
17 / 32
Свойства компонентов• компоненты стараются разделять логику и представление;• комплексные компоненты как правило используют наборболее простых, которые могут быть полезны на отдельныхстраницах;
• комплексный компонент размещается на статическойстранице и использует вложенные адреса для своихстраниц, структура статики влияет на адреса динамики;
• при выводе компонентов задействуются механизмыкеширования.
В идеале код страницы должен состоять только из вызововкомпонентов, нужно минимизировать PHP-код внутристраницы.
18 / 32
Компоненты: реализацияИмя: bitrix︸ ︷︷ ︸
namespace
: catalog.section.list︸ ︷︷ ︸имя
/bitrix/components/bitrix/catalog.section.listimages/ - картинки и т.д.install/ - скрипты установкиlang/ - языковые сообщения, файлы помощиtemplates/ - шаблоны
.default/ - шаблоны по умолчаниюtemplate.php - шаблон по умолчанию
.description.php - описание компонента
.parameters.php - описание параметров компонентаcomponent.php - контроллер компонента
19 / 32
Компоненты: контроллер
• проверяет наличие кеша StartResultCache(), все сам!• обращается к источнику данных (инфоблоки);• формирует массив данных для представления $arResult;• загружает шаблон $this->IncludeComponentTemplate().
Общая картина: страшно, много дублирующегося спагетти-кода.
Но: позволяет кешировать работу с источником данных,поэтому стараемся весь код, работающий с базой, писать ввиде компонент.
20 / 32
Компоненты: шаблон• .default — по умолчанию, можно реализовыватьальтернативные шаблоны и выбирать при размещении.
• шаблон — HTML + PHP, $arResult — данные;• шаблон сайта может переопределять шаблоны компонент.• если в папке шаблона есть result_modifier.php, в немможно модифицировать $arResult без модификациисамого компонента;
• result_modifier.php запускается если шаблон некешируется, component_epilog.php выполняется всегда.
Документация по компонентам3
3http://bit.ly/18jN6zY21 / 32
Разработка компонентов
• всегда создаем компоненты в собственном пространствеимен;
• модифицируем существующие компоненты путемкопирования и последующей модификации, иначе теряемвозможность обновлений;
• при модификации комплексных компонентов следим,какие простые компоненты они вызывают, принеобходимости переопределяем;
• с наследованием и вообще ООП все плохо.
22 / 32
Выполнение компонента
23 / 32
ШаблоныШаблон дизайна определяет общий вид страниц сайта. Оченьпримитивная система, сэндвич из трех частей:
/templates/<имя-шаблона>components/ - переопределенные шаблоны компонентов;images/ - картинкиinclude_areas/ - включаемые файлы, в т.ч. для областей;page_templates/ - шаблоны страни и редактируемых областей;snippets/ - сниппеты;.styles.php - стили для визуального редактора;style.css - стили для контента и включаемых областей;.template_styles.css - стили для шаблона;header.php - шапка;footer.php - подвал;description.php - метаинформация для админа.
24 / 32
Обработка адресов
Есть внутренний аналог mod_rewrite: urlrewrite.php4.
<?$arUrlRewrite = array(
array("CONDITION" => "#^/gallery/#","RULE" => "","ID" => "bitrix:photo","PATH" => "/max/images/index.php",
),
Для компонента можно указать привязку к адресу, используяпараметр компонента SEF_MODE.
4http://bit.ly/gAIY1R25 / 32
Инфоблоки
База данных в базе данных:
• базовая абстракция для работы с БД;• произвольный набор полей без необходимости менятьструктуру базы;
• сложная структура таблиц, затрудняющая работунепосредственно с базой;
• страшный API;• невысокая производительность.
26 / 32
Терминология инфоблоков
• каждый инфоблок принадлежит определенному типу суникальным идентификатором;
Админ: Контент → Инфоблоки → Типы инфоблоков
• инфоблок включает в себя набор полей;• инфоблок может содержать иерархические разделы ссобственным набором полей.
• элемент инфоблока — собственно запись, набор значенийполей.
27 / 32
Инфоблоки и URLХотя инфоблок и относится к модели, для него можно указатьшаблон формирования URL, который используетсякомплексными компонентами.
До версии 12.05 всегда один уровень вложенности:
http://site.ru/catalog/sectionC/element.php
После 12.05 — произвольная вложенность для компонентовcatalog, news, photo (SECTION_CODE_PATH):
http://site.ru/catalog/sectionA/sectionB/sectionC/element.php
28 / 32
API инфоблоков$BID = 1; //ID инфоблока$SID = 2; //ID секции$result = CIBlockElement::GetList(
array("ID"=>"DESC"),array("IBLOCK_ID"=>IntVal($BID),
"ACTIVE_DATE"=>"Y", "ACTIVE"=>"Y","SECTION_ID"=>$SID),
false,array("nPageSize"=>15),array("ID", "NAME", "PREVIEW_PICTURE", "PREVIEW_TEXT",
"PROPERTY_UF_USER_FIELD"));
while($element = $result->GetNextElement()) {$arItem[]= $element->GetFields();
}
Документация по API инфоблоков5
5bit.ly/10oplBM29 / 32
Каталог товаровМаксимально используем стандартное решение, учитываем еговозможности при составлении ТЗ.
• выполняем первоначальную настройку каталога: типы цен,типы плательщиков, свойства заказа;
• заводим типы инфоблоков, с поддержкой вложенныхадресов должно хватать одного типа;
• создаем разделы, определяем наборы полей;• определяемся с товарными позициями: цены в элементахкаталога или отдельные товарные предложения.
• вводим или импортируем первоначальный наборэлементов.
30 / 32
Товары vs предложения
• предложения — разновидности одного товара сразличными ценами;
• отдельный тип инфоблока и отдельный инфоблок;• если есть варианты одного товара с одинаковой ценой,заводить предложения не надо;
• свойства товара можно передавать в заказ безиспользования товарных предложений;
• при добавлении в корзину свойства передаются в виденабора параметров, формируемого в шаблоне.
31 / 32
Общие рекомендации• максимально используйте готовый функционал, Битрикснедружественен к программисту;
• всегда обновляйте свежеустановленную систему;• минимизируейте количество инфоблоков;• проще реализовать один универсальный шаблон, чемподдерживать несколько;
• код, работающий с базой — внутри компонента,допускающего кеширование;
• собственные компоненты — в отдельном пространствеимен;
• никогда не модифицируйте код Битрикса, если нужно —копируйте компоненты;
32 / 32