Однажды, в понедельник, мне пришла в голову мысль — "а покопаюсь ка я в новом ядре" (новым относительно, но об этом позже). Мысль не появилась на ровном месте, а предпосылками для нее стали:
- тестовое задание, от одной из крупных студий матушки-России (в котором фигурировала аббревиатура ORM),
- идея написать простенький модуль,
- желание одного из клиентов, в перспективе, сделать магазин.
Так вот, историей об этом походе, в густые тропические джунгли, я хочу поделиться.
Коротенькое предисловие
Я не считаю себя гуру программирования ни на Битриксе, ни на чем либо еще. В статье отражены мои наблюдения, опыт и мысли. Конструктивная критика приветствуется, как и аргументированные споры (как Сократ завещал). В предпосылках выделены три обширные темы, которые не будут рассматриваться. Как и их основной аспект — программирование работа с данными в рамках ядра Битрикса D7 (ORM), хотя и является основополагающим фактором для ее написания.
В омут с головой
Аспект работы с данными — основополагающий и без него никуда, подумал я и решил пойти сразу в гугл просмотреть документацию, в надежде на подробное описание и наличия примеров, ну и конечно заглянуть в курсы. С легкой руки и надеждой на что-то вкусное и новенькое. Не видя повода для беспокойства, я отправился в поход. Тучи сгущались...
Что нужно знать о джунглях или правила выживания
Правило №1 — Остерегайтесь недобросовестных турагентов
Решил начать с курсов, увидев интересующие меня пункты меню (модуль и ORM), кучу текстов и вставок кода подумал — все будет быстро, поехали… Так совершилась моя очередная ошибка. По факту же, оказалось:
курсы плохо структурированы — порядок изучения не продуман, можно встретить отсутствие какой либо связи между главами;
постоянные ссылки — я не говорю про отсылки к документации, но ссылки на stack overflow и другие главы (в конце курса, между которыми море информации) очень сильно отвлекают, это не серьезно;
вода и общие слова — галочку по количеству символов поставить можно;
Жирный шрифт используется для выделения важных в смысловом значении слов, терминов, фраз и предложений. То есть то, что особенно важно в контексте описываемого функционала:
трактовка понятий на свой лад — это еще старая тема (API — Component — Template aka MVC);
вставки из документации — копипаст целых кусков, иногда просто чтобы заполнить место;
цитаты разработчиков — тут просто слов нет -_-, зачем это бахвальство;
устаревшие главы — просто удалить их кажется нельзя, усиливают путаницу в разы.
Взаимосвязи между сущностными (устаревший вариант) или Настройки скидок на товар
Конечно плюс в том, что курсы в принципе есть. Наверное плюс, ведь написать что-то только на их основе еще та задача. Ну да ладно. Просмотрев курсы, в основном вставки кода, решил пробовать, еще же есть документация. Дождь начинал моросить...
Правило №2 — Остерегайтесь густых зарослей
Сделав пару простых выборок используя скотч документацию, решил попробовать вывести скидку на товар. И тут начался ливень. Псевдоновое ядро и пасхалочки:
- два модуля для скидок — да да, я долго думал — почему я добавил скидку, в товаре она есть, но я не могу ее получить через класс сущности
DiscountTable
. Пришлось писать в поддержку. Ответ был такой:
DiscountTable — скидки на товар, принадлежат к модулю Торговый каталог, функционал устарел и не используется. Рекомендуем использовать Правила корзины.
- отсутствие документации — а можно получить ссылочку на документацию — спросил
я. Ожидая, что с 2013-2015 она появилась. Ответ:
Документация по созданию Правил корзины пока находится в разработке.
- сценарии работы не продуманы — следующий мой вопрос был логичен — А как мне вывести скидку? На что я получил фееричный ответ и закончил общение с поддержкой:
Чтобы получить правила работы с корзиной, которые применяются к товару, вам необходимо будет создать объект корзины и выполнить расчет для товара.
- незавершенный функционал — некоторые методы классов могут вернуть сообщения об ошибках наподобие:
Для добавления скидок на товар используйте вызов CCatalogDiscount::Add()
- сложная архитектура — для создания сложной выборки из нескольких таблиц используются специальные объекты отношений, которые нужно добавить в метод
SomeTable::getMap()
. Это не всегда просто (некоторые классы описания сущностей генерируются автоматически). Так же, огорчает факт, что сложную выборку получить просто в формате многомерного массива — нельзя. Да и конструкции отношений могут занимать не один десяток строк. - лабиринты функциональности — в D7 есть места, которые постоянно переписываются и при этом все вариации поддерживаются. Те же объекты для отношений могут быть реализованы через:
Entity\ReferenceField
||Bitrix\Main\ORM\Fields\Relations
||runtime
(при запросе)
Все это очень удручает и заставляет негодовать, мягко говоря. А помимо этого еще и прочие неудобства есть.
Правило №3 — Чертовы насекомые
Битрикс имеет ряд странных и назойливых особенностей, про которые постоянно забываешь, но они вновь мелькают перед твоими глазами:
- правила именования классов и файлов — свой автопогрузчик приводящий все к нижнему регистру, разные имена классов и файлов;
- пути подключения сторонних решений — например composer или vue (которое просто содержится в библиотеке BX без каких либо явных причин и надстроек );
- поддержка старого кода — куча лишних, ненужных классов и постоянная путаница;
- забытые компоненты — обновлялись только компоненты модуля iblock;
- шаблоны компонентов — пресловутые и всем известные, с бизнес логикой наперевес;
- неявная логика и проблемы кастомизацией — после изменения сценария заказа можно поймать трудноуловимую ошибку и проблемы с модулями;
- вездесущий статик — начинаешь думать, что это нормально;
- спорная админка — местами не удобная и не адаптивная, а разрабатывать модули под нее… ммм;
Мелочи, но они постоянно рядом.
Правило №4 — Незнакомцы и туземцы бывают опасны
У Битрикса есть еще одно благо (нет) — большое сообщество. Ты можешь найти любую информацию, но ее правильность и релевантность будет под большим вопросом. Зачастую можно научиться только создавать костыли или использовать древний код, у которого уже есть адекватная замена. Но встречаются и мессии, способные указать путь своей пастве. Один из таких сказал:
Для работы с инфоблоками пользуйтесь старым ядром, которое хорошо и стабильно работает.
Думаю так и сделаю.
Правило №5 — Хищники где-то рядом
Маркетологи хвалящие продукт. Сравнительные статьи, где Битрикс безусловный лидер. Куча полу программистов, как собственно и я. Множество сайтов, которые просят закончить их мучения. Тоже бич сообщества.
Правило №6 — Имейте запасы воды
С каждой новой проблемой и отсутствием адекватного решения, мораль падает и ты пропускаешь ход приходят мысли, а нужно ли это все, к чему эта трата времени. Может лучше фрэймворк, контейнеризация и непрерывная интеграция, а не эти полумеры. В таких случаях только волевое решение ну и спрос спасает ситуацию.
Правило №7 — Тропический дождь это тяжело
И добивает один малоприятный факт, на попытки программирования, поиск и структурирование информации, общение со знатоками и возвращения к пройденному, узнав что-то новенькое, уходит уйма времени, при отсутствии внятного результата — это постоянно угнетает.
Цивилизация aka выводы
И вот ты выходишь из джунглей. Потрепанный, но живой. Надломленный, но все еще не сломленный. Твои уставшие глаза открыты и они видят все. Путь, куда действительно стоит двигаться и тропы, где нужна особая осторожность.
Битрикс спорный продукт, говорить о том, что он вообще развивается развивается неправильно — не стоит. Но и говорить, что он лучший, не замечая недостатки — это слепо верить.
Для себя я определился, Битриксу — нет. Полный отказ, конечно, не получится, но развиваться в продукте, в котором за 5 лет не появилась поддержка основного функционала и внятной документации, для нового и анонсированного ядра — смысла не вижу. Лучше написать простенькое решение, которое будет использоваться от проекта к проекту на старом ядре и идти изучать новенькое.
Старик Франкенштейн, конечно, достоин жизни, хотя бы пару достойных идей в нем есть. В конце концов, мы же не в средневековье, чтобы сжигать на кострах всех инакомыслящих. Или все таки стоит, что думаете?
P.S Статья написана на скорую руку, сорь если не получилось выстроить последовательную цепочку мысли.