Телеграм: @bazarow_ru Почта: mihail@bazarow.ru

Получить все товары из всех заказов пользователя. История купленных товаров.

Просмотров: 2216

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

В целом точно также. В параметре сортировки указать по дате создания, что бы самый свежий (последний) был первым
Код
'order' = [ 'DATE' => 'DESC'],

А дальше дернуть только его из массива.
Владимир 11.11.2022
Цитата
написал:



                   
Цитата
Василий написал:
А как получить товары только из одного заказа? Из самого последнего хочу вывести товары.

В целом точно также. В параметре сортировки указать по дате создания, что бы самый свежий (последний) был первым
Код
 'order' = [ 'DATE' => 'DESC'],
 

А дальше дернуть только его из массива.
Добрый день !
А не подскажите как мне получить ID товаров из заказа по ID заказа , и если товаров больше чем 1 , то через запятую их вывести !
Заранее спасибо !
И хотел бы попросить небольшой хотя бы пример кода , так как не очень разбираюсь)
Михаил Базаров 11.11.2022
Как-то так. Сделал не проверяя, там напишите - если что то пойдет не так.
Код
$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);
}

Записная книжка разработчика

Примерно с 2013-го года пишу заметки по разработке сайтов на Битрикс.
Вы можете задавать уточняющие вопросы в комментариях- отвечаю или дополняю заметки по возможности.

Свойство: привязка к Яндекс:Картам - вывести из нескольких элементов ... Просмотров: 18668 Предположим, что у вас есть инфоблок со свойством "Привязка к яндекс картам". В этом инфоб... Вывести свойство отдельно ото всех или исключить из всех Просмотров: 7665 Иногда, на сайте, под управлением 1С-Битрикс, нужно вывести какое-то конкретное свойство о... Вывести компонент новостей на страницу в Битрикс Просмотров: 65107 Посмотрел Яндекс метрику на свой сайт, и решил что буду частенько писать сюда именно то, ч... Определить местоположение пользователя и показать на карте Просмотров: 3957 Задача определить местоположение текущего пользователя и показать его на карте, с меткой. ... Показ страницы сайта в боковом слайдере, на примере всплывающей формы... Просмотров: 3204 Если вы хотите сделать подгрузку любой страницы сайта в боковой слайдер, для этого в битри... Ссылка и название раздела в списке новостей Битрикс Просмотров: 11467 Если нужно вывести название раздела инфоблока в котором находится конкретный элемент/новос... Модифицировать состав заказа #ORDER_LIST# в почтовом событии "Новый з... Просмотров: 30308 Если вы хотите как-то по особенному сверстать состав заказа в почтовом уведомлении 1С-Битр... Моментальная фильтрация на AJAX в умном фильтре 1С-Битрикс Просмотров: 26773 При штатной установке, интернет-магазина на 1С Битрикс, умный фильтр по товарам, показывае... Вывести разделы инфоблока по первым буквам не меняя структуру каталог... Просмотров: 2503 Например: у нас есть инфоблок с большим количеством разделов. И мы хотим, на сайте разбить... Многосайтовость битрикс на разных доменах и поддоменах Просмотров: 63137 Часто спрашивают "как настроить многосайтовость Битрикс на разных доменах", решил записать... Cordova, ввод в input под диктовку. Голосовой поиск в мобильном прило... Просмотров: 1608 Итак, задачка: реализовать голосовой поиск в мобильном приложении на Cordova. По сути, нам... Цвета торговых предложений из Highload инфоблоков в списке товаров Просмотров: 14905 Подвернулся на доработку очень старый сайт, работал еще на 11-ой версии Битрикс. Выполнили... Если пользователь авторизован то... API Битрикс Просмотров: 23720 Достаточно часто, при создании сайта на битрикс нужно вывести в шаблон или компонент, неку... Удалить товары из корзины, если есть определенные товары. Просмотров: 1915 Задача: если в корзину добавлены товары с определенным свойством, нужно удалить из корзины... Создание блога с комментариями, оценками и просмотрами на сайте с 1С-... Просмотров: 24530 Если на вашем сайте требуется создание раздела с блогом или новостями, статьями. Записям в... Очистить брошенные корзины с помощью API 1С-Битрикс Просмотров: 1121 Задача: в интернет-магазине накапливается большое количество брошенных корзин, нужно их оч... Ленивая подгрузка картинок в компоненте, на vue js Битрикс Просмотров: 10349 Если на одну страницу сайта выводится большое количество картинок, которые могут долго под... Добавление в избранное или отложенные, на AJAX из карточки товара Просмотров: 29183 В этой заметке рассакажу как добавлять товары в "Отложенные", для иммитации функционала "И... Вывести все товары, с постраничной навигацией, из всех разделов инфоб... Просмотров: 29884 По сути, эта заметка, небольшой лайфхак. Достаточно часто нужно, в корне каталога, в ТОП-е... FTP доступ на Виртуальной машине Битрикс Просмотров: 17248 Бывает что нужно открыть FTP доступ к заранее известной папке на сайте под управлением 1С ...