- Сортировка товаров и показ выбранного пользователем количества товаров в 1С-Битрикс
- Количество товара на складе
- Как получить количество товара в каталоге в 1с Bitrix?
- Как вывести количество товаров на странице в фильтре битрикс?
- 1 ответ 1
- Всё ещё ищете ответ? Посмотрите другие вопросы с метками php битрикс или задайте свой вопрос.
- Похожие
- Подписаться на ленту
- Как вывести количество имеющихся в конкретном складе тех или иных товаров?
Сортировка товаров и показ выбранного пользователем количества товаров в 1С-Битрикс
Исторически так сложилось, что комплексный компонент 1С-Битрикс не позволяет пользователю в публичной части отсортировать товары, хотя бы по цене, дате, наименованию, а также выбрать сколько товаров на странице ему выбрать. Но ни один из интернет-магазинов не обходится без такого функционала, который кстати включен в почти все шаблоны готовых интернет-магазинов в Маркетплэйс. Но для реализовать блоки «Сортировать по: . » и «Показать по: . » достаточно просто. Нужно всего-лишь использовать массив $_REQUEST и метод API 1С-Битрикс GetCurPageParam() для передачи данных в этот массив.
Приступим!
Для начала определимся, что от нас хотят:
- Вывести справа над списком товаров блок «Показать по: 18 36 54 72». (По умолчанию выводится 9).
- Слева над списком товаров вывести блок «Сортировать по: цене, наименованию, дате».
- Повторное нажатие на уже выбранный вариант сортировки переключает направление сортировки.
- Дата — дата изменения, цена — отображаемая цена товара.
Пойдем по порядку и начнем с показа выбранного пользователем из предложенных количества товаров на странице.
За отображение количества товаров на странице отвечает параметр PAGE_ELEMENT_COUNT . В него мы и будем передавать выбранное пользователем количество с помощью $_REQUEST и GetCurPageParam() .
Для начала заведем соответствующую переменную и по-умолчанию присвоим ей значение заданное в параметрах компонента. А затем при клике пользователя на нужное ему количество элементов будем его модифицировать.
Следующий код предлагается размещать перед подключением компонента catalog.section . Если используется комплексный компонент catalog , то в файле в котором происходит вызов компонента catalog.section выводящего товары на нужной странице.
И теперь передадим полученное значение в компонент:
Теперь разберемся с сортировкой. Она не намного сложнее, за исключением того, что нам нужно проверять текущее направление и менять его. Для этого в методе GetCurPageParam() мы будем передавать два параметра sortBy и orderBy . А затем в соответствующих переменных передавать их в параметры компонента «ELEMENT_SORT_FIELD» и «ELEMENT_SORT_ORDER» соответственно. По умолчанию сортировка должна осуществляться с помощью внутреннего поля сортировки 1С-Битрикс — sort .
Проверяем направление сортировки и меняем в случае необходимости:
Выводим ссылки на сортировку:
Параметр name принимается полем «ELEMENT_SORT_FIELD» для сортировки по наименованию товара без дополнительного вмешательства а вот для даты и цены мы должны уточнить, какой из параметров элемента инфоблока мы имеем ввиду.
Для даты нам нужно значение поля ‘timestamp_x’ , отвечающего за дату изменения. Для цены мы должны узнать наименование типа цены, которая выводится из поля элемента инфоблока. Для этого нужно распечатать массив $arItem в шаблоне компонента (в моем случае catalog.section ) либо с помощью var_dump($arItem); , либо ‘; . Находим поле массива отвечающего за вывод цены и копируем его название, в моем случае это оказалось CATALOG_PRICE_1 . Стоит обратить внимание, что в случае с ценой использовать нужно название того поля, которые содержит значение цены без валюты.
И передадим полученные данные в переменную $sortBy :
И передадим значения в параметры компонента:
Вот собственно и все. В результате получится примерно такая строка:
Теперь пользователь может сортировать товары и выбирать сколько товаров он хочет видеть на странице, и разумеется переходить по страницам и фильтровать товары ничего не теряя.
Источник
Количество товара на складе
Илья Чернышов, здравствуйте!
А подробнее — на Ваш взгляд какой механизм необходимо использовать, чтобы получить доступ
к остаткам товара на складе?
Например, для шаблона catalog.section
конструкция вида
$ar_res = CCatalogProduct::GetByID($arElement[«ID»]);
print_r($ar_res);
в $ar_res[«QUANTITY»] возвращает 0 для всех строк выборки.
Значит этот подход не работает?
Возьмите и задайте какому-нибудь товару кол-во, например, 13.
Потом переходите на страницу с этим товаром и в шаблоне пишете строчку:
И смотрите у какой ячейки находится ваше кол-во 13. Именно с ней надо и работать. Просто не факт что кол-во будет именно в $ar_res[«QUANTITY»] она может быть например в каком-нибудь $ar_res[«QUANTITY_CATALOF_2»]
На мой взгляд вот так все.
Все просто, если структура каталога стоит из одного инфоблока КАТАЛОГ ТОВАРОВ.
Однако, если используется разделение с добавлением ПАКЕТА ПРЕДЛОЖЕНИЙ(когда есть спецификации по товару),
тогда не совсем корректно отрабатывает компонент CATALOG, в настройках которого присутствует ссылка на каталог товаров и связанный с ним инфоблок «пакет предложений», с полем связи CML2_link.
Замечу, что используется ТИПОВОЙ механизм, т.е. на уровне настроек параметров компонента, без углублений в Bitrix-API.
Результат не «Ах». в $arResult — нет поля CML2_link.
Однако, если воспользоваться конструкцией вида:
//$ID=»5359″; для товара в инфоблоке КАТАЛОГ ТОВАРОВ
$ID=»5359″;
$ar_res = CCatalogProduct::GetByIDEx($ID);
echo «
Товар с кодом «.$ID.» имеет следующие параметры:»;
//$ID=»18142″;для товара в инфоблоке ПАКЕТ ПРЕДЛОЖЕНИЙ
$ID=»18142″;
$ar_res = CCatalogProduct::GetByIDEx($ID);
echo «
Товар с кодом «.$ID.» имеет следующие параметры:»;
для $ID=»18142″ в $arResult будет ожидаемое поле связи CML2_link со своим VALUE для остатка товара на складе и ссылкой на ID товара в каталоге товаров.
Но в типовом шаблоне выборка идет сперва по инфоблоку каталога товаров, и это в шаблоне OFFERS, который и предназначен для работы в связке двух инфоблоков!
Буду признателен за идеи, как «руками» вытянуть значение остатка на складе(QUANTITY).
Источник
Как получить количество товара в каталоге в 1с Bitrix?
В шаблоне catalog.element нужно получить количество каждого товара из каталога. То есть я получил сейчас основные разделы каталога (пример ниже), но не могу посчитать количество товаров в каждой секции. У меня есть ID, но через команду ниже вовзращается false, проверял ID — такие существуют. Не понимаю как это сделать.
ПРИМЕР:
1. Розы (получил ID, нужно посчитать, что товара 2)
1.1 Красные
1.2 Белые
2. Тюльпаны (получил ID, нужно посчитать, что товара 2)
2.1 Синие
2.2 Желтые
- Вопрос задан более года назад
- 893 просмотра
Простой 1 комментарий
Юпитер Макс,
[«ID»]=> string(2) «19» [«TIMESTAMP_X»]=> string(19) «28.04.2020 13:33:24» [«MODIFIED_BY»]=> string(1) «1» [«DATE_CREATE»]=> string(19) «28.04.2020 00:09:20» [«CREATED_BY»]=> string(1) «1» [«IBLOCK_ID»]=> string(1) «3» [«IBLOCK_SECTION_ID»]=> NULL [«ACTIVE»]=> string(1) «Y» [«GLOBAL_ACTIVE»]=> string(1) «Y» [«SORT»]=> string(3) «500» [«NAME»]=> string(31) «Арахисовая паста» [«PICTURE»]=> string(3) «230» [«LEFT_MARGIN»]=> string(1) «1» [«RIGHT_MARGIN»]=> string(1) «2» [«DEPTH_LEVEL»]=> string(1) «1» [«DESCRIPTION»]=> string(0) «» [«DESCRIPTION_TYPE»]=> string(4) «text» [«SEARCHABLE_CONTENT»]=> string(33) «АРАХИСОВАЯ ПАСТА » [«CODE»]=> string(18) «arakhisovaya-pasta» [«XML_ID»]=> NULL [«TMP_ID»]=> NULL [«DETAIL_PICTURE»]=> NULL [«SOCNET_GROUP_ID»]=> NULL [«LIST_PAGE_URL»]=> string(19) «#SITE_DIR#/catalog/» [«SECTION_PAGE_URL»]=> string(39) «#SITE_DIR#/catalog/#SECTION_CODE_PATH#/» [«IBLOCK_TYPE_ID»]=> string(7) «catalog» [«IBLOCK_CODE»]=> string(7) «catalog» [«IBLOCK_EXTERNAL_ID»]=> NULL [«EXTERNAL_ID»]=> NULL
это все данные по одному пункту меню
Назар Горбунов, вот так попробуйте сделать запрос
Источник
Как вывести количество товаров на странице в фильтре битрикс?
Как вывести количество товаров на странице в битрикс? К примеру если мы находимся в catalog/odejda и там у нас 10 товаров. А если мы находимся в catalog/djinsi то там у нас 23 товара.
Мне нужно узнать количество в catalog.smart.filter что бы не выводить фильтр если на странице менее 5 товаров.
Наверное нужно делать что то с CIBlockSection::GetList и SelectedRowsCount(), но мне не хватает знаний для этого.
1 ответ 1
Компонент smart.filter в массив который указан в настройка компонента (по умолчанию это arrFilter) собирает массив в котором находятся параметры для фильтрации. Далее этот массив попадает в компонент catalog.section а в нём уже делает getList, в котором получается массив товаров для вывода с учётом остальных параметров. Поэтому если мы выполним getList с фильтром указанным в arrFilter, то получим список товаров по заданноve фильтру. А если мы передадим в параметре arGroupBy пустой массив, то функция вернёт количество товаров, которое мы и искали.
Итоговый код для комплексного компонента:
Всё ещё ищете ответ? Посмотрите другие вопросы с метками php битрикс или задайте свой вопрос.
Похожие
Подписаться на ленту
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
дизайн сайта / логотип © 2021 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2021.11.2.40635
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Источник
Как вывести количество имеющихся в конкретном складе тех или иных товаров?
Доброго времени суток!
Помогите мне пожалуйста разобраться, всю ночь провозился с задачей, так и не удалось реализовать, хотя в интернете много постов подобных видел и уже по всякому перепробовал, но почему-то так и не вышло 🙁
В общем, у меня имеется 3 склада. Также моя корзина наполнена 4мя товарами. Задача состоит в том, чтобы вывести количество каждого имеющегося в корзине товара в каждом из складов.
То есть как-то так:
Склад_№1:
— Товар_№1: Всего на складе №1 таких товаров №1: 1шт.
— Товар_№2: Всего на складе №1 таких товаров №2: 3шт.
— Товар_№3: Всего на складе №1 таких товаров №3: 7шт.
— Товар_№4: Всего на складе №1 таких товаров №4: 0шт.
Склад_№2:
— Товар_№1: Всего на складе №2 таких товаров №1: 11шт.
— Товар_№2: Всего на складе №2 таких товаров №2: 23шт.
— Товар_№3: Всего на складе №2 таких товаров №3: 2шт.
— Товар_№4: Всего на складе №2 таких товаров №4: 31шт.
Сам я пытался делать через запросы:
Но почему-то они возвращают мне как результат bool(false) значения. За исключением второго описанного мной запроса. Второй возвращает хоть что-то, какой то товар находит не из корзины. К слову, PRODUCT_ID’ >= 12391 — именно при таком раскладе срабатывает.
Скажите пожалуйста, что можно предпринять? Быть может я запрос все-таки неправильный подаю. поправьте меня пожалуйста.
- Вопрос задан более двух лет назад
- 3486 просмотров
Попробовал использовать \Bitrix\Catalog\StoreProductTable::getList
Вот таблица с данными
Вот запрос
У вас в запросе
‘=PRODUCT_ID’ >= 12391,
А это:
(‘=PRODUCT_ID’ >= 12391) === false
и в итоге фильтр принимает вид
array(false, ‘=STORE_ID’ >= 2)
Ой, а у меня почему-то в таблице b_catalog_store_product такие данные:
И результат, собственно таков:
Вот, видимо, почему у меня на любой мой запрос все это время выдавало пустоту, когда я пытался передавать ID товаров с корзины, которые отличаются от данного. и поэтому результатом выборки приходил false.
Правда, я не понимаю на самом деле, как «начиняется» данная таблица? за что она отвечает? Какую связь и с чем имеет? И непонятно также почему у меня всего-лишь один товар на 3 разных склада хранится.
И спасибо Вам за Ваш ответ!
Роман Грицук, А, все, я разобрался. Так, я там наблюдаю такую картину, что товар, который с (то есть тот, который удается вывести) — он действительно имеется на всех моих 3х складах и у него поле «Количество товара» как раз «забито» значениями, которые я не могу редактировать:
В то время, как товар который лежит у меня в корзине, с не имеет «забитых» значений и отредактировать их, я также не могу:
Ничего не понимаю. почему так происходит. Я же могу их выбрать на главной странице и добавить в корзину, а значит и должно быть их какое-то определенное «количество товара» на складе. Но почему же тогда там это поле пустеет у них..
К слову, у всех товаров, что имеются у меня в корзине это поле пустеет. почему же так происходит?
Роман Грицук, Я бы даже сказал, его походу изначально нет на складе (очень странно). Потому что я только что добавил в корзину один товар (от старых моих добавленных избавился), посмотрел ID только что добавленного моего товара и на всякий случай снова удалил его из корзины, ну а потом вбил его в поиск (фильтр) в разделе: Инфоблоки -> Инструменты -> Перейти к инфоблоку / элементу. И вот что у меня вышло:
Его просто нет на складах. И такое я сделал еще с несколькими товарами, которые добавил в корзину и не удалял оттуда. И все та же картина, пробив в поиске (фильтре) его ID, глядя на вкладку Торговый каталог -> Склады я вижу, что там он пустует на всех складах.
Тогда как же на главной странице они доступны для просмотра и добавления в корзину? Причем когда добавляю в корзину, я не могу более, чем 2 товара добавить в корзину, а где-то и вовсе 1.
К слову, заметил, что такое ограничение находится в параметрах:
Ужас, я запутался уже, почему доступное количество задано, а на складах их нет?! И я не понимаю как тогда вообще работает эта связь между товарами и складами в Битриксе.
Ужас, я запутался уже, почему доступное количество задано, а на складах их нет
Потому что количество товара на складе чисто информационное поле и оно не связано с доступным количеством товара.
Связь между складами и «Доступным количеством» «работает» только при включенном складском учёте.
Судя по вашему скриншоту он включен. Могу предположить, что изначально это было не так и товарам было заполнено количество товара руками через вкладку Торговый каталог -> Параметры.
Потом в настройках ИМ был включен складской учет. Но после включения товар на складах не появился, потому что и не должен был.
Чтобы товар добавить на склад надо зайти Магазин -> Складской учет -> Документы, и там создать документ о приходе товара на склад.
НО. складской учёт нельзя использовать при активной интеграции с 1С
Источник