fibit/bitrix-entity-helper

Bitrix 框架的实体助手类

v1.0.0 2024-04-30 12:19 UTC

This package is auto-updated.

Last update: 2024-09-30 13:11:39 UTC


README

Bitrix 实体便捷助手。
助手能够处理信息块、Highload 块和系统表中的数据。

安装

  1. 通过 composer 安装
composer require fibit/bitrix-entity-helper
  1. 添加自动加载器连接
require_once $_SERVER["DOCUMENT_ROOT"] . "/path/to/vendor/autoload.php";

方法

重要

entity可以有以下三种类型之一

  1. int - 用于普通信息块
  2. string - 用于 Highload 块
  3. object - 用于系统实体

示例

1. getClass 方法

use \Fibit\EntityHelper as EH;

EH::getClass(1);
// Результат: \Bitrix\Iblock\Elements\ElementOffersTable

EH::getClass("Data");
// Результат: \DataTable

EH::getClass(new \Bitrix\Main\UserTable);
// Результат: \Bitrix\Main\UserTable

2. getQuery 方法

该方法支持调用ExpressionFieldReferenceField

use \Fibit\EntityHelper as EH;

EH::getQuery(
  new \Bitrix\Main\UserTable,
  array(
    "select" => array("SHORT_NAME", "EMAIL"),
    "filter" => array("=ACTIVE" => "Y"),
    "order" => array("LAST_ACTIVITY_DATE" => "DESC"),
    "limit" => 100,
  )
);

结果

SELECT 
  CONCAT(`main_user`.`LAST_NAME`, ' ', UPPER(SUBSTR(`main_user`.`NAME`, 1, 1)), '.') AS `SHORT_NAME`,
  `main_user`.`EMAIL` AS `EMAIL`
FROM `b_user` `main_user` 
WHERE `main_user`.`ACTIVE` = 'Y'
ORDER BY `main_user`.`LAST_ACTIVITY_DATE` DESC
LIMIT 0, 100

3. getRows 方法

该方法支持调用ExpressionFieldReferenceField

use \Fibit\EntityHelper as EH;

EH::getRows(
  new \Bitrix\Main\UserTable,
  array(
    "select" => array("SHORT_NAME", "EMAIL"),
    "filter" => array("=ACTIVE" => "Y"),
    "order" => array("LAST_ACTIVITY_DATE" => "DESC"),
    "limit" => 100,
  )
);

结果

Array(
  [result] => Array(
    [0] => Array(
      [SHORT_NAME] => Иванов И.
      [EMAIL] => ivanov@example.com
    )
    [1] => Array(
      [SHORT_NAME] => Петров П.
      [EMAIL] => petrov@example.com
    )
    ...
    [99] => Array(
      [SHORT_NAME] => Сидоров С.
      [EMAIL] => sidorov@example.com
    )
  )
  [count] => 100
  [nav] => 
  [time] => 0.010181903839111
)

3.1. 分页导航

如果将方法中的参数count_total => true设置为true,则查询执行的结果将返回一个nav对象。该对象可以用于组件bitrix:main.pagenavigation以显示分页导航。默认将加载20条记录,但可以通过在调用方法时指定不同的limit值来更改此值。

use \Fibit\EntityHelper as EH;

$data = EH::getRows(
  new \Bitrix\Main\UserTable,
  array(
    "count_total" => true,
    ...
    "limit" => 20
  )
);
<?$APPLICATION->IncludeComponent(
  "bitrix:main.pagenavigation",
  "",
  array(
    "NAV_OBJECT" => $data["nav"],
    "SEF_MODE" => "N"
  ),
  true
);?>

重要

导航链中的当前页是根据URL中的数据确定的,因此在使用表单(例如,用于过滤)的情况下,应通过GET方法发送表单。

3.2. 与 ExpressionField 交互的示例

例如,我们有一个名为“Operations”的 highload 信息块,结构如下

我们需要获取每个 UF_MEMBERUF_SUM 上的总和,时间范围从 01.01.24 00:00 到 01.01.24 23:59

use \Fibit\EntityHelper as EH;

EH::getRows(
  "Operations",
  array(
    "select" => array("UF_MEMBER", "EF_SUM"),
    "filter" => array(
      "><UF_DATETIME" => array(
        "01.01.2024 00:00:00",
        "01.01.2024 23:59:59"
      )
    ),
    "runtime" => array(
      new \Bitrix\Main\Entity\ExpressionField(
        "EF_SUM",
        "SUM(%s)",
        "UF_SUM"
      )
    )
  )
);

结果

Array(
  [result] => Array(
    [0] => Array(
      [UF_MEMBER] => Иванов И.
      [EF_SUM] => 200
    )
    [1] => Array(
      [UF_MEMBER] => Петров П.
      [EF_SUM] => 100
    )
  )
  [count] => 2
  [nav] => 
  [time] => 0.020122900039128
)

4. getRow 方法

该方法支持调用ExpressionFieldReferenceField

use \Fibit\EntityHelper as EH;

EH::getRow(
  new \Bitrix\Main\UserTable,
  array(
    "select" => array("SHORT_NAME", "EMAIL"),
  )
);

结果

Array(
  [result] => Array(
    [SHORT_NAME] => Иванов И.
    [EMAIL] => ivanov@example.com
  )
  [time] => 0.0097489356994629
)

5. addRow 方法

use \Fibit\EntityHelper as EH;

EH::addRow(
  "Data",
  array(
    "UF_NAME" => "Row 1",
    "UF_XML_ID" => "row-1",
  )
);

结果

Array(
  [result] => 1 // ID элемента
  [time] => 0.005182203839221
)

6. updRow 方法

use \Fibit\EntityHelper as EH;

EH::updRow(
  "Data",
  1, // ID обновляемого элемента
  array(
    "UF_NAME" => "Row 2",
  )
);

结果

Array(
  [result] => 1 // ID элемента
  [time] => 0.004221103835001
)

7. delRow 方法

use \Fibit\EntityHelper as EH;

EH::delRow(
  "Data",
  1, // ID удаляемого элемента
);

结果

Array(
  [result] => true
  [time] => 0.001111100000001
)