[Bitrix] Сортировка товара в каталоге (по остаткам на складе )
Здравствуйте. Сегодня мы рассмотрим еще одну задачку и пример её реализации на платформе 1С-Битрикс. Итак нам необходимо сделать сортировку товара по количеству.
Казалось бы, что может быть проще, ведь разработчики Битрикс уже все придумали за нас, подставляй нужный параметр в GetList, но к сожалению в GetList параметр остатка товаров на складе передать невозможно, так разработан API.
Но сортировка по свойству возможна. Итак что же нам нужно сделать? Составим маленький план:
1. Добавить новое свойство к информационному блоку, в котором хранится номенклатура.
2. Написать скрипт/ обработчик, который записывает «подбивает» остатки и записывает их как свойство.
3. Отредактировать шаблон компонента bitrix:catalog
Ну что же задачи поставлены, приступим к их выполнению. Добавляем новое свойство в настройках информационного блока. В административной панели переходим в раздел Контент->Информ. блоки ->Типы информ. блоков -> 1С каталог В данном случае информационный блок, называется 1С Каталог, у Вас от может называться по-другому. Переходим на вкладку Свойства и устанавливаем новое свойство. Назовем его Остаток, тип- Число, код-OSTATOK. Заходим в настройки свойства и ставим галочку напротив поля Выводить на странице списка элементов поле для фильтрации по этому свойству
После создания свойства и сохранения изменений. Необходимо написать скрипт, который будет записывать остаток товара в свойство «остаток». Я данный скрипт написал, как отдельный. Но при желании весь код можно поместить в функцию, а функцию «засунуть» в обработчик событий.
Код:
<?
if(!CModule::IncludeModule("iblock"))
{
ShowError(GetMessage("IBLOCK_MODULE_NOT_INSTALLED"));
return;
}
$TYPE = "1ccatalog";
$OUT="<div style=\"padding:10px;\"><table width=100%>
<tr><td><div align=\"center\"><b>ID</b></div></td><td><div align=\"center\"><b>Название</b></div></td><td><b>Количество</b></td></tr>";
$arSelect = Array("ID","NAME","IBLOCK_ID","ACTIVE");
$arFilter = Array("IBLOCK_TYPE"=>$TYPE);
$res = CIBlockElement::GetList(Array("SORT"=>"ASC"),$arFilter, false, false,$arSelect);
$i = 0;
$c = 0;
while($ob = $res->GetNext())
{
$i++;
if (CModule::IncludeModule("catalog"))
{
$ar_res = CCatalogProduct::GetByID($ob['ID']);
$OUT.="<tr><td>$ob[ID]</td><td style=\"text-align:left;\"><a href=\"http://zircool.ru/bitrix/admin/iblock_element_edit.php?ID=$ob[ID]&type=$TYPE&lang=ru&IBLOCK_ID=$ob[IBLOCK_ID]&find_section_section=-1\">$ob[NAME]</td><td>$ar_res[QUANTITY]</td></tr>";
$PROPERTY_VALUE = $ar_res['QUANTITY'];
$PROPERTY_CODE = "OSTATOK";
$ELEMENT_ID =$ob['ID'];
$IBLOCK_ID = $ob['IBLOCK_ID'];
CIBlockElement::SetPropertyValues($ELEMENT_ID, $IBLOCK_ID, $PROPERTY_VALUE, $PROPERTY_CODE);
$c++;
}
}
$OUT.="</table></div>";
echo $OUT;
echo "<br /><br />Готово!";
?>
Плавно мы подошли в третьему пункту нашего плана. Нам осталось лишь отредактировать шаблон компонента bitrix:catalog.
Ниже будет представлен код сортировщика.
<?
$arAvailableSort = array(
"name" => Array("name", "asc"),
"price" => Array('CATALOG_PRICE_4', "asc"),
"ostatok" => Array('PROPERTY_OSTATOK', "asc"),
);
$sort = array_key_exists("sort", $_REQUEST) && array_key_exists(ToLower($_REQUEST["sort"]), $arAvailableSort) ? $arAvailableSort[ToLower($_REQUEST["sort"])][0] : "name";
$sort_order = array_key_exists("order", $_REQUEST) && in_array(ToLower($_REQUEST["order"]), Array("asc", "desc")) ? ToLower($_REQUEST["order"]) : $arAvailableSort[$sort][1];
$kol = "Количеству";
if($_REQUEST["sort"]=="ostatok" && $_REQUEST["order"]=="asc"){
$kol = "Количеству ↑";
}
if($_REQUEST["sort"]=="ostatok" && $_REQUEST["order"]=="desc"){
$kol = "Количеству ↓";
}
$sprise= "Цене";
if($_REQUEST["sort"]=="price" && $_REQUEST["order"]=="asc"){
$sprise = "Цене ↑";
}
if($_REQUEST["sort"]=="price" && $_REQUEST["order"]=="desc"){
$sprise = "Цене ↓";
}
$sname= "Названию";
if($_REQUEST["sort"]=="name" && $_REQUEST["order"]=="asc"){
$sname = "Названию ↑";
}
if($_REQUEST["sort"]=="price" && $_REQUEST["order"]=="desc"){
$sname = "Названию ↓";
}
?>
<div class="catalog-item-sorting">
<label>Сортировать по:</label>
<?$r=0;?>
<?foreach ($arAvailableSort as $key => $val):
$className = $sort == $val[0] ? 'selected' : '';
if ($className)
$className .= $sort_order == 'asc' ? ' asc' : ' desc';
$newSort = $sort == $val[0] ? $sort_order == 'desc' ? 'asc' : 'desc' : $arAvailableSort[$key][1];
if($r==0) $pname = $sname;
if($r==1) $pname = $sprise;
if($r==2) $pname = $kol;
?>
<a href="<?=$APPLICATION->GetCurPageParam('sort='.$key.'&order='.$newSort, array('sort', 'order'))?>" class="<?=$className?>" rel="nofollow"><?=$pname?> </a>
<?$r++?>
<?endforeach;?>
Все сортировка по количеству готова! Таким вот нехитрым способом мы смогли «соорудить» сортировку. Это один из возможных вариантов.
Сама по себе платформа Битрикс очень удобна для разработки, по сравнению с другими CMS. Но люди делают интернет-магазины не только на этой CMS, но и на других. Совсем недавно встретил интрнет-шоп на DLE. Все сделано достаточно красиво и со вкусом. Особое внимание хочу обратить на обратную связь, есть специальный конструктор форм обратной связи для dle 9.3. С помощью такого конструктора вам не обязательно обладать глубокими знаниями html, CSS и php все делается на уровне ООП. Для инет шопа обратная связь играет не второстепенную роль. В жизни, приобретая понравившейся товар, вы в первую очередь проконсультируетесь с продавцом. В online это общение можно реализовать как раз с помощью формы обратной связи.





Авторегер Narod.ru
[FAQ] Как грамотно писать скрипты под Human Emulator.
Автоматическая аддурилка Yandex
Test Maker v 1.0 — бесплатная CMS для создания online тестов
Здравствуйте! Меня зовут Михаил.Раньше я называл себя Новороссийским бомжем, но решил немного отойти от этого. Теперь мой блог - это Блог PHP программиста. Я уже 3 года занимаюсь PHP программированием. С недавнего времени создаю и продвигаю web сайты. Среди собственных разработок — самописная CMS, работающая на файлах, CMS для создания online тестов и т.д.
мде… за такие-то деньги и у разработчиков не хватило ума прикрутить дефолтом сортировку по остаткам… как бы выразиться правильно?… Наверное просто — «Это Битрикс»
[Ответить]
Возможно сотрудники компании Битрикс увидят этот пост и в следующем обновлении выйдет именно это дополнение.
[Ответить]
Ключевой момент в том, что похоже такого события, на которое можно повесить обработчик актуализации остатоков, нет. Если приведете, был бы очень признателен.
Я вот обнаружил, что onafteriblockelementupdate не работает как надо, т.к. он связан с данными инфоблока, а не каталога.
[Ответить]
Возник вопрос по пункту 2 в Вашем плане, на какое событие Вы вешаете скрипт?
Было бы хорошо на OnBeforeIBlockElementUpdate или OnAfterIBlockElementUpdate
что то вроде,
public function AfterIBlockElementUpdate($arFields)
{
$ID_BLOCK=666;
$PROP=»Наше свойство»;
$ar_res = CCatalogProduct::GetByID($ID);
//обновляем элемент
CIBlockElement::SetPropertyValues($arFields['ID'],$ID_BLOCK,$ar_res['QUANTITY'],$PROP);
}
но в этом случае $ar_res['QUANTITY'] возвращает предыдущее значение
[Ответить]
Да ладно,
$res = CIBlockElement::GetList(Array('CATALOG_QUANTITY'=>'DESC'), $arFilter, false, Array("nPageSize"=>50));Топ 50 товаров, отсортированных по количеству товаров в остатках
[Ответить]
Класс! Не знал.
[Ответить]