Morozov&Pimnev blog

Полезные решения, шпаргалки и примеры по html, css, js, jQuery, MySQL, PHP, HostCMS, ssh.

Метка - shop.

Вычисляем абсолютную цену товара в зависимости от валюты, скидки и налога и сортируем по ней в HostCMS v6

$oShop = Core_Entity::factory('Shop', 1);

$current_date = date('Y-m-d H:i:s');
$query_currency_switch = 'price';

// Получаем список валют
$aShop_Currencies = Core_Entity::factory('Shop_Currency')->findAll();

foreach ($aShop_Currencies as $oShop_Currency)
{
	// Получаем коэффициент пересчета для каждой валюты для магазина
	$currency_coefficient = Shop_Controller::instance()->getCurrencyCoefficientInShopCurrency(
		$oShop_Currency, $oShop->Shop_Currency
	);

	$query_currency_switch = "IF (shop_items.shop_currency_id = {$oShop_Currency->id}, 
		IF (shop_discounts.value, 
			IF(shop_discounts.type, 
				IF(shop_tax_id AND shop_taxes.tax_is_included = 0, price + (shop_taxes.rate / 100 * price), price) * {$currency_coefficient} - shop_discounts.value, 
				IF(shop_tax_id AND shop_taxes.tax_is_included = 0, price + (shop_taxes.rate / 100 * price), price) * (100 - shop_discounts.value) * {$currency_coefficient} / 100
			), 
			IF(shop_tax_id AND shop_taxes.tax_is_included = 0, price + (shop_taxes.rate / 100 * price), price) * {$currency_coefficient}
		),
		{$query_currency_switch}
	)";
}

$oShop_Items = $oShop->Shop_Items;

$oShop_Items->queryBuilder()
	->select(array(Core_QueryBuilder::expression($query_currency_switch), 'absolute_price'))
	->leftJoin('shop_taxes', 'shop_items.shop_tax_id', '=', 'shop_taxes.id')
	->leftJoin('shop_item_discounts', 'shop_items.id', '=', 'shop_item_discounts.shop_item_id')
	->leftJoin('shop_discounts', 'shop_item_discounts.shop_discount_id', '=', 'shop_discounts.id', array(
		array('AND (' => array('shop_discounts.end_datetime', '>=', $current_date)),
		array('OR' => array('shop_discounts.end_datetime', '=', '0000-00-00 00:00:00')),
		array('AND' => array('shop_discounts.start_datetime', '<=', $current_date)),
		array(')' => NULL)
	))
	->groupBy('shop_items.id')
	->clearOrderBy()
	->orderBy('absolute_price', 'ASC'); // сортировка по абсолютной цене по возрастанию

$oShop_Items = $oShop_Items->findAll();

...

Читать дальше →

absolute_price, shop_items, shop, hostcms6


Копирование групп, подгрупп и их товаров всего интернет магазина в другой магазин в HostCMS v6

Есть странность, при копировании интернет-магазина в HostCMS, происходит только копирование его настроек, доставок, платежных систем, цен итд, но не его групп и товаров, так что для этого мы можем использовать следующий код:

<?php
	$oShopOne = Core_Entity::factory('Shop', 1); // магазин откуда копируем
	$oShopTwo = Core_Entity::factory('Shop', 2); // магазин куда копируем

	$oShop_Groups = $oShopOne->Shop_Groups;

	$oShop_Groups->queryBuilder()->where('parent_id','=',0); // выбираем все группы из корня

	$aShop_Groups = $oShop_Groups->findAll(FALSE);

	Core_Event::attach('shop_group.onBeforeCopy', array('Shop_Copy_Observer', 'onBeforeCopy'));
	Core_Event::attach('shop_item.onBeforeCopy', array('Shop_Copy_Observer', 'onBeforeCopy'));

	foreach($aShop_Groups as $oShop_Group)
	{
		$oShop_Group->copy();
	}

	$oShopTwo->recount(); // пересчитываем магазин

	class Shop_Copy_Observer
	{
		public static function onBeforeCopy($newObject, $athis)
		{
			$newObject->shop_id = 2; // ID магазина куда копируем
		}
	}
?>

...

Читать дальше →

shop_items, хуки, core_event, php, hostcms6, shop, shop_groups 1 комментарий


Выбор товаров/элементов из подгрупп независимо от уровня вложенности на HostCMS v6

В ТДС в самом начеле доабвляем следующий код

Код для Интернет-магазина:

class My_Shop_Controller_Show extends Shop_Controller_Show
{
	protected function _groupCondition()
	{
		$oShop = $this->getEntity();
   
		if ($this->group)
		{
			// если ID группы не 0, т.е. не корневая группа
			// получаем подгруппы
			$aSubGroupsID = $this->fillShopGroup($oShop->id, $this->group); // добавляем текущую группу в массив
			$aSubGroupsID[] = $this->group;

			$this->shopItems()
				->queryBuilder()
				->where('shop_items.shop_group_id', 'IN', $aSubGroupsID); // получаем все товары из подгрупп
		}
		else
		{
			$this->shopItems()
				->queryBuilder()
				->where('shop_items.shop_group_id', '=', 0);
		}

		return $this;
	}

	protected $_aGroupTree = array();

	public function fillShopGroup($iShopId, $iShopGroupParentId = 0, $iLevel = 0)
	{
		$iShopId = intval($iShopId);
		$iShopGroupParentId = intval($iShopGroupParentId);
		$iLevel = intval($iLevel);

		if ($iLevel == 0)
		{
			$aTmp = Core_QueryBuilder::select('id', 'parent_id')
				->from('shop_groups')
				->where('shop_id', '=', $iShopId)
				->where('deleted', '=', 0)
				->execute()->asAssoc()->result();

			foreach ($aTmp as $aGroup)
			{
				$this->_aGroupTree[$aGroup['parent_id']][] = $aGroup;
			}
		}

		$aReturn = array();

		if (isset($this->_aGroupTree[$iShopGroupParentId]))
		{
			foreach ($this->_aGroupTree[$iShopGroupParentId] as $childrenGroup)
			{
				$aReturn[] = $childrenGroup['id'];
				$aReturn = array_merge($aReturn, $this->fillShopGroup($iShopId, $childrenGroup['id'], $iLevel + 1));
			}
		}

		$iLevel == 0 && $this->_aGroupTree = array();

		return $aReturn;
	}
}

Далее ищем и меняем строчку:

// ищем
//$Shop_Controller_Show = new Shop_Controller_Show($oShop);
// меняем на
$Shop_Controller_Show = new My_Shop_Controller_Show($oShop);

Код для Информационной системы:

...

Читать дальше →

informationsystem_groups, php, hostcms6, shop, shop_groups, shop_items, informationsystem_items


Вывод товаров или элементов ИС на главную по доп. свойству типа "флажок" на HostCMS v6

Для товаров из магазина

<?php
	$Shop_Controller_Show = new Shop_Controller_Show(
		Core_Entity::factory('Shop', 1)
	);

	$Shop_Controller_Show
		->xsl(
			Core_Entity::factory('Xsl')->getByName('МагазинТоварыНаГлавной')
		)
		->groupsMode('none') // избавляемся от групп и лишних запросов
		->group(FALSE) // добавляем элементы из всех групп
		->itemsForbiddenTags(array('text','description'))
		->viewed(FALSE) // исключаем просмотренные товары, т.к. по умолчанию они добавляются в XML, а нам не нужна дополнительнеая нагрузка, тем более мы их не выводим в группах
		->itemsPropertiesList(FALSE) // исключаем вывод списка доп. свойств, т.к. по умолчанию они добавляются в XML, а нам не нужна дополнительная нагрузка, тем более мы их не выводим
		->limit(5);

	$Shop_Controller_Show
		->shopItems()
		->queryBuilder()
		->leftJoin('shop_item_properties', 'shop_items.shop_id', '=', 'shop_item_properties.shop_id')
		->leftJoin('property_value_ints', 'shop_items.id', '=', 'property_value_ints.entity_id',
			array(
				array('AND' => array('shop_item_properties.property_id', '=', Core_QueryBuilder::expression('`property_value_ints`.`property_id`')))
			)
		)
		->where('shop_item_properties.property_id', '=', 63) // ID свойства типа "флажок"
		->where('property_value_ints.value', '=', 1) // флажок включен
		// расскомментировать если нужно товары показывать рандомно
		//->clearOrderBy()
		//->orderBy('RAND()')
	;

	$Shop_Controller_Show->show();
?>

...

Читать дальше →

php, shop, shop_items, informationsystem_items, informationsystem, hostcms6


Вывод способов оплаты магазина на HostCMS v6

<?php
	$Shop_Payment_System_Controller_Show = new Shop_Payment_System_Controller_Show(
		Core_Entity::factory('Shop', 1)
	);

	$Shop_Payment_System_Controller_Show
		->xsl(
			Core_Entity::factory('Xsl')->getByName('МагазинСписокСпособовОплат')
		)
		->show();
?>

Далее уже редактируем xsl шаблон под свои нужды

...

Читать дальше →

payment, shop, hostcms6, php


Вывод способов доставки магазина на HostCMS v6

<?php
	$oShop = Core_Entity::factory('Shop', 1);

	$Shop_Delivery_Controller_Show = new Shop_Delivery_Controller_Show($oShop);

	// выбираем все активные доставки
	$aShopDeliveries = $oShop->Shop_Deliveries->getAllByActive(1);

	// добавляем их в XML
	$Shop_Delivery_Controller_Show->addEntities($aShopDeliveries);

	$Shop_Delivery_Controller_Show
		->xsl(
			Core_Entity::factory('Xsl')->getByName('МагазинСписокДоставок')
		)
		->show();
?>

Далее уже редактируем xsl шаблон под свои нужды

...

Читать дальше →

shop, hostcms6, php, delivery 2 комментария


Добавление своих данных (тега) в XML _Controller_Show на HostCMS v6

Например для меню

<?php
	$Structure_Controller_Show = new Structure_Controller_Show(
		Core_Entity::factory('Site', CURRENT_SITE)
	);

	$Structure_Controller_Show->addEntity(
		Core::factory('Core_Xml_Entity')
			->name('name')
			->value('value')
	);

	$Structure_Controller_Show
		->xsl(
			Core_Entity::factory('Xsl')->getByName('ВерхнееМеню')
		)
		->show();
?>

В итоге в XML у нас появится новый тэг "name" со значением "value":

...
	<name>value</name>
...

...

Читать дальше →

informationsystem, xml, shop, structure, hostcms6, php, меню, addEntity


Избавление от элементов фотографий в карте сайта на HostCMS v6

Бывает такое, что инофрмационная система на HostCMS служит для фотогалереи и все фотографии находятся по группам на одной странице, лежат все в корне с пагинацией и работаю только как увеличение по клику, но в HostCMS это отдельный информационный элемент со своей страницей для каждой фотографии, своим title, url. Порой такие страницы просто не нужны и создают "мусор" в карте сайта.

Как избавиться от этого?

...

Читать дальше →

карта сайта, php, hostcms6, structure, shop, shop_items, informationsystem_items 1 комментарий


Снять всем товарам или определенной группе пометку экспорт в Яндекс.Маркет через SQL запрос на HostCMS v6

Для всех товаров всех магазинов

UPDATE `shop_items` SET `yandex_market` = 0;

Для всех товаров магазина с ID = 1

UPDATE `shop_items` SET `yandex_market` = 0 WHERE `shop_id` = 1;

Для всех товаров магазина с ID = 1, которые лежат в группе с ID = 2

UPDATE `shop_items` SET `yandex_market` = 0 WHERE `shop_id` = 1 AND `shop_group_id` = 2;

...

Читать дальше →

shop_items, hostcms6, sql, shop, modification_id, mysql


Ограничение вывода количества групп на HostCMS v6

<?php
	$Shop_Controller_Show = new Shop_Controller_Show(
		Core_Entity::factory('Shop', 1)
	);

	$Shop_Controller_Show
		->xsl(
			Core_Entity::factory('Xsl')->getByName('МагазинГруппыТоваровНаГлавной')
		)
		->groupsMode('all') // выбираем все группы, даже подгруппы
		->group(0) // начинаем с корня магазина, ID = 0
		->viewed(FALSE) // исключаем просмотренные товары, т.к. по умолчанию они добавляются в XML, а нам не нужна дополнительнеая нагрузка, тем более мы их не выводим в группах
		->limit(0);  // исключаем вывод товаров, если нужно

	$Shop_Controller_Show
		->shopGroups() // делаем условие для групп
		->queryBuilder()
		->limit(2); // ставим лимит на выод групп 2

	$Shop_Controller_Show->show();
?>

...

Читать дальше →

php, hostcms6, shop, shop_groups