Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

Выборка разделов по свойству товара

00 голосов
7
Привет всем!!! Новый вопрос!

Взят за основу Ваш файл SECTION_TOP.PHP из вывода контента каталога по разделам, в свойствах каталога введена переменная NEW со значениями либо ДА либо НЕ ВЫБРАНО (пусто), которое устанавливается вместе с другими характеристиками товара и определяет - новый товар или нет (НОВИНКА - задается менеджером).

Вопрос вот в чем, как выводить товар в разделе по свойству NEW я сделал, а вот как определить выводить раздел или нет по свойству товара NEW, не понял???

На данный момент ситуация такая, в разделе есть товар, но он не определен как НОВИНКА, а раздел все равно выводится (пустой, т.е. рисуется таблица, а в ней ничего нет), необходимо убрать раздел, если в нем нет НОВИНОК.

И попутно вопрос по функции IF... Выборку по НОВИНКЕ я сделал через

if (strlen($arProperty["NEW"]["VALUE"]) > 0): // если NEW = ДА, в противном случае NEW не определено...

Попытался сделать через

if ($arProperty["NEW"]["VALUE"] == "ДА"):

не получилось, что в данном случае я сделал не так???
спросил 30 Июль, 13 от Hellix (320 баллов)

7 Ответы

00 голосов
Добрый день, Игорь

Цитата
На данный момент ситуация такая, в разделе есть товар, но он не определен как НОВИНКА, а раздел все равно выводится (пустой, т.е. рисуется таблица, а в ней ничего нет), необходимо убрать раздел, если в нем нет НОВИНОК.


Предлагаю следующее решение: внутри цикла, имея ID группы, выбираем элементы внутри группы по фильтру:
Код
("!PROPERTY_NEW"=>false)

т.е. выбираем все элементы, для которых свойство установлено.
К примеру,
Код
$items = GetIBlockElementList($BID, $arSection["ID"], ... , Array("!PROPERTY_NEW"=>false));
if ($items->SelectedRowsCount):
echo "Section ".$arSection["NAME"];


Цитата
if (strlen($arProperty["NEW"]["VALUE"]) > 0):
if ($arProperty["NEW"]["VALUE"] == "ДА"):

Проще всего: выведите массив $arProperty
Код
echo "<pre>"; print_r($arProperty); echo "</pre>";

и на основании полученных данных сформируйте правильное условие :)
ответил 30 Июль, 13 от Damani (1,180 баллов)
00 голосов
Привет всем!
заработало после подстановки в само условие (снизу), но при этом возникла другая проблема, у меня происходит еще одна выборка по свойству BEST - товар недели, которое задается также как и NEW (выводится в том же формате, но в другом месте), проще было бы сделать 2 отделных section_top.PHP файла, на каждую выборку, но можно ли это сделать в одном файле, путем замены в GetIBlockElementListEx PROPERTY_NEW на PROPERTY_BEST

if ($rsElements = GetIBlockElementListEx($IBLOCK_TYPE, false, false, array($ELEMENT_SORT_FIELD => $ELEMENT_SORT_ORDER), $ELEMENT_COUNT, array("!PROPERTY_NEW"=>false, $arrFilter), $arSelect)):

С уважением.
Игорь.
ответил 27 Сен, 13 от Hellix (320 баллов)
00 голосов
Почему нет?
Вы можете передавать код свойства для выборки с помощью параметра, а затем использовать его.
Вызов компонента:
Код
<?$APPLICATION->IncludeFile
("iblock/catalog/sections_top.php", Array(
...
   "FILTER_PROPERTY"   =>   "NEW",


И затем
Код
if ($rsElements = GetIBlockElementListEx($IBLOCK_TYPE, false, false, array($ELEMENT_SORT_FIELD => $ELEMENT_SORT_ORDER), $ELEMENT_COUNT, array("!PROPERTY_".$FILTER_PROPERTY=>false, $arrFilter), $arSelect)): 
ответил 28 Дек, 13 от Damani (1,180 баллов)
00 голосов
Ну я уже добился своего, тем же путем, что Вы описали, но с маленьким отличием, вместо "!PROPERTY_".$FILTER_PROPERTY=>false я написал "!$FILTER_PROPERTY"=>false, а сам FILTER_PROPERTY определил в массиве, как и остальные переменные для каждого случая.

Вот. Теперь встала другая проблема... Как определить путь вложенности каждого товара по разделам, т.е. определять не с головы (корня папки), а плясать от товара, есть товар и он на конце какой-то ветви, как эту ветвь определить. Это необходимо для составления наименования товара, поясню - например батарейка R20 находится в подкатегориях:

ЭЛЕМЕНТ ПИТАНИЯ....I \
\———> БАТАРЕЙКА....I > части дерева
\————>СОЛЕВАЯ....I /
\—————> R20........=> артикул

в итоге все части дерева должны быть в массиве, откуда они вставляются в публичную часть для вывода полного наименования товара:

ЭЛЕМЕНТ ПИТАНИЯ —БАТАРЕЙКА, СОЛЕВАЯ РАЙДЕР (торговая марка) R20,

все это надо для уменьшения набивки при заполнении каталога и для унификации, поскольку товар в основном отличается артикулом, в котором и забита конечная (основная) информация.
Короче надо для каждого товара взять группу разделов (кроме "Верхнего уровня") определяемую при его забивке в каталог. Я конечно попробую поиграться с Вашим Section_2.PHP, поскольку там есть массив для вывода дерева, но можно ли его брать за основу, пока не знаю, может Вы посоветуете что-то более конструктивное...

С уважением.
Игорь.


P.S. да и еще, если это возможно, то определять все разделы для первого элемента находящегося в разделе, т.е. для других товаров находящихся в этом же разделе функцию построения массива пропускать и присваивать весь массив остальным элементам этого же раздела, естественно для разгрузки процессора...
ответил 13 Апр, 14 от Hellix (320 баллов)
00 голосов
Добрый день, Игорь

Чтобы получить цепочку вложенных разделов/групп для элемента, воспользуйтесь функцией GetIBlockSectionPath().
В качестве параметров она принимает ID инфоблока и ID группы-"листочка", последней в иерархии (вы можете получить ее из массива полей элемента).
Пример использования:
Код
$rsPath = GetIBlockSectionPath($IBLOCK_ID, $SECTION_ID);
while($arPath=$rsPath->GetNext()) 
   $arrPath[] = array("ID" => $arPath["ID"], "NAME" => $arPath["NAME"]);

if (is_array($arrPath))
{
   while(list($key, $arS) = each($arrPath))
   {
      $APPLICATION->AddChainItem($arS["NAME"], $SECTION_URL."SECTION_ID=".$arS["ID"]);
   }
}
ответил 06 Авг, 14 от Damani (1,180 баллов)
00 голосов
Цитата
P.S. да и еще, если это возможно, то определять все разделы для первого элемента находящегося в разделе, т.е. для других товаров находящихся в этом же разделе функцию построения массива пропускать и присваивать весь массив остальным элементам этого же раздела, естественно для разгрузки процессора...


Тогда, конечно, и вызывать эту функцию следует не для элементов, а для раздела/группы, в который эти элементы входят.
ответил 10 Дек, 14 от Damani (1,180 баллов)
00 голосов
Спасибо огромное, получилось, правда не сразу въехал куда все это пихать, но, как говорится, методом научного тыка добился результата.
Пришлось убрать вызов функции $APPLICATION->AddChainItem($arS["NAME"], $SECTION_URL."SECTION_ID=".$arS["ID"]);, иначе сверху такой список выскакивал, а просто воспользовался выводом переменной $arS["NAME"], ну и вместо $SECTION_ID поставил $arElement["IBLOCK_SECTION_ID"]), поскольку внутри везде $SECTION_ID = 0.
Еще раз ОГРОМНОЕ СПАСИБО.
ЕСТЬ ПРАВДА ОДНО ПОЖЕЛАНИЕ... набудущее... по возможности давать побольше комментариев к коду и особенно к переменным, а то не сразу понятно, и приходится их выводить чтобы понять, что они содержат.
Еще раз СПАСИБО!!!
Игорь.
P.S. у меня там еще один вопрос в форуме - КАК ПЕРЕДАТЬ КОНСТАНТУ???, может я ее неправильно назвал константой, но суть не в этом. Посмотрите пожалуйста мой вопрос!!!
ответил 01 Апр, 15 от Hellix (320 баллов)

Похожие вопросы

0 голосов
4 ответов
спросил 25 Янв, 14 от Lata (220 баллов)
0 голосов
4 ответов
спросил 04 Авг, 13 от Kalika (140 баллов)
0 голосов
6 ответов