alexpago/bitrix-models

Bitrix - 模型

安装: 89

依赖项: 0

建议者: 0

安全: 0

星标: 0

关注者: 1

分支: 0

开放问题: 0

类型:bitrix-plugin

1.0.2 2024-09-19 08:10 UTC

This package is auto-updated.

Last update: 2024-09-19 08:11:32 UTC


README

该模块允许轻松访问 Bitrix CMS 中的信息块和 Highload 块。

当前模块不使用其他依赖项,仅作为 D7 内核的 facade。

安装

  1. composer require alexpago/bitrix-models
  2. 安装模块
  3. 为方便创建模型,在 bin/model 路径下创建二进制文件。文件内容
#!/usr/bin/env php
<?php
declare(strict_types=1);
$_SERVER['DOCUMENT_ROOT'] = str_replace('/bin', '', getenv('PWD'));

require_once $_SERVER['DOCUMENT_ROOT'] . '/vendor/alexpago/bitrix-models/src/Console/bin/generate';

自动创建模型

要创建信息块模型,执行命令 php bin/model iblock。执行命令后,将显示信息块列表

Введите идентификаторы инфоблоков через пробел для генерации модели.
или all для всех. Для выхода введите "q". 
3 - Услуги CODE: services, API_CODE: services 
5 - Сертификаты на услугу CODE: certificates_services, API_CODE: certificates_services 
9 - Подарочные карты (Депозиты) CODE: deposits, API_CODE: - 
Ввод : 

选择要生成的模型。在创建模型的过程中,如果信息块没有 API_CODE,将自动填充。 注意:对于 D7 模块,信息块必须填写 API_CODE。

创建模型后,将创建一个包含示例内容的文件

<?php

namespace Pago\Bitrix\Models\Models\Catalog;

use Bitrix\Iblock\ORM\ValueStorage;
use Bitrix\Main\ORM\Objectify\Collection;
use Pago\Bitrix\Models\IModel;

/**
 * Для вызова методов getProperty и получения значения используйте метод getValue()
 * @method ValueStorage getCml2Service() // Привязка к услуге
 * @method Collection getIncludedInPrice() // Что входит в стоимость
 * @method ValueStorage getAppName() // Название (для приложения)
 * @method Collection getSalons() // Салоны
 * @method $this whereCml2Service(mixed $data, string $operator = '') // Привязка к услуге
 * @method $this whereIncludedInPrice(mixed $data, string $operator = '') // Что входит в стоимость
 * @method $this whereAppName(mixed $data, string $operator = '') // Название (для приложения)
 * @method $this whereSalons(mixed $data, string $operator = '') // Салоны
 */
class CertificatesServices extends IModel
{

}

手动创建模型

信息块:需要创建一个继承自 Pago\Bitrix\Models\IModel 类的类

类名应与信息块字符编码的 camelSpace 名称相对应。

示例:信息块字符编码为 certificates_services,则类名应为 CertificatesServices

可选:如果需要字符编码与类名不同,则必须填写常量 const IBLOCK_CODE,指定信息块字符编码。

示例

<?php

namespace Pago\Bitrix\Models\Models\Catalog;

use Pago\Bitrix\Models\IModel;

class CertificatesServicesModel extends IModel
{
    const IBLOCK_CODE = 'certificates_services';
}

可选:如果信息块标识符在所有项目中都是静态的,则建议填写常量 const IBLOCK_ID。这样系统就不需要确定信息块标识符,从而节省一个 SQL 查询。 示例:

<?php

namespace Pago\Bitrix\Models\Models\Catalog;

use Pago\Bitrix\Models\IModel;

class CertificatesServicesModel extends IModel
{
    const IBLOCK_ID = 3;
}

获取元素

类的工作方式与 Bitrix D7 查询类似。

基本查询

$elements = CertificatesServices::query()->withProperties()->get(); // get() вернет массив элементов
foreach ($elements as $element) {
    
}

带过滤和限制的基本查询

CertificatesServices::query()->setFilter(['CODE' => 'massage'])->setLimit(10)->get();

注意:可以使用缩写形式安装限制 ->limit(10) 或将第一个参数传递给 ->get(10)。例如: CertificatesServices::query()->get(10)

注意:设置偏移量 ->setOffset(50)->offset(50) 或将值作为第二个参数传递给 ->get(10, 50)。例如: CertificatesServices::query()->get(10, 50)

逐步填充过滤器

方法 setFilter 设置过滤器,如果之前已设置条件,则取消设置。

代替 setFilter,可以使用 where(column, operator, value)

where 条件后使用 orWhere(column, operator, value) 搜索 OR。

同时存在简化字段过滤的选项 whereColumn(value, operator)。Column 必须填写在 CamelSpace 中。所有字段都可用,包括信息块属性。 例如:属性代码为 CITY_ID 的属性可以过滤为 whereCityId(value)

注意:operator 默认为 = (等于)

注意:如果执行 setFilter 后执行 wherewhereColumn,则之前的值将被清除,并且仅考虑 setFilter 中的数据

过滤示例

CertificatesServices::query()
    ->withProperties()
    ->whereCityId(1)
    ->orWhere('CITY_ID', 2)
    ->whereIblockSectionId(10)
    ->whereId(5, '>=') // по умолчанию всегда оператор = (равно), заполнять при необходимости указать другой
    ->get();

获取一个元素

CertificatesServices::query()->whereId(100)->first(); // first() вернет экземпляр класса

选择

默认情况下,如果不指定 setSelect,则将选择信息块的所有字段(不包括属性)。要获取所有属性,必须调用方法 withProperties

示例

CertificatesServices::query()->withProperties()->get();

选择填充示例

// SALONS и CITY - свойства инфоблока. Обратите внимание, префикс PROPERTY указывать не нужно
CertificatesServices::query()->setSelect(['ID', 'CODE', 'NAME', 'SALONS', 'CITY'])->get();

选择逐步填充示例

// SALONS и CITY - свойства инфоблока. Обратите внимание, префикс PROPERTY указывать не нужно
CertificatesServices::query()->select('ID')->select('CODE', 'NAME')->get();

选择逐步填充和导出所有属性的示例

// SALONS и CITY - свойства инфоблока. Обратите внимание, префикс PROPERTY указывать не нужно
CertificatesServices::query()->withProperties()->select('ID')->select('CODE', 'NAME')->get();

注意:不建议在不必要的情况下加载所有属性 注意: DETAIL_PAGE_URL 不属于元素。要获取它,请使用方法 getDetailPageUrl()。如果需要提前获取详细页面的列表,请在 get 之前使用 withDetailPageUrl()

获取 detail page url 的示例

// SALONS и CITY - свойства инфоблока. Обратите внимание, префикс PROPERTY указывать не нужно
$element = CertificatesServices::query()->withDetailPageUrl()->select('ID')->first();
$element->getDetailPageUrl();

元素数量

获取元素数量的示例

// SALONS и CITY - свойства инфоблока. Обратите внимание, префикс PROPERTY указывать не нужно
CertificatesServices::query()->where('ID', '>=', 1)->count();

排序

排序是通过通过方法 setOrder 填充数组或通过填充 order(column)orderDesc(column) 来实现的

示例

CertificatesServices::query()->setOrder(['ID' => 'ASC'])->get(); 

填充示例

CertificatesServices::query()->order('ID')->orderDesc('NAME')->get(); 

注意:如果执行 setOrderorderorderDesc 之后,则前面的值将被清除,并且只会考虑 setOrder 的数据

缓存

可以缓存查询。为此,请使用 withCache()。该方法接受两个参数:缓存的有效期(以秒为单位)和用于缓存 join 的布尔值。还可以在类中预先定义属性 public int $cacheTtlpublic bool $cacheJoin

示例请求:缓存一小时,并缓存 join

$elements = CertificatesServices::query()->withCache(3600, true)->get();

如果类中设置了默认缓存,则可以通过方法 withoutCache() 关闭特定请求的缓存

结果转换

默认情况下,数据以 ORM D7 对象返回。

处理请求的示例

$elements = CertificatesServices::query()->withProperties()->get();
foreach ($elements as $element) {
    // Свойство SALONS множественное
    // Экземпляр класса Bitrix\Main\ORM\Objectify\Collection
    $salons = $element->getSalons();
    foreach ($salons as $salon) {
        $salon->getValue();
    }
    // Свойство CITY не множественное
    // Экземпляр класса Bitrix\Iblock\ORM\ValueStorage
    $city = $element->getCity()->getValue();
}

也可以将结果转换为数组

示例

$elements = CertificatesServices::query()->get();
foreach ($elements as $element) {
    $result = $element->toArray();
}

注意:方法 toArray 也会返回依赖关系。例如 IBLOCK_ELEMENT_ID。要获取仅 VALUE 的值,请使用 $element->toArrayOnlyValues()

操作

模型有快速操作。

删除元素

任何元素都可以通过一个命令来删除

$element = CertificatesServices::query()->withProperties()->first();
// Массив с результатом [Bitrix\Main\ORM\Data\Result]
$element->delete();
// Для получения результата в bool
$element->elementDelete();

也可以根据过滤器删除元素,而不获取其实例

// Массив с результатом [Bitrix\Main\ORM\Data\Result]
$delete = CertificatesServices::query()->withProperties()->whereActive(false)->delete();

更新元素

通过将新属性赋值给它并通过调用方法 save() 来更新元素,通过魔术方法 __set 来进行更新。

$element = CertificatesServices::query()->withProperties()->first();
$element->NAME = 'Новое имя';
$element->SALON_ID = 135; // Свойство инфоблока SALON_ID
// Результат сохранения Bitrix\Main\ORM\Data\Result
$element->save();

也可以使用方法 update()

$element = CertificatesServices::query()->withProperties()->first();
// Массив с результатом [Bitrix\Main\ORM\Data\Result]
$element->update([
    'NAME' => 'Новое имя'
]);
// Результат запроса Bitrix\Main\ORM\Data\Result
$element->elementUpdate([
    'NAME' => 'Новое имя 2'
]);

可以将 update() 方法应用于 query 查询,类似于 delete()

$data = [
    'ACTIVE' => true
];
// Массив с результатом [Bitrix\Main\ORM\Data\Result]
$delete = CertificatesServices::query()->withProperties()->whereActive(false)->update($data);

创建元素

创建新元素类似于更新,通过 save()。首先需要创建对象实例并填写其数据。填写完毕后,调用方法 save()

$element = new CertificatesServices();
$element->NAME = 'Имя нового элемента';
// Результат сохранения Bitrix\Main\ORM\Data\Result
$element->save();

事件

可以在模型中为添加、更改和删除元素添加事件。以下事件可用:

/**
 * Событие вызываемое перед добавлением элементам
 * @return void
 */
protected function onBeforeAdd(): void
{
    // actions
}

/**
 * Событие вызываемое после добавление элемента
 * @param \Bitrix\Main\ORM\Data\Result $result
 * @return void
 */
protected function onAfterAdd(Result $result): void
{
    // actions
}

/**
 * Событие вызываемое перед обновлением элемента
 * @return void
 */
protected function onBeforeUpdate(): void
{
    // actions
}

/**
 * Событие вызываемое после обновления элемента
 * @param \Bitrix\Main\ORM\Data\Result $result
 * @return void
 */
protected function onAfterUpdate(Result $result): void
{
    // actions
}

/**
 * Событие вызываемое перед удалением элемента
 * @return void
 */
protected function onBeforeDelete(): void
{
    // actions
}

/**
 * Событие вызываемое после удаления элемента
 * @param \Bitrix\Main\ORM\Data\Result $result
 * @return void
 */
protected function onAfterDelete(Result $result): void
{
    // actions
}

要获取更改的属性列表,可以使用方法 getChangedProperties

示例

protected function onBeforeUpdate(): void
{
    $data = $this->getProperties(); // Текущие свойства
    $originalData = $this->getOriginalProperties(); // Свойства при инициализации модели
    $changedData = $this->getChangedProperties(); // Измененные свойства
    // Можно предопределить данные
    $this->NAME .= ' Обновлено';
}