Сортировка
04.09.2011

[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 = "Количеству &uarr;";

}

if($_REQUEST["sort"]=="ostatok" && $_REQUEST["order"]=="desc"){

$kol = "Количеству &darr;";

}

$sprise= "Цене";

if($_REQUEST["sort"]=="price" && $_REQUEST["order"]=="asc"){

$sprise = "Цене &uarr;";

}

if($_REQUEST["sort"]=="price" && $_REQUEST["order"]=="desc"){

$sprise = "Цене &darr;";

}

$sname= "Названию";

if($_REQUEST["sort"]=="name" && $_REQUEST["order"]=="asc"){

$sname = "Названию &uarr;";

}

if($_REQUEST["sort"]=="price" && $_REQUEST["order"]=="desc"){

$sname = "Названию &darr;";

}

?>

<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?> &nbsp;</a>
	<?$r++?>
	<?endforeach;?>

Все сортировка по количеству готова! Таким вот нехитрым способом мы смогли «соорудить» сортировку. Это один из возможных вариантов.

Сама по себе платформа Битрикс очень удобна для разработки, по сравнению с другими CMS. Но люди делают интернет-магазины не только на этой CMS, но и на других. Совсем недавно встретил интрнет-шоп на DLE. Все сделано достаточно красиво и со вкусом. Особое внимание хочу обратить на обратную связь, есть специальный конструктор форм обратной связи для dle 9.3. С помощью такого конструктора вам не обязательно обладать глубокими знаниями html, CSS и php все делается на уровне ООП. Для инет шопа обратная связь играет не второстепенную роль. В жизни, приобретая понравившейся товар, вы в первую очередь проконсультируетесь с продавцом. В online это общение можно реализовать как раз с помощью формы обратной связи.

Понравилась статья?

Подписка на обновления блога через RSS ленту или по электронной почте, а так же следуй за мной .

RotaPost - Эффективная реклама в блогах

Ваш комментарий

  1. мде… за такие-то деньги и у разработчиков не хватило ума прикрутить дефолтом сортировку по остаткам… как бы выразиться правильно?… Наверное просто — «Это Битрикс»

    [Ответить]

    adminIdenticon admin

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

    [Ответить]

  2. ДоброжелательIdenticon Доброжелатель08.09.2011 - 09:29

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

    Я вот обнаружил, что onafteriblockelementupdate не работает как надо, т.к. он связан с данными инфоблока, а не каталога.

    [Ответить]

  3. ГЕОРГИЙIdenticon ГЕОРГИЙ08.09.2011 - 10:33

    Возник вопрос по пункту 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'] возвращает предыдущее значение

    [Ответить]

  4. r3c130nIdenticon r3c130n23.09.2011 - 06:55

    Да ладно,

    $res = CIBlockElement::GetList(Array('CATALOG_QUANTITY'=>'DESC'), $arFilter, false, Array("nPageSize"=>50));
    

    Топ 50 товаров, отсортированных по количеству товаров в остатках

    [Ответить]

    ZircoolIdenticon Zircool

    Класс! Не знал.

    [Ответить]

О блоге

Здравствуйте! Меня зовут Михаил.Раньше я называл себя Новороссийским бомжем, но решил немного отойти от этого. Теперь мой блог - это Блог PHP программиста. Я уже 3 года занимаюсь PHP программированием. С недавнего времени создаю и продвигаю web сайты. Среди собственных разработок — самописная CMS, работающая на файлах, CMS для создания online тестов и т.д.

Подробнее о блоге

Связаться со мной