Счётчик товаров в группах магазина в Hostcms 6.0.8

При очередном знакомстве с новой версией HostCMS (на момент написания статьи 6.0.8), всплыл не особо приятный момент. Связан он с тем, что счётчики количества (items_count и items_total_count) не обновляются при манипуляции с расположением товара в группах магазина.

Пример проблемы

Представьте, перенесли Вы товар из одной группы в другую, но на сайте рядом с названием группы в скобках всё те же цифры, отображающие количество элементов в группе, а ведь перенесённого товара уже там нет. Нехорошо обманывать своих посетителей :) На форуме HostCMS упоминается эта проблема, решение которой по словам ТП, заключается в использовании функционала «Пересчитать» для магазина, но это ведь так не удобно.

Наше решение

Если взглянуть на модель группы магазина Shop_Group_Model, то можно найти готовый метод для изменения количества товаров в группе и далее по дереву вверх – modifyCountItems. Но в обработчике действия «Перенести» Shop_Item_Model.move() этот метод не используется, что мы и будем исправлять:

  1. Находим файл модели товара магазина /modules/shop/item/model.php
  2. Находим в нём обработчик действия «Перенести»:
    public function move($iShopGroupId)
    {
    	$this->shop_group_id = $iShopGroupId;
    	return  $this->save();
    }
    	
  3. Наш вариант:
    public function move($iShopGroupId)
    {
    	$this->Shop_Group->modifyCountItems(-1); // уменьшаем кол-во товара в текущей группе
    	$this->shop_group_id = $iShopGroupId;
    			
    	$return = $this->save();
    	$this->Shop_Group->modifyCountItems(1); //  увеличиваем кол-во товара в новой группе
    	return $return;
    }
    	

И по логике вещей всё должно работать, но сталкиваемся с такой проблемой, как изменение количества товаров внутри группы (не путать с общим) - items_count, по рекурсии и в родительских группах, а ведь этого не должно быть. Исправляем это:

  1. Находим модель группы магазина. Расположена она в файле /modules/shop/group/model.php
  2. Находим в ней метод modifyCountItems:
    public function modifyCountItems($int = 1)
    {
    	$this->items_count += $int;
    	$this->items_total_count += $int;
    	$this->save();
    
    	if ($this->parent_id != 0 /*&& $this->parent_id != $this->id*/ && !is_null($this->Shop_Group->id))
    			{
    	$this->Shop_Group->modifyCountItems($int);
    			}
    	return $this;
    }
    	
  3. Наш вариант:
    public function modifyCountItems($int = 1, $first = true)
    {
    	$first && $this->items_count += $int;
    	$this->items_total_count += $int;
    	$this->save();
    		
    	if ($this->parent_id != 0 /*&& $this->parent_id != $this->id*/ && !is_null($this->Shop_Group->id))
    			{
    	$this->Shop_Group->modifyCountItems($int, false);
    			}
    	return $this;
    }
    	

Вот и все изменения, необходимые для того, чтобы избавиться от этого неприятного момента.

Обращаем внимание!

Изменение кода объектной модели системы управления защищается авторскими правами, поэтому все изменения делаются в наследуемых классах, которые в последующем используются в коде типовой динамической страницы Интернет-магазина. Либо ждём исправлений в новых версиях системы.



Осуждение статьи :) б

Гость26.05.2013

Если я правильно понял вашу проблему, то все делается гораздо проще.
Идем в список магазинов, напротив требуемого магазина ставим галочку и жмем ссылку внизу «Пересчитать». Кол-во товаров п группах пересчитается.

Васильков Андрей26.05.2013

Каждый раз при манипуляции с расположением элементов (перенос.удаление и т.п.) в группе магазина или ИС использовать функционал «Пересчитать» не особо удобно, можно иногда просто забывать это делать, намного удобнее, когда скрипт делает за тебя это автоматически.

Гость29.05.2013

А при обновлениях не затирается?

Васильков Андрей29.05.2013

Затираются, потому что исправления делаются в файлах системы. В этом и заключается минус решения.

Гость29.05.2013

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

Васильков Андрей30.05.2013

Это решение не претендует на звание «универсальное», и было разработано в расчёте на то, что в будущем, возможно, появится в одном из обновлений. Ведь «блондинка» между играми в косынку может просто забывать нажать эту ссылочку: )
Есть вопросы или комментарии?
Как вас зовут?
E-mail (укажите, если хотите чтобы мы ответили на почту)
Комментарий
Введите цифры с картинки:


Ваше имя

Телефон

Удобное время