alexpr94/bitrix-models

Bitrix 中的模型层

1.0.4 2024-04-10 20:05 UTC

This package is auto-updated.

Last update: 2024-09-15 21:06:22 UTC


README

描述

此包引入了模型层(Model Layer),允许生成主要 CMS Bitrix 实体的类模型,例如信息块、信息块分区、highload-块和用户。

在生成模型时,包会自动读取 Bitrix 实体的所有现有用户字段和属性,并基于这些字段和属性创建具有相同用户字段和属性的特定类型类,以 lowerCamelCase 格式保存到您的数据库中。

因此,您可以使用代码编辑器(IDE)内置的提示系统,查看可能的字段和属性。

imgs/img.png

安装

composer require alexpr94/bitrix-models

生成信息块模型

要生成信息块模型,请创建以下示例脚本,根据您的需求编辑 IBlockGenerator 构造函数参数,指定所需的信息块字符码、未来生成类的 namespace 和保存路径。然后执行脚本。脚本执行完成后,您可以将其删除。

use Alexpr94\BitrixModels\Generator\Models\IBlockModels\IBlockGenerator;

require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/header.php');

$pathSaving = $_SERVER['DOCUMENT_ROOT'] . '/local/classes/IBlockModels';
$namespace = 'Classes\\IBlockModels';
$codeIblock = 'catalog';

$generator = new IBlockGenerator($codeIblock, $pathSaving, $namespace);
if (!$generator->generate()) {
    var_dump($generator->getErrors());
}

按照指定路径创建代码生成器将创建包含指定信息块元素/分区所有字段和用户属性的 php 类文件,这将使您能够在编写应用程序代码时,通过代码编辑器(IDE)提示快速选择必要的属性和字段。所有类都将以下划线字符码的 CamelCase 格式开头。

示例:生成具有字符码 catalog 的商品信息块的结构化文件

  • IBlockModels/Catalog/CatalogModel.php - 元素选择模型
  • IBlockModels/Catalog/CatalogSectionModel.php - 分区选择模型
  • IBlockModels/Catalog/Overrides/CatalogElementQuery.php - ElementQuery 基础类查询重写
  • IBlockModels/Catalog/Overrides/CatalogModelCollection.php - BaseModelsCollection 基础类集合重写
  • IBlockModels/Catalog/Overrides/CatalogPropsData.php - IBElementPropsData 基础类属性重写
  • IBlockModels/Catalog/Overrides/CatalogSectionModelCollection.php - BaseModelsCollection 基础类集合重写
  • IBlockModels/Catalog/Overrides/CatalogSectionPropsData.php - IBSectionPropsData 基础类属性重写
  • IBlockModels/Catalog/Overrides/CatalogSectionQuery.php - SectionQuery 基础类查询重写

您应该使用两个类:CatalogModel 和 CatalogSectionModel。文件夹 Overrides/ 中的所有类都重写了基础系统类以处理模型,并且不应直接通过 new 操作符创建。这些重写对于在编写应用程序代码时正确使用代码编辑器(IDE)提示系统是必要的。

生成 highload-块模型

生成 highload-块模型的代码示例

use Alexpr94\BitrixModels\Generator\Models\HLModels\HLModelGenerator;

require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/header.php');

$hlCodes = [
    'WarehouseOrders',
    'Regions',
    'HistoricityFieldsOrder'
];
$pathSave = $_SERVER['DOCUMENT_ROOT'] . '/local/classes/HLModels/';
$namespace = 'Classes\\HLModels';

foreach ($hlCodes as $hlCode) {
    $generator = new HLModelGenerator($hlCode, $pathSave, $namespace);
    if (!$generator->generate()) {
        var_dump($generator->getErrors());
    }
}

指定需要模型的高load-块代码数组和其他 HLModelGenerator 类构造函数参数。

示例:生成具有代码 Regions 的高load-块的结构化文件

  • HLModels/Regions/RegionsModel.php - 记录选择模型
  • HLModels/Regions/Overrides/RegionsCollection.php - BaseModelsCollection 基础类集合重写
  • HLModels/Regions/Overrides/RegionsQuery.php - DataManagerQuery 表查询基础类重写

为用户生成模型

use Alexpr94\BitrixModels\Generator\Models\UserModels\UserModelGenerator;

require_once($_SERVER['DOCUMENT_ROOT'] . '/local/php_interface/include/header.php');

$generator = new UserModelGenerator($_SERVER['DOCUMENT_ROOT'] . '/local/classes', 'Classes');
$generator->generate();
if (!empty($generator->getErrors())) {
    var_dump($generator->getErrors());
}

用户生成的文件结构

  • User/UserModel.php - 记录选择模型
  • User/Overrides/UserModelsCollection.php - UserModelsCollection 基础类集合重写
  • User/Overrides/UserPropsData.php - UserPropsData 基础类属性重写
  • User/Overrides/UserQuery.php - UserQuery 基础类查询重写

使用模型

选择模型

为了选择数据,对于所有生成的模型,无论实体类型如何,都有一个静态方法 query(),该方法返回一个查询构建器类。在查询构建器类中,您可以设置用于选择的字段和属性,设置过滤器、排序、分页参数等。

选择分区的示例

$collection = CatalogSectionModel::query()
    ->setMethodGettingRecordInLoop(BaseIBlockQuery::METHOD_GETTING_FETCH)
    ->setOrder(['ID' => 'ASC'])
    ->setNPageSize(10)
    ->setINumPage(10)
    ->all();
$models = $collection->items();
foreach ($models as $model) {
    var_dump($model->fields);
    var_dump($model->props());
}

查询构建器的 all() 方法返回一个模型集合对象。

如果要选择单个模型,而不是使用 all() 方法,您可以使用 one() 方法,它将立即返回一个模型实例。

$model = CatalogSectionModel::query()
    ->setMethodGettingRecordInLoop(BaseIBlockQuery::METHOD_GETTING_FETCH)
    ->setOrder(['ID' => 'ASC'])
    ->setFilter(['ID' => 16])
    ->one();
var_dump($model->fields->xmlId);

查询构建器的 setMethodGettingRecordInLoop() 方法用于指定 Bitrix 选择数据的方法。方法参数的可能值:

  • BaseIBlockQuery::METHOD_GETTING_FETCH - 'Fetch'
  • BaseIBlockQuery::METHOD_GETTING_GET_NEXT - 'GetNext'
  • BaseIBlockQuery::METHOD_GETTING_GET_NEXT_ELEMENT - 'GetNextElement'

为 highload-块保存模型

对于 highload-块,请使用模型实例的 save() 方法。

为信息块、分区和用户保存模型

由于这些实体在数据库中的存储结构复杂,为了性能考虑,决定对这些模型不实现 save() 方法。在这些模型中,save() 方法包含返回 false 的代码占位符。您可以根据需要重写此方法。

删除模型

所有模型都有一个 delete() 方法用于删除。

如果您认为这个项目很有用,请考虑捐款。 捐款。所有捐款都将用于本项目的进一步发展。)