Что за программа d7

Антон Долганин: D7 упрощает работу, значительно. Можно забыть про богомерзкое копирование осточертевших getlist из модуля в модуль. В общем, все низкоуровневое убрали под капот — круто, спасибо.

Цель разработки — создание нового программного ядра на новом технологическом уровне с избавлением от «наслоений» устаревших технологий.

Принцип совместимости, от которого компания «1С-Битрикс» не имеет права отказаться, обязывал выполнять большой объём работ, не направленных непосредственно на развитие Bitrix Framework. Это прямо влияло на скорость и качество разработки самой платформы, и косвенно влияло на распространение продуктов компании на рынке.

По сути новое ядро — это новая идеология разработки. При этом в продукте продолжает работать весь старый API. И добавляется новый API для разработки в новом стиле. Постепенно, старый API должен стать чем-то типа адаптера, для совместимости. А вся логика с соответствующим рефакторингом должна переехать в новое ядро.

ВНЖ Португалии для финансово независимых (Виза D7): ВСЕ, ЧТО НУЖНО ЗНАТЬ В 2023

Работа с элементами инфоблока средствами ORM в Битрикс D7

Не пропусти свежие посты, подпишись:

С выходом 20-й версии 1С Битрикс, появилась возможность работы с элементами инфоблока средствами ORM. Для того, чтобы начать использовать эту возможность вам необходимо зайти в настройки информационного блока и задать значения для поля «Символьный код API». Согласно документации, символьный код API это строка от 1 до 50 символов состоящая из букв и цифр, начинающаяся с буквы. Я взял инфоблок «Одежда» из коробки БУС редакции «Бизнес» и задал код products .

Символьный код API

Для работы с элементами инфоблока средствами ORM, необходимо использовать класс BitrixIblockElements Element_Символьный_код_API_инфоблока_Table , в моём случае это класс BitrixIblockElementsElementProductsTable. Можно убедиться в этом вызвав следующий код:

//Подключим модуль «Информационные блоки» BitrixMainLoader::includeModule(‘iblock’); //Имя ORM класса для работы с инфоблоком «Одежда» echo BitrixIblockIblock::wakeUp(IBLOCK_CATALOG_ID)->getEntityDataClass(); //Где IBLOCK_CATALOG_ID — содержит ID инфоблока «Одежда»

Выведет строку BitrixIblockElementsElementProductsTable. Давайте рассмотрим практические примеры работы, подберём аналоги уже привычных нам методов старого ядра.

Аналог CIBlockElement::GetById() в ORM

Для получения данных по элементу инфоблока, по ID этого элемента, используется метод getByPrimary() вашего «виртуального класса»:

$product = BitrixIblockElementsElementProductsTable::getByPrimary(10, [ //10 — ID товара, «Платье, Красная фея» ‘select’ => [‘ID’, ‘NAME’, ‘PREVIEW_TEXT’, ‘DETAIL_PICTURE’, ‘MANUFACTURER’, ‘MATERIAL’], ])->fetch();
В переменной $product будет примерно такая информация:
Содержимое переменной: Array ( [ID] => 10 [NAME] => Платье Красная Фея [PREVIEW_TEXT] => [DETAIL_PICTURE] => 68 [IBLOCK_ELEMENTS_ELEMENT_PRODUCTS_MANUFACTURER_ID] => 2148 [IBLOCK_ELEMENTS_ELEMENT_PRODUCTS_MANUFACTURER_IBLOCK_ELEMENT_ID] => 10 [IBLOCK_ELEMENTS_ELEMENT_PRODUCTS_MANUFACTURER_IBLOCK_PROPERTY_ID] => 10 [IBLOCK_ELEMENTS_ELEMENT_PRODUCTS_MANUFACTURER_VALUE] => Россия «Модница» [IBLOCK_ELEMENTS_ELEMENT_PRODUCTS_MATERIAL_ID] => 2156 [IBLOCK_ELEMENTS_ELEMENT_PRODUCTS_MATERIAL_IBLOCK_ELEMENT_ID] => 10 [IBLOCK_ELEMENTS_ELEMENT_PRODUCTS_MATERIAL_IBLOCK_PROPERTY_ID] => 11 [IBLOCK_ELEMENTS_ELEMENT_PRODUCTS_MATERIAL_VALUE] => трикотаж )

Обратите внимание, что ключи пользовательских свойств инфоблока, MANUFACTURER и MATERIAL указываются как есть, без префикса PROPERTY_ . Чтобы избежать таких длинных ключей как IBLOCK_ELEMENTS_ELEMENT_PRODUCTS_MANUFACTURER_IBLOCK_ELEMENT_ID в результирующем массиве, можно использовать псевдонимы, вот так:

Читайте также:
Blender программа что это такое

КАКИЕ ЧИТЫ Я ИСПОЛЬЗУЮ? | Geometry Dash

$product = BitrixIblockElementsElementProductsTable::getByPrimary(10, [ //10 — ID товара, «Платье, Красная фея» ‘select’ => [‘ID’, ‘NAME’, ‘PREVIEW_TEXT’, ‘DETAIL_PICTURE’, ‘MANUFACTURER_’ => ‘MANUFACTURER’, ‘MATERIAL_’=>’MATERIAL’], ])->fetch();
В таком случае, данные приходят в более удобном виде:
Содержимое переменной: Array ( [ID] => 10 [NAME] => Платье Красная Фея [PREVIEW_TEXT] => [DETAIL_PICTURE] => 68 [MANUFACTURER_ID] => 2148 [MANUFACTURER_IBLOCK_ELEMENT_ID] => 10 [MANUFACTURER_IBLOCK_PROPERTY_ID] => 10 [MANUFACTURER_VALUE] => Россия «Модница» [MATERIAL_ID] => 2156 [MATERIAL_IBLOCK_ELEMENT_ID] => 10 [MATERIAL_IBLOCK_PROPERTY_ID] => 11 [MATERIAL_VALUE] => трикотаж )

Элемент инфоблока как объект

С данными элемента инфоблока можно работать не только как с массивом, но и как с объектом. Для этого используйте метод fetchObject() вместо fetch() после вызова getByPrimary() .

$product = BitrixIblockElementsElementProductsTable::getByPrimary(10, [ //10 — ID товара, «Платье, Красная фея» ‘select’ => [‘ID’, ‘NAME’, ‘PREVIEW_TEXT’, ‘DETAIL_PICTURE’, ‘MANUFACTURER_’ => ‘MANUFACTURER’, ‘MATERIAL_’=>’MATERIAL’], ])->fetchObject();

В данном случае, в $product будет получен объект класса BitrixIblockElementsEO_ElementProducts с множеством методов для работы с ним. Например:

//Получить id товара echo $product->getId(); //10 //Получить наименование товара echo $product->getName(); //»Платье Красная Фея» //Получить id детального изображения echo $product->getDetailPicture(); //68

Как видите для получения значений элемента инфоблока используются так называемые геттеры (методы getXXXX где XXX — название поля в «верблюжьей нотации» или CamelCase). Существует так же общий метод get() который принимает наименование поля, значение которого вам нужно получить. Например:

//Получим id элемента echo $product->Get(‘ID’); // 10 //Получим наименование элемента echo $product->Get(‘NAME’); // «Платье Красная фея»

Свойства элемента

Свойства элементов (когда мы работаем с ними в виде объекта) так же получаются при помощи геттеров (методов getXXXX где XXXX — код свойства записанный как CamelCase). У каждого свойства есть поле значения VALUE и описания DESCRIPTION и соответcnвующие методы для доступа к ним getValue() и getDescription() . Рассмотрим пример:

//Получим данные товара $product = BitrixIblockElementsElementProductsTable::getByPrimary(10, [ //10 — ID товара, «Платье, Красная фея» ‘select’ => [‘ID’, ‘NAME’, ‘PREVIEW_TEXT’, ‘DETAIL_PICTURE’, ‘MANUFACTURER’, ‘MATERIAL’], //MANUFACTURER и MATERIAL свойства типа «Строка» ])->fetchObject(); //Получим значение свойства MANUFACTURER var_dump($product->getManufacturer()->getValue());
В результате получим строку:
string(29) «Россия «Модница»»

Чтобы получить дополнительную информацию для некоторых типов свойств через ORM, нужно указать дополнительный ключ при выборке свойства:

  • FILE — свойство типа файл
  • ITEM — свойство типа список,
  • ELEMENT — свойство типа привязка к элементу инфоблока
  • SECTION — свойство типа привязка к разделу инфоблока

Давайте рассмотрим это детальнее. У нашего элемента есть следующие свойства требуемых типов:

  • MORE_PHOTO — Картинки галереи (тип файл)
  • NEWPRODUCT — Новинка (тип список)
  • RECOMMEND — С этим товаром рекомендуем (тип привязка к элементу)
  • NEWS_SECTION — Показывать в рекламном блоке в новостях (тип привязка к разделу), это я создал для теста, в «коробке» такого нет

Давайте получим их в ORM:

//Получим данные товара $product = BitrixIblockElementsElementProductsTable::getByPrimary(10, [ ‘select’ => [ ‘ID’, ‘NAME’, ‘PREVIEW_TEXT’, ‘DETAIL_PICTURE’, ‘MORE_PHOTO.FILE’, //Обратите внимание на доп.ключи ‘NEWPRODUCT.ITEM’, ‘RECOMMEND.ELEMENT’, ‘NEWS_SECTION.SECTION’ ], ])->fetchObject();

Читайте также:
Adobe acrobat reader dc russian что это за программа и нужна ли она

Свойство типа файл в ORM

Рассмотрим следующий код:
//Выведем доп.фотографии товара foreach ($product->getMorePhoto()->getAll() as $photo)< echo ‘'. $product->getName() .'‘; >

Обратите внимание во первых на метод getAll() , т.к. свойство MORE_PHOTO — множественное, по сути оно представляет из себя коллекцию значений. Чтобы получить всю коллекцию и применяют метод getAll() . Далее при обходе элемента коллекции свойства типа файл мы получаем в распоряжение метод getFile() , который в свою очередь открывает нам доступ к методам getSubdir() и getFileName() для получения дополнительной информации о файле.

Свойство типа список в ORM

//Свойство типа список var_dump($product->getNewproduct()->getItem()->getId()); //int(1) var_dump($product->getNewproduct()->getItem()->getXmlId()); //string(1) «Y» var_dump($product->getNewproduct()->getItem()->getValue()); //string(4) «да»

Как видите для свойств типа список (при использовании специального ключа .ITEM) добавляется метод getItem() который позволяет получить ID значения списка методом getId() , внешний код значения getXmlId() и само значение методом getValue() .

Свойство типа привязка к элементам инфоблока в ORM

//Получим привязанные элементы foreach ($product->getRecommend()->getAll() as $recommendedProduct)< echo ‘Рекомендуемый товар ID -‘ . $recommendedProduct->getElement()->getId() . ‘ наименование — ‘ . $recommendedProduct->getElement()->getName() . ‘
‘; >

Т.е. рекомендуемые товары так же являются множественным свойством получаем коллекцию значений через getAll() . Далее мы видим, что элементу коллекции доступен метод getElement() через который мы можем узнать некоторую информацию об элементе, например ID getId() и наименование getName() .

Свойство типа привязка к разделу инфоблока в ORM

//Получим id привязанного раздела var_dump($product->getNewsSection()->getSection()->getId()); //Получим наименование привязанного раздела var_dump($product->getNewsSection()->getSection()->getName());

Как и в случае с предыдущим типом свойств нам доступен метод getSection() через который мы можем узнать некоторую дополнительную информацию о связанном с элементом разделе другого инфоблока.

Аналог CIBlockElement::GetList() в ORM

В качестве аналога к всем полюбившимся методу CIBlockElement::GetList() используется getList() из D7 который применялся к HL-блокам ранее. Приведу пример:

$products = BitrixIblockElementsElementProductsTable::getList([ ‘select’ => [‘ID’, ‘NAME’, ‘PREVIEW_TEXT’, ‘DETAIL_PICTURE’, ‘MANUFACTURER_’ => ‘MANUFACTURER’, ‘MATERIAL_’=>’MATERIAL’], ‘filter’ => [‘=ACTIVE’ => ‘Y’], ])->fetchAll(); foreach ($products as $product) < //. что-то делаем с данными продуктов. >

Тут всё как в HL блоках D7, поэтому детально разбирать этот вопрос я не стану.

Кеширование результата выборки данных

В Битрикс ORM несколько упростили процедуру кеширования результатов выборки из инфоблока. Для этого вам достаточно добавить в массив параметра метода getList() поле cache и указать параметры кеширования:

$product = BitrixIblockElementsElementCatalogTable::getList([ ‘select’ => [ ‘ID’, ‘NAME’, ‘PREVIEW_TEXT’, ‘DETAIL_PICTURE’ ], ‘filter’ => [ ‘ID’ => 10, ], ‘cache’ => [ ‘ttl’ => 3600 ], ])->fetchObject();

В одной из ближайших статей я напишу простой компонент в двух версиях, старой с использованием классических приёмов работы с ифноблокми и новой с использованием ORM и сравню производительность.

Надеюсь статья окажется для вас полезной, желаю удачи!

Не пропусти свежие посты, подпишись:

Источник: it-svalka.ru

Ядро Bitrix d7 — краткий конспект

Универсальная галерея - модуль для битрикс

Презентация нового ядра Bitrix d7 — это почти двухчасовой доклад на партнерской конференции 2013 года. Если вы не смогли осилить его просмотр, то предлагаю вам котороткий конспект о самом главном — какие преимущества принесет новое ядро, и основы работы с ним.

Показать скрытое содержание

Все свои файлы в папке /local/

Читайте также:
Mba программа обучения что это

Отныне весь код отдельного сайта можно размещать в папке /local/, а не как раньше в /bitrix/templates/, /bitrix/components/имя/ и т.д. Это существенно упростит командную разработку с использованием систем контроля версий, и позволит полностью отделить код разработки сайта от ядра.

Подключаем только header

Код обычной страницы в публичной части теперь будет выглядеть так:

При этом, по словам разработчиков, теперь не нужно использовать отложенные функции, т.к. сначала подключается ядро, потом шаблон страницы, т.е. значения свойств страниц должны быть доступны и в хедере, а не только в футере.

Примечание: пока мне не удалось запустить данный функционал, возможно он только планируется, но еще не реализован. Если вам удалось, отпишитесь, пожалуйста, в комментариях.

Отказ от глобальных переменных

Теперь вместо глобальных переменных, таких как $APPLICATION, $USER, $DB, $CACHE_MANAGER, и т.д., будут использоваться специальные объекты.

ORM (Object-relational mapping)

Это значит, что будет елиный синтаксис GetList, Add, Update, Delete, в отличие от ситуации на данный момент, когда, например, параметры CUser::GetList сильно отличаются от параметров того же CIBlockElement::GetList. Также будет стандартизирован синтаксис параметра $arFilter, который на данный момент также сильно различается от модуля к модулю. Еще разработчики обещают, что для каждого метода будут реализованы события, и синтаксис их, вероятно, тоже будет единым. Это будет реализовано благодаря тому, что все классы будут наследоваться от базового класса Entity, в котором уже будут реализовано все, что необходимо, включая события (но каждый метод базового класса при желании можно будет и переопределить).

Синтаксис нового getList будет принимать только один массив в качестве параметра, в котором в произвольном порядке можно будет указать любой набор нужный параметров из следующих:

  • ‘select’ — массив выбираемых полей
  • ‘filter’ — массив фильтра
  • ‘group’ — массив полей группировки
  • ‘order’ — массив сортировки
  • ‘limit’ — ограничение количества
  • ‘offset’ — смещение от начала
  • ‘count_total’ — подсчет количества записей

Методы же add, update, delete теперь будут возвращать типизированные объекты AddResult, UpdateResult и DeleteResult соответственно, в которых будет содержаться информация об успешности операции и ошибки при их наличии.

Этот новый класс объединяет как настройки модулей, хранимые в БД (BitrixMainConfigOption, ранее COption), так и настройки ядра — BitrixMainConfigConfiguration (альтернатива константам в dbconn.php).

Подключение модулей (теперь модули подключаются через класс BitrixMainLoader)

BitrixMainLoader::IncludeModule($moduleName);

Теперь если вы, например, ошиблись в написании названия параметра фильтра в GetList, данный параметр не будет проигнорирован как раньше, и не будут выбраны все элементы, а скрипт остановится с ошибкой.

Что нужно знать разработчикам модулей

Классы функций теперь должны размещаться в подпапке lib в папке модуля. При этом, если название файла с классом будет соответствовать пространству имен, то автоподгрузка класса будет включена автоматически, т.е. теперь не нужно будет пользоваться функцией CModule::AddAutoloadClasses (хотя ее использование пока не запрещается, но теперь эта функция называется Loader::registerAutoLoadClasses).

Источник: g-rain-design.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru