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

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

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

Стоимость разработки на 1С-Битрикс:

Индивидуальная разработка магазина

от 400 000 руб. от 5-ти недель

Разработка магазина на 1С-Битрикс с нуля. Дизайн, сборка и оптимизация производительности под конкретный проект и требования. Реализация любого функционала без ограничений готовых решений.

Запуск сайта на готовом решении

от 100 000 руб. от 7-ми дней

Вариант для тех, кто не хочет тратить много средств на индивидуальный проект, и не имеет серьезных требований к сайту. Магазин, быстро запускается на базе одного из 200-та готовых решений.

Мобильное приложение

от 400 000 руб. от 1-го месяца

Разработка кроссплатформенного мобильного приложения, которое не уступает нативным решениям как в производительности, так и пользовательском опыте. Публикуется в AppStore, GooglePlay и RuStore

Сайт компании

от 250 000 руб. от 1-го месяца

Корпоративный сайт с информационными разделами, каталогом товаров или услуг. Включает формы обратной связи карточек каталога, любое количество статичных и динамичных разделов.

Инфресурс

от 300 000 руб. от 5-ти недель

Информационный ресурс любой сложности. Сайт для СМИ, городской портал или многопользовательская доска объявлений. Внутренние форумы, блоги- по необходимости.

Лечение сайтов от вирусов

от 30 000 руб. от 2-х дней

Выполню полную проверку сайта и окружения. В случае обнаружения вирусов проведу полный комплекс лечения проекта и закрытия лазеек.