Как стать автором
Обновить

Аскеза Bitrix

Время на прочтение8 мин
Количество просмотров6.9K

Я изучаю Битрикс где-то пару недель. Зачем?.. Хотелось чего-то новенького, тут подвернулась учёба. Даром, с наставниками, с возможным трудоустройством дальше хотя бы на пару месяцев - на испытательный срок. Я ничего заранее про Битрикс не знала, ну кроме термина "Битрикс" и факта, что в каждой второй вакансии по Laravel (мой обычный фреймворк) я на хедхантере вижу строчку Б_ЭТОНАМ_ТОЖЕНАДО.

Ниже попробую описать, чем Битрикс труден при выраженном любопытстве. Ну и, опять же, пару опций намечу, как это вот всё лечить. Вдруг разработчики Битрикса статью увидят? Они симфонисты. Правда, они старый код не трогают (это не точно), пишут второе ядро D7. Собственно про D7 наружный лифт на картинке.

Два вида пыха

Первое, что вам надо узнать до захода на Битрикс: "там всё на файлах". Точнее, на файлах многое. Есть типовые страницы, вроде "товар с артикулом". Сами артикулы и другие свойства товаров, конечно, хранятся в базе.

Но. В сабже есть

  • вёрстка

  • и визуальный редактор.

Вёрстка, если издалека, это файл.php. Как таковую структуру вёрстки мы рассмотрим чуть ниже. Тут лишь отмечу, что вёрстка - шаблон, в нём 90% HTML там-сям разбавлены хитрой специальной шаблоновой формой пыха:

<ul>
  <?php foreach ($arResult['ITEM'] as $item) : ?>
    <li>
      <a href="<?=$item['URL']?>" class="<?=$item['PARAM']['color'] ?? ''">
        <?=$item['TEXT']?>
      </a>
    </li>
  <?php endforeach; ?>
</ul>

Парочка комментариев к коду:

  • я могу подвирать в названиях разных параметров. Ибо они - последнее, что меня там цепляет

  • я долго думала, что к этой вставке выбрать в рубрике "какой язык". Хабр не подсвечивает РНР, поскольку ждёт теги снаружи. А на HTML он не знает, что делать с пыхом в кавычках

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

Собственно, это и есть пых второй формы: редакторы.

Вы нажимаете кнопочку "добавить страницу", и где-то в недрах Алдана некий невидимый джинн создаёт вёрстку 'файл.php', в нужную папку Битрикса её складывает и уходит. Ну или так: уходит, переведя вас на эту страницу (если вы заодно поставили галочку "перевести на страницу" - проверьте).

Если вы там в админке внутри страницы жмёте на кнопку "добавить меню / новостной компонент / и др. сюда", джинн (или братец джинна) находит файл вашей страницы, место внутри её вёрстки - промежду тегами - где нужно вставить вызов крутецкой функции. Дальше вставляет туда, например, такое:

<?$APPLICATION->IncludeComponent("bitrix:news","",Array(
        "DISPLAY_DATE" => "Y",
        "DISPLAY_PICTURE" => "Y",
        "DISPLAY_PREVIEW_TEXT" => "Y",
        "SEF_MODE" => "Y",
        "AJAX_MODE" => "Y",
        "IBLOCK_TYPE" => "news",
        "IBLOCK_ID" => "1",
        "NEWS_COUNT" => "20",
        "USE_SEARCH" => "Y",
        "USE_RSS" => "Y",
        "USE_RATING" => "Y",
        "USE_CATEGORIES" => "Y",
        "USE_REVIEW" => "Y",
        "USE_FILTER" => "Y",
        "SORT_BY1" => "ACTIVE_FROM",
        "SORT_ORDER1" => "DESC",
        "SORT_BY2" => "SORT",
        "SORT_ORDER2" => "ASC",
        "CHECK_DATES" => "Y",
        "PREVIEW_TRUNCATE_LEN" => "",
        "LIST_ACTIVE_DATE_FORMAT" => "d.m.Y",
        "LIST_FIELD_CODE" => Array(),
        "LIST_PROPERTY_CODE" => Array(),
        "HIDE_LINK_WHEN_NO_DETAIL" => "Y",
        "DISPLAY_NAME" => "Y",
        "META_KEYWORDS" => "-",
        "META_DESCRIPTION" => "-",
        "BROWSER_TITLE" => "-",
        "DETAIL_SET_CANONICAL_URL" => "Y",
        "DETAIL_ACTIVE_DATE_FORMAT" => "d.m.Y",
        "DETAIL_FIELD_CODE" => Array(),
        "DETAIL_PROPERTY_CODE" => Array(),
        "DETAIL_DISPLAY_TOP_PAGER" => "Y",
        "DETAIL_DISPLAY_BOTTOM_PAGER" => "Y",
        "DETAIL_PAGER_TITLE" => "Страница",
        "DETAIL_PAGER_TEMPLATE" => "",
        "DETAIL_PAGER_SHOW_ALL" => "Y",
        "STRICT_SECTION_CHECK" => "Y",
        "SET_TITLE" => "Y",
        "ADD_SECTIONS_CHAIN" => "Y",
        "ADD_ELEMENT_CHAIN" => "N",
        "SET_LAST_MODIFIED" => "Y",
        "PAGER_BASE_LINK_ENABLE" => "Y",
        "SET_STATUS_404" => "Y",
        "SHOW_404" => "Y",
        "MESSAGE_404" => "",
        "PAGER_BASE_LINK" => "",
        "PAGER_PARAMS_NAME" => "arrPager",
        "INCLUDE_IBLOCK_INTO_CHAIN" => "Y",
        "USE_PERMISSIONS" => "Y",
        "GROUP_PERMISSIONS" => Array("1"),
        "CACHE_TYPE" => "A",
        "CACHE_TIME" => "3600",
        "CACHE_FILTER" => "Y",
        "CACHE_GROUPS" => "Y",
        "DISPLAY_TOP_PAGER" => "Y",
        "DISPLAY_BOTTOM_PAGER" => "Y",
        "PAGER_TITLE" => "Новости",
        "PAGER_SHOW_ALWAYS" => "Y",
        "PAGER_TEMPLATE" => "",
        "PAGER_DESC_NUMBERING" => "N",
        "PAGER_DESC_NUMBERING_CACHE_TIME" => "36000",
        "PAGER_SHOW_ALL" => "Y",
        "FILTER_NAME" => "",
        "FILTER_FIELD_CODE" => Array(),
        "FILTER_PROPERTY_CODE" => Array(),
        "NUM_NEWS" => "20",
        "NUM_DAYS" => "30",
        "YANDEX" => "Y",
        "MAX_VOTE" => "5",
        "VOTE_NAMES" => Array("0", "1", "2", "3", "4"),
        "CATEGORY_IBLOCK" => Array(),
        "CATEGORY_CODE" => "CATEGORY",
        "CATEGORY_ITEMS_COUNT" => "5",
        "MESSAGES_PER_PAGE" => "10",
        "USE_CAPTCHA" => "Y",
        "REVIEW_AJAX_POST" => "Y",
        "PATH_TO_SMILE" => "/bitrix/images/forum/smile/",
        "FORUM_ID" => "1",
        "URL_TEMPLATES_READ" => "",
        "SHOW_LINK_TO_FORUM" => "Y",
        "POST_FIRST_MESSAGE" => "Y",
        "SEF_FOLDER" => "/",
        "SEF_URL_TEMPLATES" => Array(
            "detail" => "#ELEMENT_ID#/",
            "news" => "search/",
            "section" => "rss/",
        ),
        "AJAX_OPTION_JUMP" => "N",
        "AJAX_OPTION_STYLE" => "Y",
        "AJAX_OPTION_HISTORY" => "N",
        "VARIABLE_ALIASES" => Array(
            "detail" => Array(),
            "news" => Array(),
            "section" => Array(),
        ),
        "USE_SHARE" => "Y",
        "SHARE_HIDE" => "Y",
        "SHARE_TEMPLATE" => "",
        "SHARE_HANDLERS" => array("delicious", "lj", "twitter"),
        "SHARE_SHORTEN_URL_LOGIN" => "",
        "SHARE_SHORTEN_URL_KEY" => "",
        )
);?>

Скопировала отсюда: https://dev.1c-bitrix.ru/user_help/components/content/articles_and_news/news.php .

Ещё раз. Вы кликаете на кнопки в админке на визуальном редакторе. Вам не рекомендуется лезть внутрь кода. В глаза ж бросается - тут код для демонов. Это вот всё под капотом пишет пыха второго типа "редактор" в нужное место пыхи первого типа "страница".

Что помешало умный редактор сделать слегка иначе:

  • джинн ищет файл, куда нужно добавить вставку

  • делает вставку: require сюда файл 'local / config / имя_вёрстки / имя_вставляемого_компонента / хеш.php'

  • а сами эти 105 строчек кода (см. вставку выше) далее пишет туда в (новый) файл, по адресу

Ясное дело, уже очень многое выполнено по-старому. Ок, пишем нового джинна, он проверяет, есть ли вставка старого типа внутри местной вёрстки (с подробным кодом). И если есть, вырезает, далее - см. выше (если уже что-то было, это кладём в новый файл, вёрстке оставив только require и адрес).

Отладку ведём в два хода: изнутри пыха вёрстки находим адрес. По адресу берём файл, а в нём - знакомый уже вызов функции.

Минусы такого решения: мы больше файлов проходим при формировании клиентской выдачи. И больше файлов при перенастройке страницы. Но. Тут, во-первых, три с половиной файла на среднем сайте. А во-вторых, сабж славится своим кешем - чаще всего отдаётся страница готовая. Даже один процент вашего миллиона хитов формировать страницу с нуля не требует. Что не касается работы в админке - но вы в ней не ежечасно. И вас там трое.

Плюс: разделение вёрстки с бекендом. Мы оставляем вёрстке одну строку вместо сотенки с хвостиком. Строчку, которую может понять верстальщик, не знающий РНР: "мы открываем стандартный тег РНР, пишем на языке РНР 'включить' по-английски, пишем стандартное заклинание $_НАЧАТЬ['КОРНЕМ_САЙТА'] - тут по-английски тоже, и, наконец, адрес нужного файла. Закрывающий тег РНР".

Это всегда будет выглядеть одинаково. И это не вызывает вопросов "а шотакое Б_ПРОЛОГ_ЭТОШТО?" Если вдруг вызовет, чел в целом знает, куда идти (вот по этому адресу).

Собственно, дальше - о перегрузке внимания. Или о правилах "как писать годный код. Чтобы потом, через пару лет, ты его сам читал бы на ночь и успокаивался".

Фраза, с которой мы начинаем вёрстку, выглядит так:

<?php if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die; ?>

Это вообще чего? Да очень просто:

  • вёрстка содержит код РНР (см. выше). Вызов вставляемой вёрстки самостоятельно (просто как файла) может вывести в браузер ошибки, на основании коих хакер поймёт, как устроен ваш сервер, код, и туда залезет. В общем, это про безопасность.

  • правильные запросы в Bitrix устроены так: те страницы, которые именно для вызывания, начинаются с подключения крыши (head.php, живёт этот файл по адресу local/templates/имя_шаблона/вотон... кажется, так. Не точно). Файл крыша.пых, в свою очередь, подключает пролог. Ну а пролог вызывает ещё кого-то. И не единственного. Где-то по ходу в недрах программы рождается наша константа: Б_ПРОЛОГ_УЖЕТУТ. Если она у нас есть, значит, вызвано всё в нормальной последовательности для выдачи.

  • ну а ты, маленький программист, ты, разумеется, думаешь о безопасности, помнишь, что эту хреновину зовут Б_ПРОЛОГ_ТУТ, кроме того, годится она только трушная. То есть, бывает и ложная. А когда?.. А зачем?.. А нафига мне всё вот это знать в рамках вёрстки?

Альтернатива: в корне лежит файл security.php . Там наша строчка. Вёрстка же начинается со знакомого для верстальщика (см. выше) "первое - открываем тег РНР, пишем require, далее заклинание $_НАЧАТЬ['КОРНЕМ_САЙТА'], ну и вот это вот .'/security.php'; Закрываем пых."

Что важно знать в такой ситуации? Нужно ли знать о прологе? Или о том, как вообще вставляется эта вёрстка в страницу? Нет. Требуется лишь одна привычка: начинать безопасностью. "Вставьте в начало вёрстки файл безопасность.пых. Он в корне сайта".

Если однажды верстальщик задумается "что там внутри", он отдельно откроет файл "безопасность". С некоторой вероятностью закроет сразу же. С несколько меньшей дальше пойдёт изучать язык. Станет отличным бекендером битрикса, ибо знает поверхность админки уже как свои пять пальцев. Все эти ваши "Б_ПРОЛОГ_ЕСТЬ, а === правда?" раньше ему не встречались, не отвлекали, кнопочки были всем и всё было кнопочками (это я про админку).

Где что лежит

Выйдя по делу (насчёт CMain) на https://bxapi.ru/ , я обрадовалась: я там увидела ссылочку "карта модулей". Я почему-то решила, что мне покажут, кто кого вызывает из старых файлов, в какой последовательности. Лично мне для учёбы такая бы подошла: карточки из названий файлов, их описаний и стрелочки между карточками: "тот вызывает этот (и при каких условиях)".

Я начала было такое делать, но там сто слоёв. Что-то подсказывает, что требуются программисты для написания этого как проекта с интерактивом, а не мои бумажки или мои майндкарты. Я бы предположила, это поможет учиться.

Наши параметры: один, два, много

У части функций на ларавель вообще нет параметров. Я про вопросики вроде $user->isAdmin() или ->isActive(). Или же вызовы просят один параметр, ну или два: update(UserUpdateRequest $request, User $id) в контроллере UserController (тут раньше была ошибка - благодарю @manzadeyза подсказку)

Выше на моей вставке из 105 строчек кода 100 - это... Вы меня поняли. Если вы лезете в код, надо ж всё это знать?.. Умная пыха второго типа "редактор" сама меняет такие значения - не лезьте в код.

Только вопрос: как мне это развидеть? Что помешало сделать таблицы для компонентов, и для конфигов (а это конфиг реально), и вместо вороха строк передавать ID записи в базу?

К минусам (выше) добавится ещё слой. Даже ещё одно обращение к базе. Хуже того, добавится ещё N таблиц (по числу компонентов). Только (опять см. выше) у нас есть кеш. Ну и, опять же, в моём учебном проекте было ещё до меня... 744 таблицы. Семьсот сорок четыре таблицы, Карл! И экономить на рюшечках?


Кажется, я уже выдохлась. Если что-то всплывёт ещё, я напишу отдельно. Но это вряд ли - всё таки я уже, видимо, завязала. Опыт бесценный - теперь мне ничо ни по чём. Какой-нибудь Yii... Ах да!! Чуть не забыла:)

Это вверху страницы в хедере

Подключения стилей, скриптов и строчек. Это же тоже конфиги. Строчки надо выселить на массив:

$aHeaderLinks = [
	'css' => [], 
	'js' => [], 
	'str' => []
];

Дальше, вообще не трогая вёрстку, где-то отдельным местом внутри запускающих файлов из этих вот конфигов всё занести на ассет: $asset->addCss($item) для каждого по ключу 'css' и др.

Ну а верстальщику дать отдельные кнопочки для добавления опций. Кнопка "добавить ссылку на css", такое.


Тут я добавлю ресурсы, которые мне помогли и кукуху сберечь, и ещё даже что-то выучить.

1) хабр. Ищете по слову "Битрикс" и по слову "Bitrix" - это два разных. Очень рекомендую "Битрикс для программиста и менеджера: любовь и ненависть" от @parserme : https://habr.com/ru/post/459330/ . Написано в июле 2019.

2) древний (даже не адаптивный) сайт https://max22.ru/ . Это один из первый, куда я зашла от отчаяния, через гугл. Ну а конкретнее - https://max22.ru/s-bitrix/why-bitrix/ с комментариями. Дата последнего - 18 год. А Битрикс ушёл вперёд... Но конфликты там вечные.

3) Подкаст "Ядро Битрикс: история и планы" на "Пятиминутке РНР": https://www.youtube.com/watch?v=fz08nLnxgpo&t=3s&ab_channel=ПятиминуткаPHP . Запись выложена в июле 2021.

(апд) 4) Добавлю сюда же ссылку (см. в комментариях тут) от @hazgна "Исповедь Битрикс хейтера" @mmjurov: https://habr.com/ru/post/282333/ . Текст написан в 2016 году, обратите внимание. Что-то, возможно - многое, с тех пор изменилось. Но в целом мне лично текст сейчас (в августе 2022) был очень полезен.

Да, разумеется, ещё

  • документация битрикса, это https://dev.1c-bitrix.ru/user_help/ и другие трое на выпадашке сверху (собственно, только неделю спустя поняла, что они там пучками)

  • учебные курсы https://dev.1c-bitrix.ru/learning/course/index.php - эти тоже пучком. Не обращайте внимания на красненькое: мышку наводите на "выбрать курс" и полчаса обдумываете список опций

  • упоминавшийся выше сайт https://bxapi.ru/ - это, правда, только о новом ядре (вроде бы)

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Кому это надо
27.27% Я программист. Мне бы ваши проблемы!18
16.67% Я программист. И мне надо.11
0% Я менеджер. Мне бы ваши проблемы!0
1.52% Я менеджер. И мне надо.1
45.45% Вообще не знаю, о чём вы тут. Фигня какая-то.30
9.09% Вообще не знаю, о чём вы тут. Любопытненько:)6
Проголосовали 66 пользователей. Воздержались 35 пользователей.
Теги:
Хабы:
Всего голосов 17: ↑8 и ↓9+1
Комментарии58

Публикации

Работа

Ближайшие события

15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань