Morozov&Pimnev blog

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

Метка - hostcms6.

Удаление значений несуществующих товаров на HostCMS v6

DELETE `property_value_strings`
FROM `property_value_strings`
LEFT JOIN `shop_items` ON `property_value_strings`.`entity_id` = `shop_items`.`id`
WHERE `shop_items`.`id` IS NULL

DELETE `shop_warehouse_items`
FROM `shop_warehouse_items`
LEFT JOIN `shop_items` ON `shop_warehouse_items`.`shop_item_id` = `shop_items`.`id` 
WHERE `shop_items`.`id` IS NULL

SELECT `shop_item_prices`.`id`, `shop_items`.`id`
FROM `shop_item_prices`
LEFT JOIN `shop_items` ON `shop_item_prices`.`shop_item_id` = `shop_items`.`id`
WHERE `shop_items`.`id` IS NULL

...

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

sql, mysql, hostcms6


SQL запрос, проставить всем узлам в структуре сайта отметку "Доступ через HTTPS" для HostCMS v6

UPDATE structures SET https = 1 WHERE site_id = 1;

...

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

sql, hostcms6, HostCMS, structure


Удаление значений свойств у товаров

Удалить все свойства тип "Строка" с ID = 999 у всех товаров

DELETE FROM property_value_strings WHERE property_id = 999;

Удалить все свойства тип "Строчка" с ID = 998 и ID = 999 у всех товаров

DELETE FROM property_value_strings WHERE property_id IN (998,999)

Если удалили большое количество свойств (большое количество — это несколько сотен), то оптимизируем таблицу, при удалении пары десятков не имеет смысла.

OPTIMIZE TABLE property_value_strings;

Какие типы свойств к какой таблице относятся:

property_value_datetimes - "Дата [type=8]", "Дата-время [type=9]"
property_value_files - "Файл [type=2]"
property_value_floats - "Число с плавающей запятой [type=11]"
property_value_ints - "Список[type=3]", "Информационная система [type=5]", "Флажок [type=7]", "Интернет-магазин [type=12]"
property_value_strings - "Строка [type=1]", "Скрытое поле [type=10]"
property_value_texts - "Большое текстовое поле [type=4]", "Визуальный редактор [type=6]"

...

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

sql, mysql, hostcms6, property


Вычисляем абсолютную цену товара в зависимости от валюты, скидки и налога и сортируем по ней в 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

Создаем файл /modules/admin/form/action/controller/type/edit/observer.php со следующим содержимым:

<?php

/* Добавление/скрытие полей форм ЦА HostCMS v6 */

defined('HOSTCMS') || exit('HostCMS: access denied.');

class Admin_Form_Action_Controller_Type_Edit_Observer
{
	// либо public static function onAfterRedeclaredPrepareForm($controller, $args)
	// Генерация стандартной формы редактирования осуществляется методом _prepareForm() контроллера Admin_Form_Action_Controller_Type_Edit. Далее в методе класса потомка, например Shop_Controller_Edit, осуществляется перемещение полей по вкладкам и для корректировки уже этого перемещения необходимо использовать событие Admin_Form_Action_Controller_Type_Edit.onAfterRedeclaredPrepareForm.
	public static function onBeforeExecute($controller, $args)
	{
		list($operation, $Admin_Form_Controller) = $args;

		if(is_null($operation))
		{
			// Данное событие будет вызываться для всех форм, определяем с каким контроллером работаем
			switch(get_class($controller))
			{
				// Редактирование информационной системы
				case 'Informationsystem_Controller_Edit':
					// Получаем доступ к вкладке "Основные"
					$mainTab = $controller->getTab('main');
					// Если вдруг мы добавили новый столбец 'sign' в БД то система будет ругаться "Key 'sign' in 'ru' language does not exist for model 'informationsystem'."
					// Конечно же в файл /modules/informationsystem/i18n/ru.php мы ничего внести не может, как оказалось он затирается, для этого делаем следующее
					$controller->getField('sign')->caption("Подпись");

					// Удаляем поле "Сортировка" с вкладки "Основные"
					$mainTab->delete($controller->getField('sorting'));

					// Добавляем произвольное поле на вкладку "Основные"
					// либо до/после (addBefore/addAfter) уже существующего поля
					$customFiled = Admin_Form_Entity::factory('Input')->name("custom");
					$mainTab->addAfter($customFiled, $controller->getField('name'));
					// либо просто добавляем, в большем случае в конце
					$mainTab->add($customFiled);
				break;

			}
		}
	}
}

В файле bootstrap.php в конце добавляем следующую строчку:

// Добавление/скрытие полей форм ЦА
Core_Event::attach('Admin_Form_Action_Controller_Type_Edit.onBeforeExecute', array('Admin_Form_Action_Controller_Type_Edit_Observer', 'onBeforeExecute'));
// либо Core_Event::attach('Admin_Form_Action_Controller_Type_Edit.onAfterRedeclaredPrepareForm', array('Admin_Form_Action_Controller_Type_Edit_Observer', 'onAfterRedeclaredPrepareForm'));
// если первое не работает

...

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

php, core_event, hostcms6, хуки


TinyMCE v.3.5: добавление ссылки на файл в HostCMS v6.2.4+

1. Пишем текст, на котором будет ссылка на файл, выделяем его и нажимаем на панели редактора кнопку "Добавить/Изменить ссылку":

...

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

tinymce, hostcms6, wysiwyg


Добавление собственного пункта меню в выпадающее меню в ЦА HostCMS v6

Создаем файл /modules/admin/form/controller/observer.php со следующим содержимым:

<?php

/* Добавление собственного пункта меню в выпадающее меню в ЦА HostCms v6 */

defined('HOSTCMS') || exit('HostCMS: access denied.');

class Admin_Form_Controller_Observer
{
	public static function onBeforeAddEntity($controller, $args)
	{
		list($oAdmin_Form_Entity) = $args;

		if($controller->getAdminForm()->id == 65) // Интернет-магазин, товары и группы, id нужной формы можно посмотреть в Формах центра администрирования
		{
			if (strpos(get_class($oAdmin_Form_Entity), 'Admin_Form_Entity_Menus') !== FALSE)
			{
				$aChildren = $oAdmin_Form_Entity->getChildren();

				$sProperties = '/admin/shop/item/import/mymenu/index.php';

				$oShop = Core_Entity::factory('Shop', Core_Array::getGet('shop_id', 0));
				$oShopGroup = Core_Entity::factory('Shop_Group', Core_Array::getGet('shop_group_id', 0));

				$additionalParams = "shop_id={$oShop->id}&shop_group_id={$oShopGroup->id}";
				// удаление пункта меню с индексом 5 или шестой по счету
				//$aChildren[0]->deleteChild(5);

				// Добавляем потомка первому элементу меню
				$aChildren[0]->add(
					Admin_Form_Entity::factory('Menu')
						->name('Мое меню')
						->icon('fa fa-download icon-separator')
						->href($controller->getAdminLoadHref($sProperties, NULL, NULL, $additionalParams))
						->onclick($controller->getAdminLoadAjax($sProperties, NULL, NULL, $additionalParams))
				);
			}
		}
	}
}

В файле bootstrap.php в конце добавляем следующую строчку:

// Добавление собственного пункта меню в выпадающее меню в ЦА
Core_Event::attach('Admin_Form_Controller.onBeforeAddEntity', array('Admin_Form_Controller_Observer', 'onBeforeAddEntity'));

...

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

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


Вывод ассоциативного массива на странице сайта и показ его только администраторам в HostCMS v5 и v6

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

HostCMS v6

<?php
	echo("<pre>");
	Core_Auth::logged() && print_r($asArray); //$aArray - ваш массив данных
	echo("</pre>");
?>

или так:

<?php
	if(Core_Auth::logged())
	{
		echo("<pre>");
		print_r($asArray); //$aArray - ваш массив данных
		echo("</pre>");
	}
?>

HostCMS v5

<?php
	$kernel = & singleton('kernel');
	$result = $kernel->GetCurrentUser();
	echo("<pre>");
	$result && print_r($asArray); //$aArray - ваш массив данных
	echo("</pre>");
?>

или так:

<?php
	$kernel = & singleton('kernel');
	$result = $kernel->GetCurrentUser();
	if($result)
	{
		echo("<pre>");
		print_r($asArray); //$aArray - ваш массив данных
		echo("</pre>");
	}
?>

...

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

hostcms5, php, hostcms6, core_auth