Битрикс и D7. Что за зверь такой. D7 битрикс
Битрикс и D7. Что за зверь такой
В этом посте хочу рассказать, что такое D7. Кто-то спросит D7? А что-такое D7? А это вообще Битрикс? А кто-то уже об этом слышал.
Битрикс – это система которая существует уже много лет. И за все эти годы, Битрикс никогда не переписывался с нуля. Компания всегда следовала принципу, обратной совместимости.
И чисто теоретически, вы можете взять сайт который был разработан на одной из самых первых версий Битрикс и обновить его до актуальной версии. При этом сайт не должен сломаться и должен продолжить работать.
Со временем наследие прошлого начинает давить, мешать развитию системы. Поэтому пришел момент, когда необходимо было выполнить качественный эволюционный скачок. Именно поэтому появилось новое ядро, которое получило название D7.
Какова же была цель разработки нового ядра?
Это создание нового программного ядра, на новом технологическом уровне с избавлением от устаревших технологий. По сути новое ядро, это новая идеология разработки.Произошел эволюционный мощный скачок, но не революционный. То есть никаких глобальных потрясений, вам ожидать не стоит. Вам также нужно, эволюционировать свои знания и навыки.
Постепенно старое API старого ядра, должен стать чем-то типа адаптера. Это нужно для совместимости. Все логика с соответствующим рефакторингом, должна переехать в новое ядро.
Рассмотрим кратко, что такое новое ядро D7
-
Это совершенно новый подход к API.
-
Теперь все стандартизовано.
-
Появилось ORM.
-
ООП
Само ядро D7, основывается на принципах ООП. И появилось много других современных элементов web-технологий.
Появились новые сущности, а собственно что это за сущности такие? Это новый файл настроек для нового ядра D7, который называется - .settings.php. И папка /local/, которая позволит вам, отделить свой код от кода ядра. И компоненты на классах, которые можно теперь не кастомизировать, а наследовать.
При реализации новых проектов и развития текущих, по возможности используйте новое ядро D7.
В своих следующих постах, я расскажу основные моменты работы ядра D7 и немного более подробно рассмотрим моменты, про которые я написал выше.
abraxabra.ru
Битрикс. Пробуем D7 на вкус
На практике рассмотрим, чем же отличается вариант кода старого ядра от нового D7.
Языковые константы D7
Возьмем за пример, языковые константы. Для демонстрации возьмем шаблон тиражного решения Битрикс, furniture_blue.
Где используются языковые константы, но код работы с ними реализован на старом ядре, давайте переведем их на новое ядро.
Открываем header.php и footer.php. Здесь мы видим в обоих случаях, в обоих файлах, IncludeTemplateLangFille
Как вы можете заметить, редактор кода, перечеркнул данный метод. Это значит, что данный метод устарел.
Перейдем к исходному коду, данного метода. И действительно видим, что данный метод помечен как - deprecated.
И указывает на то, что нужно использовать:
\Bitrix\Main|Localization\LocЧто мы собственно с вами, сейчас и сделаем.
Вызов нового метода D7
Перед началом работы, сделаем копию данного шаблона - furniture_blue, в котором будем работать и назовем его furniture_blue_d7.
Также хочу обратить ваше внимание, что D7 – это не просто новый вариант записей старых методов. Это своя идеология, принципы работы, поэтому не всегда мы можем заменить старый метод, на вызов нового.
В старом ядре, есть два метода. Один из них, это IncludeTemplateLangFile. Он предназначен для подключения языковых файлов, текущего шаблона.
В D7, у нас есть один единственный метод для подключения языковых файлов.
У нас есть несколько вариантов как записать данный метод.
Первый вариант, мы можем записать полное имя метода.
Но этот метод не очень удобный, давайте посмотрим на второй вариант записи.
Второй вариант.
Мы можем записать таким образом или же выбрать любое другое имя.
Это необходимо, если у нас имена классов используя в данном файле совпадают, хотя лежат в разных namespace. Либо мы просто хотим использовать более короткое имя.
Замену так же произведем в footer.php.
Вызовы языковых констант также переделаем на новое ядро D7. Давайте заменим все вызовы GetMessage на вызовы классов нового ядра.
Старый вызов
Новый вызов
Аналогичную замену, нужно сделать в footer.php.
Давайте все сохраним и перейдем на визуальную часть сайта.
Ошибок нет, сайт работает корректно.
Все языковые константы, которые использовались, выводятся в своих значениях. Но в глубине под капотом, у нас уже языковые контакты, подключаются и вызываются с использованием нового API, нового ядра D7.
Мы с вами рассмотрели вариант замены метода старого ядра, на методы нового ядра. В данном случае подобран пример, когда можно было произвести практически прямую замену, старых методов на новые методы, ядра D7.
abraxabra.ru
Запись в таблицу с множественным полем с помощью ORM
01 Июл 2016
Допустим, вы прочитали инструкции тут и тут. Создали свой высоконагруженный инфоблок (по сути – почти обычную таблицу) и у вас в этом highload-блоке есть поле, в котором хранится привязка сущностей этого блока к ID элементов старых добрых инфоблоков. Поле это будет целочисленным и множественным и необязательным.
Чтобы общаться с этой таблицей, мы в каком-нибудь модуле опишем класс в папке lib. В этом классе будет метод getMap, который опишет все поля, которые мы создали в таблице.
Описание проблемы
Теперь мы попробуем создать запись в таблице вот примерно так
\ПространствоИмён\ИмяКласса::Add([ //упустим остальные параметры 'ИМЯ_МНОЖЕСТВЕННОГО_ПОЛЯ' => [ 123123, 324234 ] ])Вызов
ИмяКласса::getList()->fetchAll()вернёт все наши записи. И во множественном поле тут также будет пусто. Возможна еще такая ситуация, когда мы передаём только один ID
\ПространствоИмён\ИмяКласса::Add([ //упустим остальные параметры 'ИМЯ_МНОЖЕСТВЕННОГО_ПОЛЯ' => 3213123 ])В этом случае в админке будет пусто, но getList вернёт нам значение этого поля. В чем же подвох?
Решение проблемы
Тут всё просто — множественные поля должны сериализовываться. Странно, что в документации этого нет. Можно сильно упростить себе жизнь, описав грамотную карту таблицы. Например, если указать в описании поля параметр ‘serialized’ => true, то битрикс сам будет сериализовывать все данные перед сохранением в таблицу и при возврате. С этим параметром и в админке и в коде всё будет отображаться нормально.
НО! Возникает проблема – если ID у нас в одном экзепляре, то хотелось бы передать только его, не засовывая в массив. Но при этом, чтобы возвращался в коде всегда массив, даже если там только одно значение, чтобы не проверят каждый раз тип данных. В этом нам поможет параметр ‘save_data_modification’, который может принудительно запихнут число в массив.
Получается, что поле в методе getMap должно быть описано примерно так.
new Entity\IntegerField('ИМЯ_МНОЖЕСТВЕННОГО_ПОЛЯ', [ 'column_name' => 'UF_ИМЯ_МНОЖЕСТВЕННОГО_ПОЛЯ', 'serialized' => true, //принудительно сохраняем данные в массив 'save_data_modification' => function(){ return [ function($value){ if(!is_array($value)){ return [$value]; }else{ return $value; } } ]; }, 'validation' => function() { return [ function($value){ if(is_array($value)){ $result = true; foreach($value as $item){ if(!(is_numeric($item) and intval($item) > 0)){ $result = false; } } if($result){ return $result; }else{ return 'Некорректный массив с ID элементов'; } }elseif(is_numeric($value) and intval($value) > 0){ return true; }else{ return 'Некорректный ID элемента, ожидается целое число или массив целых чисел.'; } } ]; } ]),murzix.ru