Задача: нужно создать раздел, в персональном разделе пользователя, с историей всех купленных товаров. Не путать с историей заказов, нужен именно список всех купленных товаров- выведенный с помощью компонента catalog.section. Что бы пользователь мог добавить любой товар в новый заказа.
Все, что нам нужно, это получить ID всех товаров из всех заказов пользователя и воспользоваться фильтром, над catalog.section
$GLOBALS['arrFilter'] = array("=ID" => (ЗДЕСЬ МАССИВ С ID ТОВАРОВ));
$APPLICATION->IncludeComponent(
"bitrix:catalog.section",
"section",
array(
.... сокращен вывод catalog.section ...
"FILTER_NAME" => "arrFilter",
.... сокращен вывод catalog.section ...
)
);
}
Получаем ID товаров из всех заказов пользователя. Old-Way без D7
Собственно вот весь код, для формирования массива с ID всех товаров из всех заказов пользователя:
$db_sales = CSaleOrder::GetList(
false,
array(
'USER_ID' => $USER->GetID(),
),
array(
'ID'
)
);
while ($ar_sales = $db_sales->Fetch()) {
$dbBasketItems = CSaleBasket::GetList(
false,
array(
'ORDER_ID' => $ar_sales['ID']
),
false,
false,
array(
'PRODUCT_ID'
)
);
while ($arItems = $dbBasketItems->Fetch()) {
$orderedItems[] = $arItems['PRODUCT_ID'];
}
}
$GLOBALS['arrFilter'] = array("ID" => (array_unique($orderedItems)));
- С помощью CSaleOrder::GetList получили ID всех заказов текущего пользователя: фильтром 'USER_ID' => $USER->GetID(),
- Внутри цикла перебора заказов методом CSaleBasket::GetList получили ID всех товаров конкретного заказа, наполнив массив $orderedItems
- Примениили массив в фильтре, что бы в нем были только уникальные товары (так как товары могут повторяться в разных заказах) перебрали массив с помощью array_unique
array_unique: Убирает повторяющиеся значения из массива
Здесь код с минимальными настройками. Он соберет все товары, со всех заказов- даже, только что созданных и не оплаченных. Если хотите отобрать заказы по статусам, например только находящиеся в статусе F (выполнен): добавляем в фильтрацию 'STATUS_ID' => 'F'.
Получаем ID товаров из всех заказов пользователя. New-Way c D7
Ну и, по сути тоже самое, с использанием нового ядра D7. Нагрузка, в плане количества запросов и скорости работы одинаковая. Потому, использовать лучше этот код:
use Bitrix\Sale;
$dbResOrders = \Bitrix\Sale\Order::getList([
'select' => [
'ID'
],
'filter' => [
"USER_ID" => $USER->GetID(),
]
]);
while ($order = $dbResOrders->fetch()) {
$dbResItems = \Bitrix\Sale\Basket::getList([
'select' => [
'PRODUCT_ID'
],
'filter' => [
'=ORDER_ID' => $order['ID'],
],
]);
while ($item = $dbResItems->fetch()) {
$orderedItems[] = $item['PRODUCT_ID'];
}
}
$GLOBALS['arrFilter'] = array("ID" => (array_unique($orderedItems)));
- С помощью \Bitrix\Sale\Order::getList получили ID всех заказов текущего пользователя: фильтром 'USER_ID' => $USER->GetID(),
- Внутри цикла перебора заказов, с \Bitrix\Sale\Basket::getList получили ID всех товаров конкретного заказа, наполнив массив $orderedItems
- Примениили массив в фильтре, что бы в нем были только уникальные товары (так как товары могут повторяться в разных заказах) перебрали массив с помощью array_unique
Здесь, ровно тоже самое. Можете добавлять дополнительные фильтры и способы отбора, сортировки и группировки в API getList
На всякий случай, шпаргалка, по параметрам из документации:
METHOD::getList(array(
'select' => ... // имена полей, которые необходимо получить в результате
'filter' => ... // описание фильтра для WHERE и HAVING
'group' => ... // явное указание полей, по которым нужно группировать результат
'order' => ... // параметры сортировки
'limit' => ... // количество записей
'offset' => ... // смещение для limit
'runtime' => ... // динамически определенные поля
));