Morozov&Pimnev blog

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

Метка - хуки.

Хук Core_Mail в HostCMS v6.2.4+

Созадем файл например observer.php в папке modules/core/mail/ со следующим содержанием:

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

class Core_Mail_Observer
{
	static public function onBeforeSend($Core_Mail)
	{
		$from = 'noreply@site.ru'; // От кого
		$fromName = 'Интернет-магазин'; // Имя отправителя

		$Core_Mail
    			->from($from)
    			->senderName($fromName)
    			->header('Return-Path', $from)
		;
	}
}
?>

Добавляем наблюдателя в bootstrap.php:

Core_Event::attach('Core_Mail.onBeforeSend', array('Core_Mail_Observer', 'onBeforeSend'));

...

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

core_event, хуки, HostCMS


Копирование групп, подгрупп и их товаров всего интернет магазина в другой магазин в 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

Создаем файл /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, хуки


Добавление собственного пункта меню в выпадающее меню в ЦА 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 v6.2+

Созадем файл например 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, хуки