06 августа 2016 г. 15:19:15
$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
19 июля 2016 г. 11:02:21
Есть странность, при копировании интернет-магазина в 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 комментарий
18 июля 2016 г. 14:19:09
В ТДС в самом начеле доабвляем следующий код
Код для Интернет-магазина:
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
08 декабря 2015 г. 18:13:06
Созадем файл например observer.php в папке modules/shop/item/ со следующим содержанием:
<?php
defined('HOSTCMS') || exit('HostCMS: access denied.');
class Shop_Item_Observer
{
static public function onBeforeRedeclaredGetXml($object)
{
$oPricesOtherCurrencies = Core::factory('Core_Xml_Entity')->name('prices_other');
$oShop = $object->Shop;
$aShopCurrencies = Core_Entity::factory('Shop_Currency')->findAll();
foreach ($aShopCurrencies as $oShopCurrency)
{
$fCurrencyCoefficient = $object->shop_currency_id > 0 && $oShopCurrency->id > 0
? Shop_Controller::instance()->getCurrencyCoefficientInShopCurrency($object->Shop_Currency, $oShopCurrency)
: 0
;
$oShop_Item_Controller = new Shop_Item_Controller();
$price = $oShop_Item_Controller->getPrice($object);
$oPricesOtherCurrencies->addEntity(
Core::factory('Core_Xml_Entity')
->name('price')
->addEntity(
Core::factory('Core_Xml_Entity')
->name('value')
->value(Shop_Controller::instance()->round($price * $fCurrencyCoefficient))
)
->addEntity($oShopCurrency)
);
}
$object->addEntity($oPricesOtherCurrencies);
}
}
?>
...
Читать дальше →
hostcms6, php, shop_items, хуки
20 октября 2015 г. 16:23:13
Заходим в модуль "SQL-запросы" и делаем такой запрос:
SELECT COUNT(`id`) AS `count`
FROM `shop_items`
WHERE `shop_id` = 1 AND `active` = 1 AND `deleted` = 0
Или так, усложняем, проверяем еще активность и удалена ли группа товара:
SELECT COUNT(`shop_items`.`id`) AS `count`
FROM `shop_items`
LEFT JOIN `shop_groups` ON `shop_items`.`shop_group_id` = `shop_groups`.`id`
WHERE `shop_items`.`shop_id` = 1 AND `shop_items`.`active` = 1 AND `shop_items`.`deleted` = 0 AND `shop_groups`.`active` = 1 AND `shop_groups`.`deleted` = 0
Для чего мы делаем условия, да для того чтобы посчитать именно в нужном магазине (`shop_id` = 1), т.к. в системе могут быть несколько магазинов или остались старые товары от старого магазина, мы считаем только активные товары (`active` = 1) и не удаленные (`deleted` = 0), после чего будет видно кол-во
...
Читать дальше →
sql, hostcms6, shop_items
11 октября 2015 г. 19:01:05
Для товаров из магазина
<?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
03 октября 2015 г. 01:58:29
Бывает такое, что инофрмационная система на HostCMS служит для фотогалереи и все фотографии находятся по группам на одной странице, лежат все в корне с пагинацией и работаю только как увеличение по клику, но в HostCMS это отдельный информационный элемент со своей страницей для каждой фотографии, своим title, url. Порой такие страницы просто не нужны и создают "мусор" в карте сайта.
Как избавиться от этого?
...
Читать дальше →
карта сайта, php, hostcms6, structure, shop, shop_items, informationsystem_items
1 комментарий
30 сентября 2015 г. 23:44:25
Для всех товаров всех магазинов
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