Jump to content
  • 0

Все ID производителей для секции


rus
 Share

Question

На странице со списком товаров(catalog.section) нужно получить все ID тех производителей, товары которых расположены в этой секции.

Так как на странице товаров много, то включена была пагинация и получается так, что на одной странице товары могут быть например APC HP OKI, а на другой странице Brother Panasonic Xerox.

Как обойти эту пагинацию и добыть все ID производителей, которые есть в этой секции?

У меня получилось только для страницы сделать:


<?foreach($arResult["ITEMS"] as $cell=>$arElement):?>
<?foreach($arElement["DISPLAY_PROPERTIES"] as $pid=>$arProperty):?>
<?if($pid=="VENDOR"):?>
<?foreach($arProperty["VALUE"] as $VendorId):?>
<?
if(CModule::IncludeModule("iblock")) {
$items = GetIBlockElementListEx("catalog", "vendors", Array(),
Array("DATE_ACTIVE_FROM"=>"DESC", "SORT"=>"ASC", "NAME" => "ASC"));
while($arItem = $items->GetNext()) {
if($arItem["ID"] == $VendorId) {
echo $VendorId; // это ID производителя
echo $arItem["ID"]; // это ID я так понял группы товаров. Оба ID совпадают.
}
}
}
?>
<?endforeach?>
<?endif;?>
<?endforeach?>
<?endforeach?>

Link to comment
Share on other sites

14 answers to this question

Recommended Posts

  • 0

ID инфоблока известен? ID раздела известен?

полагаю, да.

Это же в компоненте каталога всё происходит?

Тогда в result_modifier.php пишется выборка на основе ID инфоблока и ID раздела, и добавляется в $arResult.

Link to comment
Share on other sites

  • 0

ID инфоблока известен? ID раздела известен?

полагаю, да.

Это же в компоненте каталога всё происходит?

Тогда в result_modifier.php пишется выборка на основе ID инфоблока и ID раздела, и добавляется в $arResult.

1) Инфоблок положем один и явно указать его ID можно, но вот разделов много, не буду же я для каждого раздела указывать явно его ID?

2) файла result_modifier.php попросту нету.

3) какой ф-ей API делать выборку?

Link to comment
Share on other sites

  • 0

Зачем указывать явно то, что есть в $arParams?

Зачем указывать явно то, что есть в $arResult?

Файл result_modifier.php создаётся в каталоге шаблона компонента. В случае его наличия массив $arResult модифицируется в соответствии с логикой, описанной в этом файле.

в template.php попадает уже модифицированный массив $arResult.

3) какой ф-ей API делать выборку?

http://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockelement/getlist.php

Link to comment
Share on other sites

  • 0

спасибо, но я уже решил данный вопрос вот таким вот образом (не знаю на сколько это "религиозно", но те не менее все работает):

в tamplate.php catalog.section


<?
if (CModule::IncludeModule("iblock")) {
$items = GetIBlockElementListEx("catalog", "6",
Array(),
Array("NAME" => "ASC"),
0,
Array("SECTION_ID" => $arResult["ID"], "INCLUDE_SUBSECTIONS" =>"Y"),
Array("PROPERTY_VENDOR"));

while ($arItem = $items->GetNext()) {
$arrItemM[] = $arItem["PROPERTY_VENDOR_VALUE"];
}

$items = GetIBlockElementListEx("catalog", "vendors",
Array(),
Array("NAME" => "DESC"),
0,
Array("ID" => $arrItemM));
echo '<ul class="vendors">';
while ($arItem = $items->GetNext()) {
if ($arItem["PREVIEW_PICTURE"]) {
echo '<li><a href="?arrFilter_pf[VENDOR]='.$arItem["ID"].'&set_filter=Подобрать&set_filter=Y">'.ShowImage($arItem["PREVIEW_PICTURE"], 100, 100, "border='0'").'</a></li>';
} else {
echo '<li><a href="?arrFilter_pf[VENDOR]='.$arItem["ID"].'&set_filter=Подобрать&set_filter=Y">'.$arItem["NAME"].'</a></li>';
}
}
echo '</ul>';
}
?>

Link to comment
Share on other sites

  • 0

Религиозность тут совсем ни при чём. Как раз сейчас у нас сотрудник третий день мучается, пытаясь понять, что имел в виду разработчик сайта, свалившегося на поддержку.

Там тоже всё работает, но внести минимальную правку оказалось недопустимо сложно. Сотрудник поддержки уже близок к состоянию психопата, склонного к убийствам. Осталось узнать, где живёт автор работающего кода.

Link to comment
Share on other sites

  • 0

Религиозность тут совсем ни при чём. Как раз сейчас у нас сотрудник третий день мучается, пытаясь понять, что имел в виду разработчик сайта, свалившегося на поддержку.

Там тоже всё работает, но внести минимальную правку оказалось недопустимо сложно. Сотрудник поддержки уже близок к состоянию психопата, склонного к убийствам. Осталось узнать, где живёт автор работающего кода.

это я так понимаю тонкий намек на толстое обстоятельство? :)

по коду что скажешь? есть какие-нибудь недочеты, может подводные камни? если плохой подход - почему и чем это грозит?

Link to comment
Share on other sites

  • 0

явно указанный ID инфоблока.

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

в 95% случаев причина в этом: где-то в коде ID инфоблока прописан жёстко. Не надо так делать, когда этот ID есть в $arParams. Нужно его брать оттуда.

Судя по тому, что вёрстка намешана с логикой, видно, что всё это безобразие творится в template.php. Время от времени этот файл открывается на редактирование в визуальном редакторе. И это нормально. Сотрудник заказчика должен иметь возможность добавить розовую блямбу в шаблон не будучи программистом. Но что в таком случае станет с кодом php — лотерея. Может и не выжить.

Именно для избежания такой ерунды и сделано разделение логики и оформления. В битриксе оно сделано довольно неплохо, можно разделить весьма жёстко. Минус битрикса только в том, что можно и понаписать логики в шаблоны, а оформления в ядро. И штатная функция ShowImage(), применённая здесь, тому яркий пример. В этом плане мне куда более симпатичны шаблоны джанго, где возможности логики в шаблонах урезаны до реально необходимого минимума.

Про всякие мелкие некритичные недочёты вроде get-параметров &set_filter=Подобрать&set_filter=Y я не говорю :) Они ничего не натворят плохого, но как-то это не очень красиво что ли :)

А вот этот момент: <a href="?arrFilter_pf[VENDOR]='.$arItem["ID"] — значительно хуже. Он исключает альтернативную фильтрацию.

Например, есть фильтрация или сортировка по цене, но нужно наложить ещё и эту фильтрацию по производителям. Такая формулировка в url перечеркнёт все параметры, установленные до этого.

ShowImage($arItem["PREVIEW_PICTURE"], 100, 100, "border='0'") — тоже не айс. Почему размеры картинки не вынесены в параметры компонента? Для изменения размеров нужно лезть в код. Это неправильно. А рамка и вовсе должна в css задаваться.

Link to comment
Share on other sites

  • 0

явно указанный ID инфоблока.

Не надо так делать, когда этот ID есть в $arParams.

1) спасибо, учту.

Судя по тому, что вёрстка намешана с логикой, видно, что всё это безобразие творится в template.php.

2) я так и написал об этом.

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

3) покажи где в шаблонах битрикса есть это разделение?

Но что в таком случае станет с кодом php — лотерея. Может и не выжить.

4) с ним ничего ровным счетом не случится :)

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

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

И штатная функция ShowImage(), применённая здесь, тому яркий пример. В этом плане мне куда более симпатичны шаблоны джанго, где возможности логики в шаблонах урезаны до реально необходимого минимума.

5) ну не суть, можно будет наверное вытащить и как-то так:


<img border="0" src="<?=$arElement["PREVIEW_PICTURE"]["SRC"]?>" width="<?=$arElement["PREVIEW_PICTURE"]["WIDTH"]?>" height="<?=$arElement["PREVIEW_PICTURE"]["HEIGHT"]?>" alt="<?=$arElement["NAME"]?>" title="<?=$arElement["NAME"]?>" />

чем этот код лучше?

Про всякие мелкие некритичные недочёты вроде get-параметров &set_filter=Подобрать&set_filter=Y я не говорю :) Они ничего не натворят плохого, но как-то это не очень красиво что ли :)

6) вот с этим полностью согласен, только я пока еще не вкуриваю как можно создавать чпу, то есть я знаю где в админке он создается, но не более того, т.е. ни принципы что куда, откуда, где, кто с чем и как работает... :)

А вот этот момент: <a href="?arrFilter_pf[VENDOR]='.$arItem["ID"] — значительно хуже. Он исключает альтернативную фильтрацию.

Например, есть фильтрация или сортировка по цене, но нужно наложить ещё и эту фильтрацию по производителям. Такая формулировка в url перечеркнёт все параметры, установленные до этого.

7) нам она и не нужна, мы специально так ссылками сделали а не инпутами, в инпутах конечно выбор фильтрации по значениям больше, но он нам не нужен.

ShowImage($arItem["PREVIEW_PICTURE"], 100, 100, "border='0'") — тоже не айс. Почему размеры картинки не вынесены в параметры компонента? Для изменения размеров нужно лезть в код. Это неправильно. А рамка и вовсе должна в css задаваться.

8) да, плохой мальчик, согласен, исправлюсь :)

Link to comment
Share on other sites

  • 0

3) покажи где в шаблонах битрикса есть это разделение?

в template.php шаблон.

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

вся логика в component.php. Если вдруг логика компонента не обеспечивает строго нужного результата, можно модифицировать тот результат, который есть, до того, как он попадёт в шаблон. Для этого в каталоге шаблона создаётся файл result_modifier.php.

если требуется выполнить некоторые действия после того, как будет подключен и обработан шаблон, можно там же разместить component_epilog.php.

если при использовании данного шаблона требуются дополнительные параметры компонента, их можно описать в .parameters.php там же в каталоге шаблона.

Это если не рассматривать тему создания собственных компонентов, а только кастомизацию штатных.

В совокупности эта конструкция позволяет делать чистые и красивые шаблоны, удобные в поддержке и полностью настраиваемые средствами интерфейса «эрмитаж».

Вот только разработчики битрикса из злокоммерческих целей поддерживают низкий порог вхождения, а потому есть возможность писать правильно и красиво, но остаётся и возможность быдлокодить, запретов никаких нет. Понимание необходимости придерживаться правил (если его не было изначально) приходит к разработчику после нескольких крупных проектов. Логика в битриксе весьма стройная, если её придерживаться, можно создавать проекты практически неограниченной сложности. Если же нарушать её, оправдываясь частными случаями, то появляется риск при следующем изменении попасть на переписывание всей своей самодеятельности по всему проекту, и глюки будут вылезать в самых неожиданных местах.

Edited by wildhind
  • Like 1
Link to comment
Share on other sites

  • 0

в template.php шаблон.

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

вся логика в component.php. Если вдруг логика компонента не обеспечивает строго нужного результата, можно модифицировать тот результат, который есть, до того, как он попадёт в шаблон. Для этого в каталоге шаблона создаётся файл result_modifier.php.

если требуется выполнить некоторые действия после того, как будет подключен и обработан шаблон, можно там же разместить component_epilog.php.

если при использовании данного шаблона требуются дополнительные параметры компонента, их можно описать в .parameters.php там же в каталоге шаблона.

Это если не рассматривать тему создания собственных компонентов, а только кастомизацию штатных.

В совокупности эта конструкция позволяет делать чистые и красивые шаблоны, удобные в поддержке и полностью настраиваемые средствами интерфейса «эрмитаж».

Вот только разработчики битрикса из злокоммерческих целей поддерживают низкий порог вхождения, а потому есть возможность писать правильно и красиво, но остаётся и возможность быдлокодить, запретов никаких нет. Понимание необходимости придерживаться правил (если его не было изначально) приходит к разработчику после нескольких крупных проектов. Логика в битриксе весьма стройная, если её придерживаться, можно создавать проекты практически неограниченной сложности. Если же нарушать её, оправдываясь частными случаями, то появляется риск при следующем изменении попасть на переписывание всей своей самодеятельности по всему проекту, и глюки будут вылезать в самых неожиданных местах.

Очень достойный ответ! По крайней мере, для себя кое-что важное почерпнул, спасибо.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy