/**
* Shop_Controller_Show_Last_Items::showLastItems() - отображает последние просмотренные товары, в соответствии с заданными настройками
*
* @return void
*/
public function showLastItems()
{
$oShop = $this->getEntity();
// исключим из показа последних товаров те, что уже есть в корзине - начало
if ($this->exclude_incart_items)
{
// получим содержимое корзины
$oShop_Cart_Controller = Shop_Cart_Controller::instance();
$aCart = $oShop_Cart_Controller->getAll($oShop);
// запустим цикл по товарам лежащим в корзине
foreach ($aCart as $oShop_Cart)
{
$oShop_Item = Core_Entity::factory('Shop_Item', $oShop_Cart->shop_item_id);
$this->deleteArrayItemByValue($this->_aShop_Last_Items,
$oShop_Item->modification_id && $this->show_parent_items_instead_modifications ?
$oShop_Item->modification_id : $oShop_Item->id);
}
}
// исключим из показа последних товаров те, что уже есть в корзине - конец
// исключение текущего элемент, если мы находимся на странице товара - начало
if (!$this->allow_show_current_item)
{
$oShop_Controller_Show = new Shop_Controller_Show($oShop);
$oShop_Controller_Show->parseUrl();
if ($oShop_Controller_Show->item)
{
$oShop_Item = Core_Entity::factory('Shop_Item', $oShop_Controller_Show->item);
$this->deleteArrayItemByValue($this->_aShop_Last_Items,
$oShop_Item->modification_id && $this->show_parent_items_instead_modifications ?
$oShop_Item->modification_id : $oShop_Item->id);
}
}
// исключение текущего элемента, если мы находимся на странице товара - конец
// замена модификаций на родительские товары - начало
if ($this->show_parent_items_instead_modifications)
{
// реверсируем массив, чтобы сохранить правильный порядок товаров при замене
// при случайной сортировке порядок просмотра товаров, по сути, не имеет значения
if (!$this->is_random)
{
$this->_aShop_Last_Items = array_reverse($this->_aShop_Last_Items, true);
}
foreach ($this->_aShop_Last_Items as $key => $item_id)
{
$oShop_Item = Core_Entity::factory('Shop_Item', $item_id);
// если это модификация
if ($oShop_Item->modification_id)
{
// ищем, есть ли уже в массиве родительский товар
$parent_item_key = array_search($oShop_Item->modification_id, $this->_aShop_Last_Items);
if ($parent_item_key === false)
{
// если еще нет, то заменяем текущий элемент на родительский
$this->_aShop_Last_Items[$key] = $oShop_Item->modification_id;
} else
{
// а если уже есть, то удаляем текущий элемент
unset($this->_aShop_Last_Items[$key]);
}
}
}
// реверсируем массив, чтобы восстановить порядок просмотра товаров
// при случайной сортировке порядок просмотра товаров, по сути, не имеет значения
if (!$this->is_random)
{
$this->_aShop_Last_Items = array_reverse($this->_aShop_Last_Items, true);
}
}
// замена модификаций на родительские товары - конец
// исключение товаров, которых нет в наличии - начало
if ($this->exclude_out_of_rest_items)
{
foreach ($this->_aShop_Last_Items as $item_id)
{
$oShop_Warehouse_Item = Core_Entity::factory('Shop_Warehouse_Item')->getByShopItemId($item_id, $this->cache);
if (!$oShop_Warehouse_Item || !($oShop_Warehouse_Item->count > 0))
{
$this->deleteArrayItemByValue($this->_aShop_Last_Items, $item_id);
}
}
}
// исключение товаров, которых нет в наличии - конец
// и если после всего этого еще осталось что показывать :)
if (sizeof($this->_aShop_Last_Items))
{
// если задан режим случайного показа
if ($this->is_random)
{
// то включим случайную сортировку
$this->_oShop_Controller_Show
->shopItems()
->queryBuilder()
->clearOrderBy()
->orderBy('RAND()');
}
// если задан показ в обратном хронологическом порядке
else
{
// развернем массив историй посещения товаров задом наперед,
// и обрежем его, оставив только то количество элементов, которое необходимо показать
$this->_aShop_Last_Items = array_slice(array_reverse($this->_aShop_Last_Items), 0, $this->limit);
// сформируем фрагмент XML, для описания порядка следования элементов в массиве истории посещения
$visit_order_xml = Core::factory('Core_Xml_Entity')->name('visit_order');
foreach ($this->_aShop_Last_Items as $item_id)
{
$visit_order_xml->addEntity(Core::factory('Core_Xml_Entity')->name('last_item')->value($item_id));
}
$this->_oShop_Controller_Show->addEntity($visit_order_xml);
}
// создадим фильтр по основному свойству id товара.
// с помощью этого фильтра мы укажем контроллеру
// какие товары мы хотим вывести
// начало фильтра
$this->_oShop_Controller_Show
->shopItems()
->queryBuilder()
->where('shop_items.id', 'IN', $this->_aShop_Last_Items)
->setAnd();
// конец фильтра
$this->_oShop_Controller_Show
->cache($this->cache)
->limit($this->limit)
->show();
}
}
}