Доброго времени суток!
Уважаемые профи Битрикса, помогите решить задачу:
Есть Тип инфоблоков (1c_catalog) с несколькими Инфоблоками внутри. В каждом ИБ есть свойство DATE_IMPORT типа datetime. Необходимо выбрать первые 10 элементов из всех ИБ, отсортированных по свойству DATE_IMPORT по возрастанию. Свойства хранятся в отдельных таблицах для каждого ИБ.
Моих умений хватило, чтобы на D7 приджойнить данные свойства, но вот сделать их сортировку не получилось.
Вот Мой код:
У меня была идея создать динамически-высчитываемое поле DATE_IMPORT и сортировать по нему. Но заполняется оно некорректно. На выходе имеем следующий результат:
Т.е. в результатах есть данные по DATE_IMPORT каждого конкретного элемента, но объединить эти данные в одно поле для сортировки уже не получается. Есть ли "Умы", которые с этим разберутся? Интересует именно вариант запроса на D7, без создания отдельных сущностей, и копирования данных. В идеале 1им запросим.
Уважаемые профи Битрикса, помогите решить задачу:
Есть Тип инфоблоков (1c_catalog) с несколькими Инфоблоками внутри. В каждом ИБ есть свойство DATE_IMPORT типа datetime. Необходимо выбрать первые 10 элементов из всех ИБ, отсортированных по свойству DATE_IMPORT по возрастанию. Свойства хранятся в отдельных таблицах для каждого ИБ.
Моих умений хватило, чтобы на D7 приджойнить данные свойства, но вот сделать их сортировку не получилось.
Вот Мой код:
use Bitrix\Main, Bitrix\Main\Loader, Bitrix\Iblock\ElementTable, Bitrix\Main\Entity; require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php"); class CUpdateOldestProducts { const IBLOCK_TYPE = "1c_catalog"; const IBLOCK_DATE_IMPORT_PROPERTY_CODE = "DATE_IMPORT"; private $iNPageSize = 10; private $arIblockData = array(); private $arIblockIds = array(); /** * Подключаем модули. Формируем необходимые данные * * CUpdateOldestProducts constructor. * @param int $iTopCount */ public function __construct($iTopCount = 10) { try { Loader::IncludeModule("iblock"); } catch (Exception $obException) { \AddMessage2Log($obException->getMessage(), "iblock"); return false; } $rsIblock = \CIBlock::GetList( array("SORT"=>"ASC"), array( "TYPE" => self::IBLOCK_TYPE, "ACTIVE" => "Y", ) ); while ($arIblock = $rsIblock->Fetch()) { $this->arIblockIds[] = $arIblock["ID"]; $rsDataImportProp = \CIBlockProperty::GetList( array( "sort" => "asc", "name" => "asc" ), array( "ACTIVE" => "Y", "IBLOCK_ID" => $arIblock["ID"], "CODE" => self::IBLOCK_DATE_IMPORT_PROPERTY_CODE ) ); if ($arDataImportProp = $rsDataImportProp->GetNext()) { $this->arIblockData[] = array( "IBLOCK_ID" => $arIblock["ID"], $arDataImportProp["CODE"] . "_IBLOCK_PROPERTY_ID" => $arDataImportProp["ID"] ); } } $this->iNPageSize = $iTopCount; return true; } /** * Метод выбирает N товаров с самой старой датой импорта и вызывает для каждого из них метод updateGood * * @return bool */ public function execute() { $arRunTime = array(); $arSubFilter = array(); $arSelect = array( "ID", "XML_ID", "IBLOCK_ID", "DATE_IMPORT" ); foreach ($this->arIblockData as &$arData) { try { // Описываем сущность таблицы со свойством Даты импорта для каждого ИБ. $obEntityPropDateImport = Entity\Base::compileEntity( "DATE_IMPORT" . $arData["IBLOCK_ID"], [ "IBLOCK_ELEMENT_ID" => [ "data_type" => "integer" ], "PROPERTY_" . $arData[self::IBLOCK_DATE_IMPORT_PROPERTY_CODE . "_IBLOCK_PROPERTY_ID"] => [ "data_type" => "datetime" ], ], [ "table_name" => sprintf("b_iblock_element_prop_s%s", $arData["IBLOCK_ID"]), ] ); $arSelect[] = "DATE_IMPORT" . $arData["IBLOCK_ID"] . ".*"; $arSubFilter["!DATE_IMPORT".$arData["IBLOCK_ID"].".PROPERTY_".$arData[self::IBLOCK_DATE_IMPORT_PROPERTY_CODE . "_IBLOCK_PROPERTY_ID"]] = false; try { // Джойним таблицу со свойствами $arRunTime[] = new Entity\ReferenceField( "DATE_IMPORT" . $arData["IBLOCK_ID"], $obEntityPropDateImport, array( "=this.ID" => "ref.IBLOCK_ELEMENT_ID" ), array( "join_type" => "LEFT" ) ); // Заполняем свойство Даты импорта, конвертируя в число для дальнейшей сортировки по нему $arRunTime[] = new Entity\ExpressionField( "DATE_IMPORT", "%s", array( "DATE_IMPORT".$arData["IBLOCK_ID"] . "." . "PROPERTY_".$arData[self::IBLOCK_DATE_IMPORT_PROPERTY_CODE."_IBLOCK_PROPERTY_ID"] ) ); } catch (Main\ArgumentException $obException) { \AddMessage2Log($obException->getMessage(), "main"); return false; } } catch (Main\ArgumentException $obException) { \AddMessage2Log($obException->getMessage(), "main"); return false; } } $arFilter = array( "IBLOCK_ID" => $this->arIblockIds, $arSubFilter = array_merge($arSubFilter, array("LOGIC" => "OR")) ); try { $rsElements = ElementTable::getList([ "select" => $arSelect, "filter" => $arFilter, "order" => [ "DATE_IMPORT" => "ASC" ], "limit" => $this->iNPageSize, "runtime" => $arRunTime ]); while ($arElement = $rsElements->fetch()) { echo"<pre>";print_r($arElement);echo"</pre>"; // TODO: вызвать метод updateGood } } catch (Main\ArgumentException $obException) { \AddMessage2Log($obException->getMessage(), "main"); return false; } return true; } } $obUpdateOldestProduct = new \CUpdateOldestProducts(10); $obUpdateOldestProduct->execute(); |
У меня была идея создать динамически-высчитываемое поле DATE_IMPORT и сортировать по нему. Но заполняется оно некорректно. На выходе имеем следующий результат:
Array ( [ID] => 30938 [XML_ID] => 2263 [IBLOCK_ID] => 26 [DATE_IMPORT] => [IBLOCK_ELEMENT_DATE_IMPORT24_IBLOCK_ELEMENT_ID] => [IBLOCK_ELEMENT_DATE_IMPORT24_PROPERTY_2387] => [IBLOCK_ELEMENT_DATE_IMPORT21_IBLOCK_ELEMENT_ID] => [IBLOCK_ELEMENT_DATE_IMPORT21_PROPERTY_2386] => [IBLOCK_ELEMENT_DATE_IMPORT26_IBLOCK_ELEMENT_ID] => 30938 [IBLOCK_ELEMENT_DATE_IMPORT26_PROPERTY_2388] => 2018-11-30 13:29:00 [IBLOCK_ELEMENT_DATE_IMPORT27_IBLOCK_ELEMENT_ID] => [IBLOCK_ELEMENT_DATE_IMPORT27_PROPERTY_2389] => [IBLOCK_ELEMENT_DATE_IMPORT28_IBLOCK_ELEMENT_ID] => [IBLOCK_ELEMENT_DATE_IMPORT28_PROPERTY_2390] => [IBLOCK_ELEMENT_DATE_IMPORT29_IBLOCK_ELEMENT_ID] => [IBLOCK_ELEMENT_DATE_IMPORT29_PROPERTY_2391] => [IBLOCK_ELEMENT_DATE_IMPORT30_IBLOCK_ELEMENT_ID] => [IBLOCK_ELEMENT_DATE_IMPORT30_PROPERTY_2392] => [IBLOCK_ELEMENT_DATE_IMPORT106_IBLOCK_ELEMENT_ID] => [IBLOCK_ELEMENT_DATE_IMPORT106_PROPERTY_2395] => [IBLOCK_ELEMENT_DATE_IMPORT107_IBLOCK_ELEMENT_ID] => [IBLOCK_ELEMENT_DATE_IMPORT107_PROPERTY_2396] => [IBLOCK_ELEMENT_DATE_IMPORT108_IBLOCK_ELEMENT_ID] => [IBLOCK_ELEMENT_DATE_IMPORT108_PROPERTY_2397] => [IBLOCK_ELEMENT_DATE_IMPORT109_IBLOCK_ELEMENT_ID] => [IBLOCK_ELEMENT_DATE_IMPORT109_PROPERTY_2398] => [IBLOCK_ELEMENT_DATE_IMPORT38_IBLOCK_ELEMENT_ID] => [IBLOCK_ELEMENT_DATE_IMPORT38_PROPERTY_2393] => [IBLOCK_ELEMENT_DATE_IMPORT40_IBLOCK_ELEMENT_ID] => [IBLOCK_ELEMENT_DATE_IMPORT40_PROPERTY_2394] => ) Array ( [ID] => 46752 [XML_ID] => 2488 [IBLOCK_ID] => 24 [DATE_IMPORT] => 2018-11-07 13:30:00 [IBLOCK_ELEMENT_DATE_IMPORT24_IBLOCK_ELEMENT_ID] => 46752 [IBLOCK_ELEMENT_DATE_IMPORT24_PROPERTY_2387] => 2018-11-07 13:30:00 [IBLOCK_ELEMENT_DATE_IMPORT21_IBLOCK_ELEMENT_ID] => [IBLOCK_ELEMENT_DATE_IMPORT21_PROPERTY_2386] => [IBLOCK_ELEMENT_DATE_IMPORT26_IBLOCK_ELEMENT_ID] => [IBLOCK_ELEMENT_DATE_IMPORT26_PROPERTY_2388] => [IBLOCK_ELEMENT_DATE_IMPORT27_IBLOCK_ELEMENT_ID] => [IBLOCK_ELEMENT_DATE_IMPORT27_PROPERTY_2389] => [IBLOCK_ELEMENT_DATE_IMPORT28_IBLOCK_ELEMENT_ID] => [IBLOCK_ELEMENT_DATE_IMPORT28_PROPERTY_2390] => [IBLOCK_ELEMENT_DATE_IMPORT29_IBLOCK_ELEMENT_ID] => [IBLOCK_ELEMENT_DATE_IMPORT29_PROPERTY_2391] => [IBLOCK_ELEMENT_DATE_IMPORT30_IBLOCK_ELEMENT_ID] => [IBLOCK_ELEMENT_DATE_IMPORT30_PROPERTY_2392] => [IBLOCK_ELEMENT_DATE_IMPORT106_IBLOCK_ELEMENT_ID] => [IBLOCK_ELEMENT_DATE_IMPORT106_PROPERTY_2395] => [IBLOCK_ELEMENT_DATE_IMPORT107_IBLOCK_ELEMENT_ID] => [IBLOCK_ELEMENT_DATE_IMPORT107_PROPERTY_2396] => [IBLOCK_ELEMENT_DATE_IMPORT108_IBLOCK_ELEMENT_ID] => [IBLOCK_ELEMENT_DATE_IMPORT108_PROPERTY_2397] => [IBLOCK_ELEMENT_DATE_IMPORT109_IBLOCK_ELEMENT_ID] => [IBLOCK_ELEMENT_DATE_IMPORT109_PROPERTY_2398] => [IBLOCK_ELEMENT_DATE_IMPORT38_IBLOCK_ELEMENT_ID] => [IBLOCK_ELEMENT_DATE_IMPORT38_PROPERTY_2393] => [IBLOCK_ELEMENT_DATE_IMPORT40_IBLOCK_ELEMENT_ID] => [IBLOCK_ELEMENT_DATE_IMPORT40_PROPERTY_2394] => ) |
Т.е. в результатах есть данные по DATE_IMPORT каждого конкретного элемента, но объединить эти данные в одно поле для сортировки уже не получается. Есть ли "Умы", которые с этим разберутся? Интересует именно вариант запроса на D7, без создания отдельных сущностей, и копирования данных. В идеале 1им запросим.