Задача: нужно создать раздел, в персональном разделе пользователя, с историей всех купленных товаров. Не путать с историей заказов, нужен именно список всех купленных товаров- выведенный с помощью компонента 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' => ... // динамически определенные поля
));

Цитата |
---|
Василий написал: А как получить товары только из одного заказа? Из самого последнего хочу вывести товары. |
В целом точно также. В параметре сортировки указать по дате создания, что бы самый свежий (последний) был первым
Код |
---|
'order' = [ 'DATE' => 'DESC'], |
А дальше дернуть только его из массива.
А не подскажите как мне получить ID товаров из заказа по ID заказа , и если товаров больше чем 1 ,
то через запятую их вывести !
Заранее спасибо !
И хотел бы попросить небольшой хотя бы пример кода , так как не очень разбираюсь)

Код |
---|
$dbBasketItems = CSaleBasket::GetList( false, array( 'ORDER_ID' => ID НУЖНОГО ЗАКАЗА ), false, false, array( 'PRODUCT_ID' ) ); while ($arItems = $dbBasketItems->Fetch()) { $orderedItems[] = $arItems['PRODUCT_ID']; } // ВЫВОДИМ if(count($orderedItems) > 1) { // Если массив больше одного элемента // Выводим ID через запятую echo implode(', ',$orderedItems); } |

Цитата |
---|
Pyro338 написал: Михаил, наткнулся на этот пост, гугля немного другую задачу. а задача такая: мигрируем магазин с БУС на Б24 и в каких-то старых заказах у покупателей не заполнены обязательные поля. Но это не таблица users - это какая-то другая, смежная. может подскажете - какая?)) |
Должны бы в b_sale_order_props_value там значения всех свойств, которые заполнили покупатели.
Каждый заказ имеет уникальный идентификатор, который связывает значения свойств с соответствующим заказом.