@cereberlum

Как поправить php 7 Only variables should be passed by reference?

Полный текст предупреждения:
Предупреждение: Declaration of Shop_Controller_Show_Last_Items::xsl(Xsl_Model $oXsl) should be compatible with Core_Controller::xsl($xsl) в файле /var/www/......./modules/shop/controller/show/last/items.php (строка 353)Замечание: Only variables should be passed by reference в файле /var/www/....../modules/shop/controller/show/last/items.php (строка 116)

Насколько я понимаю, смысл в том, что функция которая заканчивается на 353 строке, передается в 116 и как бы ее надо передать в виде переменной. Подскажите как это оформить строки 114-118
{
		// загрузим массив просмотренных элементов из куки
        $this->_aShop_Last_Items = Core_Type_Conversion::toArray(@unserialize(Core_Array::get($_COOKIE, $this->_cookie_name, null)));
        $this->_aShop_Last_Items = array_unique($this->_aShop_Last_Items);
	}

Сама функция
spoiler
/**
	 * 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();
		}
	}
}


Последняя строка приведенного кода и есть 353-я.
  • Вопрос задан
  • 45 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
RecruitIT Москва
от 100 000 до 160 000 ₽
от 130 000 до 180 000 ₽
Сбер Москва
До 240 000 ₽
25 окт. 2020, в 14:51
10000 руб./за проект
25 окт. 2020, в 14:26
200000 руб./за проект
25 окт. 2020, в 14:23
200000 руб./за проект