Download the PHP package alexpago/bitrix-models without Composer
On this page you can find all versions of the php package alexpago/bitrix-models. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download alexpago/bitrix-models
More information about alexpago/bitrix-models
Files in alexpago/bitrix-models
Informations about the package bitrix-models
Bitrix модели (Таблицы, Инфоблоки, Highload)
Данный модуль позволяет легко обращаться к инфоблокам, Highload-блокам, таблицам в Bitrix CMS.
Текущий модуль не использует иных зависимостей и работает исключительно как фасет ядра D7.
Установка
- Устанавливаем модуль
- Подключаем автозагрузку моделей-классов при необходимости. Подробнее в разделе: Автозагрузка моделей
- Для удобства создания моделей создаем бинарный файл по пути bin/model. Содержимое файла:
Обновление 1.2.0
Внимание: Информация для обновления с версии 1.1.x (и старее) до 1.2.x
Автозагрузка классов
При обновлении, если вы использовали автозагрузку моделей и используете модели по директории
local/lib/models/
, просьба обратить внимание на то, что для включения автозагрузки модулей теперь необходимо объявить константуconst AUTOLOAD_MODELS = true
перед подключением composer (желательно вdbconn.php
) или подключить загрузку вручную.
Подробнее про автозагрузку классов в разделе: Автозагрузка моделейРабота с инфоблоками
В связи с медленной работой загрузки свойств и некорректной работой множественных свойств была переработана логика получения свойств. В целом старая логика должна быть сохранена, но могут возникнуть проблемы "при переезде". В локальных проектах проблем не наблюдалось, но стоит обратить внимание.
На текущий момент работа с инфоблоками полностью работоспособна без дополнительных методовgetValue
,getCollection
.
Для сохранения свойств из модели необходимо указать имя свойства без префиксаPROPERTY
. Например:
$model->PRICE = 500; $model->save()
Скорость загрузки элементов инфоблоков
Загрузка свойств ускорена в 2 раза. При использовании параметра
->withCache()
скорость увеличивается до 4 раз.Генерация моделей
Весь класс логики был перемещен в
Builder
. Таким образом, при разработке больше не будут всплывать методы, которые не относятся к модели.
Для удобства разработки рекомендуем перегенерировать модели и переиспользовать phpdoc из новых моделей, применив к старым.Update, Save, Delete
Методы
update
,save
,delete
теперь разделены логикой и обрабатываются по-разному в модели и в построителе запроса.
Например: Если это построитель запроса->query()->where('ID', 5)->delete()
, то будет возвращен массив со всеми удаленными элементамиarray<Bitrix\Main\ORM\Data\Result>
.
В случае удаления элемента из модели будет возвращенBitrix\Main\ORM\Data\Result
. Данная логика распространяется на методы:update
,delete
.
Обратите внимание, что старые методыelementUpdate
иelementDelete
помечены как устаревшие. Рекомендуется их не использовать и заменить наupdate
,delete
.Новые методы-операторы
Добавлены новые операторы. Подробнее можно почитать в разделе: Доступные методы фильтрации
Символьные коды инфоблоков
Ранее при некорректном символьном коде возникали ошибки создания модели. На текущий момент модель будет создана даже при некорректном названии с уведомлением о необходимости её переименования и рекомендацией действий.
Создание моделей в автоматическом режиме
Для создания моделей инфоблоков выполните команду: php bin/model iblock
.
Для создания моделей highload-блоков выполните команду: php bin/model hlblock
.
Для создания моделей таблиц выполните команду: php bin/model table
.
Путь создания моделей: По умолчанию модели создаются в директории local/lib/models
с namespace Local\Models
. Для переопределения пути и namespace необходимо передать аргументы path и namespace соотвественно.
Например: php bin/model table --path=/local/models/table/ --namespace=Local\Table
В результате выполнения команды отобразится список highload-блоков или инфоблоков, в зависимости от типа модели. Для таблицы будет отображено поле ввода названия таблицы.
Выберите необходимые модели для генерации.
Можно перечислить идентификаторы или названия таблиц прямо в команде через пробел:
php bin/model iblock 15 16
или php bin/model table b_user
Внимание, для инфоблоков в процессе создания модели будет автоматически заполнен API_CODE инфоблока при его отсутствии.
Внимание, для инфоблоков и работы модуля D7 необходим заполненный API_CODE у инфоблока.
После создания модели будет создан файл с примерным содержимым:
Создание моделей вручную
Инфоблок:
Необходимо создать класс наследуясь от класса Название класса должно соответствовать символьному коду инфоблока в CamelSpace.
Опционально: Если необходимо, чтобы символьный код отличался от названия класса,
то необходимо заполнить константу const IBLOCK_CODE
с указанием символьного кода инфоблока.
Опционально 2: Если идентификатор инфоблока является статическим на всех проектах, то желательно указать его заполнив константу . Таким образом системе не нужно будет определять идентификатор инфоблока и система сэкономит один SQL запрос.
Highload-блок:
Необходимо создать класс наследуясь от класса Название класса должно соответствовать коду справочника в CamelSpace.
Опционально: Если необходимо, чтобы символьный код отличался от названия класса,
то необходимо заполнить константу const HL_CODE
с указанием символного кода справочника или const HL_ID
с указанием ID справочника.
Таблица:
Необходимо создать класс наследуясь от класса Название класса должно соответствовать названию таблицы в CamelSpace.
Опционально: Если необходимо, чтобы название таблицы отличалось от названия модели, можно заполнить метод с названием таблицы
или указать константу const TABLE_NAME
Пример названия модели по символьному коду: символьный код инфоблока/справочника custom_catalog
, тогда название класса будет CatalogModel
.
Пример названия модели по названию таблицы: таблица b_option_sites
будет BOptionSites
Пример готовой модели инфоблока:
Автозагрузка моделей
Расположение моделей является сугубо Вашей фантазией. Если Вы не планируете писать большой код в проекте, то можно воспользоваться стандартными средствами загрузки классов моделей.
По умолчанию модели создаются в директории local/lib/models
с namespace Local\Models
. Они не подключаются автоматически.
Для автоматического подключения необходимо объявить константу const AUTOLOAD_MODELS = true
перед подключением composer (желательно в dbconn.php) или подключить загрузку вручную.
Для ручной загрузки необходимо вставить код до его использования, например в init.php
Получение элементов
Работа с классами аналогична работе с Bitrix D7 запросами.
Базовый запрос
Базовый запрос с фильтрацией и лимитом
Примечание: можно использовать сокращенный вариант установки лимита
->limit(10)
или передать первый параметр в->get(10)
Например:Заметка: для установки смещения
->setOffset(50)
или->offset(50)
или передать значение вторым параметром в->get(10, 50)
Например:CatalogModel::query()->get(10, 50)
Поэтапное заполнение фильтра
Метод setFilter
устанавливает фильтр перезаписывая все ранее установленные условия.
Взамен setFilter
можно использовать where(column, operator, value)
.
Для поиска OR после условия where
можно использовать orWhere(column, operator, value)
.
Доступные методы фильтрации:
where(string $property, $operator, $data = null): static
Фильтрация с условием для указанного свойства.
Параметры:
$property
(string): Имя свойства, по которому производится фильтрация.$operator
(mixed): Оператор сравнения (например, '=', '>', '<', '!=', и т.д.).$data
(mixed): Значение для сравнения с данным свойством. Если не указано, то используется оператор как значение.
whereIn(string $property, array $values): static
Фильтрация с условием IN
для указанного свойства.
Параметры:
$property
(string): Имя свойства.$values
(array): Массив значений, которые должны быть проверены для этого свойства.
orWhereIn(string $property, array $values): static
Фильтрация с условием OR IN
для указанного свойства.
Параметры:
$property
(string): Имя свойства.$values
(array): Массив значений, которые должны быть проверены для этого свойства.
whereProperty(string $property, string $property2): static
Фильтрация, где свойство сравнивается с другим свойством.
Параметры:
$property
(string): Имя первого свойства.$property2
(string): Имя второго свойства, с которым сравнивается первое.
orWhereProperty(string $property, string $property2): static
Фильтрация с условием OR
, где одно свойство сравнивается с другим.
Параметры:
$property
(string): Имя первого свойства.$property2
(string): Имя второго свойства.
whereNotIn(string $property, array $values): static
Фильтрация с условием NOT IN
для указанного свойства.
Параметры:
$property
(string): Имя свойства.$values
(array): Массив значений, которые не должны соответствовать данному свойству.
orWhere(string $property, $operator, $data = null): static
Фильтрация с условием OR
для указанного свойства.
Параметры:
$property
(string): Имя свойства.$operator
(mixed): Оператор сравнения (например, '=', '>', '<', '!=', и т.д.).$data
(mixed): Значение для сравнения с данным свойством. Если не указано, то используется оператор как значение.
whereNotNull(string $property): static
Фильтрация по условию "не равно NULL" для указанного свойства.
Параметры:
$property
(string): Имя свойства.
whereNull(string $property): static
Фильтрация по условию "равно NULL" для указанного свойства.
Параметры:
$property
(string): Имя свойства.
whereBetween(string $property, $min, $max): static
Фильтрация с условием "между" для указанного свойства.
Параметры:
$property
(string): Имя свойства.$min
(mixed): Минимальное значение диапазона.$max
(mixed): Максимальное значение диапазона.
whereNotBetween(string $property, $min, $max): static
Фильтрация с условием "не между" для указанного свойства.
Параметры:
$property
(string): Имя свойства.$min
(mixed): Минимальное значение диапазона.$max
(mixed): Максимальное значение диапазона.
Также существует упрощенный вариант фильтрации по полям whereColumn(value, operator)
.
Column должен быть заполнен в CamelSpace. Доступны все поля, включая свойства инфоблока.
Например: Свойство с кодом CITY_ID
можно отфильтровать как whereCityId(value)
Внимание: operator по умолчанию = (равно)
Внимание: если выполнить
setFilter
послеwhere
илиwhereColumn
, то предыдущие значения будут стерты и учитываться будут только данные изsetFilter
Пример фильтрации:
Получение одного элемента
Если нужно получить элемент в виде массива, используйте
firstArray()
. Вызов методаfirstArray()
аналогичен цепочке вызововfirst()->toArray()
Выборка
Пример выборки с фильтрацией
По умолчанию если не указывать setSelect
будут выбраны все поля инфоблока без свойств.
Внимание:
Для получения всех свойств инфоблока необходимо вызвать метод withProperties
.
Пример:
Если нужно получить элементы в виде массива, используйте
getArray()
. Вызов методаgetArray()
аналогичен цепочке вызововget()->toArray()
Пример с заполнением выборки:
Пример с поэтапным пополнением выборки:
Пример с поэтапным пополнением выборки и выгрузкой всех свойств:
Внимание: не рекомендуется выгружать все свойства без строгой необходимости Внимание:
DETAIL_PAGE_URL
не принадлежит элементам. Для получения используйте методgetDetailPageUrl()
. Если необходимо заранее получить список детальных страниц, перед get рекомендуем использоватьwithDetailPageUrl()
Пример с получением detail page url
:
Пагинация
Метод getPaginate
предоставляет функциональность для получения объекта пагинации, который содержит информацию о текущей странице, общем количестве страниц, данных для отображения и других параметрах, связанных с пагинацией. Этот метод возвращает объект класса Pago\Bitrix\Models\Structures\Paginator
.
Параметры:
Возвращаемое значение:
Метод возвращает объект класса Paginator с несколькими аттрибутами, которые содержат информацию о пагинации. Атрибуты объекта Paginator:
У Paginator так же имеется метод toArray который переводит весь массив в ответ. Ответ будет аналогичен свойствам за исключением data. В свойстве data так же расположится информация моделей в виде массивов (к каждой модели применяется toArray)
Количество элементов
Пример получения количества элементов:
Сортировка
Сортировка происходит путем заполнение массивом через метод setOrder
или путем наполнения order(column)
и orderDesc(column)
Пример:
Пример заполнением:
Внимание: если выполнить
setOrder
послеorder
илиorderDesc
, то предыдущие значения будут стерты и учитываться будут только данные изsetOrder
Кеширование
Запросы можно кешировать. Для этого используйте withCache()
. Метод принимает два аргумента: время жизни
кэша в секундах и bool для кеширования join. Так же заранее можно предопределить в классе
свойства public int $cacheTtl
и public bool $cacheJoin
.
Пример запроса с кешированием на час и кешированием join:
Если в классе установлен кэш по умолчанию, то его можно отключить для определенного запроса методом
withoutCache()
Преобразование результатов
По умолчанию данные возвращаются объектами ORM D7.
Пример обработки запроса:
Так же можно приводить результат в массив
Пример:
Внимание: метод toArray вернет так же зависимости привязок. Например
IBLOCK_ELEMENT_ID
. Для получения только значенияVALUE
используйте$element->toArrayOnlyValues()
Действия
У моделей доступны быстрые действия.
Удаление элемента
Пример массового удаления из query
Любой элемент можно удалить одной командой
Так же можно удалить элементы по фильтру не получая их экземпляры
Обновление элемента
Обновление элемента происходит путем присваивания ему новых свойств через магический метод __set,
с последующим вызовом метода save()
.
Так же можно воспользоваться методом update()
Метод update()
можно применять аналогично delete()
к query
запросу
Создание элемента
Создание нового элемента аналогично обновлению через save()
. Для начала необходимо
создать экземпляр объекта и заполнить его данными. После заполнения вызвать метод save()
.
Пример редактирования моделей из запросов
Так же можно использовать метод
put()
, который вызовет методsave()
и вернет экземпляр созданного объекта.
События
У моделей можно добавлять события на добавление, изменение и удаления элементов. Доступны следующие события:
Для получения списка изменяемых свойств можно использовать метод
getChangedProperties
Пример: