События (хуки)

Модератор
События (хуки)
Система событий позволяет пользователям взаимодействовать с классами ядра HostCMS. По запросам пользователей система событий может быть значительно расширена.

Более подробная документация: http://www.hostcms.ru/documentation/modules/core/events/

Пример добавления наблюдателей для класса Xsl_Processor с целью подсчета времени обработки XML.

Core_Event::attach('Xsl_Processor.onBeforeProcess', array('Xsl_Processor_Observer', 'onBeforeProcess'));
Core_Event::attach('Xsl_Processor.onAfterProcess', array('Xsl_Processor_Observer', 'onAfterProcess'));
Re: События (хуки)
Здравствуйте, я хотел попробовать навесить хук на выполнение запросов в БД, но почему-то не выходит. Для этого я создал файл test.php в корне сайта. Вот его содержимое:

<?php

  include_once ('./bootstrap.php');

  function logSqlQuery ($sql) {
    echo "> $sql\n\n";
  }

  Core_Event::attach ('Core_DataBase.onBeforeQuery', 'logSqlQuery');

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


При запуске из консоли ни одного SQL-запроса не выдает. В чем может быть дело?
шах и мат, атеисты
Модератор
Re: События (хуки)
А если так
$oShop = Core_Entity::factory ('Shop', 1);
echo $oShop->name;
Re: События (хуки)
Да, спасибо, теперь все работает. Я так понимаю, реализована ленивая загрузка? В том смысле, что запрос в БД идет только тогда, когда обращаемся к незагруженному из БД свойству требуемого объекта?
шах и мат, атеисты
Модератор
Re: События (хуки)
Именно так, в ORM ленивая загрузка и другие решения по оптимизации.
Модератор
Re: События (хуки)
Пример добавления своего тега в XML всех объектов Shop_Item
1. Пишем класс наблюдателя, размещаем его в modules/shop/item/observer.php
<?php

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

/**
* Shop item observer
*
* @package HostCMS 6
* @version 6.x
* @author Hostmake LLC
* @copyright © 2005-2012 ООО "Хостмэйк" (Hostmake LLC), http://www.hostcms.ru
*/
class Shop_Item_Observer
{
   static public function onBeforeGetXml($object, $args)
   {
      // Добавить новый тег, равный price * 2
      $object->addXmlTag('myTag', $object->price * 2);
   }
}

2. Добавляем наблюдается в bootstrap.php
// Add shop_item observer
Core_Event::attach('shop_item.onBeforeGetXml', array('Shop_Item_Observer', 'onBeforeGetXml'));

3. Enjoy
Re: События (хуки)
а как будет правильно удалить тег, приведите пожалуйста пример хоть на том же классе
Модератор
Re: События (хуки)
// Запретить генерацию стандартного тега в XML объекта
$object->addForbiddenTag('text');
Модератор
Re: События (хуки)
Пример добавления блока <isbn> при экспорте в Яндекс.Маркет. Значение берется из доп. св-ва товара с названием в XML "ISBN".
Добавляем наблюдается в типовую дин. страницу экспорта в Яндекс.Маркет
class Shop_Controller_YandexMarket_Observer
{
   static public function onAfterOffer($object, $args)
   {
      $oShop_Item = $args[0];
      $linkedObject = Core_Entity::factory('Shop_Item_Property_List', $oShop_Item->shop_id);
      $oProperty = $linkedObject->Properties->getByTag_name('ISBN');

      if ($oProperty)
      {
         $aPropertyValues = $oProperty->getValues($oShop_Item->id);

         if (isset($aPropertyValues[0]))
         {
            echo '<isbn>' . Core_Str::xml(trim($aPropertyValues[0]->value)) . '</isbn>'. "\n";
         }
      }
   }
}

Core_Event::attach('Shop_Controller_YandexMarket.onAfterOffer', array('Shop_Controller_YandexMarket_Observer', 'onAfterOffer'));
Модератор
Re: События (хуки)
Пример ограничения выводимых тегов инфоэлемента для значений доп. св-ва типа инфосистема.

Core_Event::attach('property_value_int.onBeforeGetXml', array('Property_Value_Int_Observer', 'onBeforeGetXml'));

class Property_Value_Int_Observer
{
   static public $aForbiddenTags = array('shortcut_id', 'shop_tax_id', 'shop_id', 'active', 'sorting', 'path', 'indexing', 'image_small_height', 'image_small_width', 'user_id', 'guid', 'siteuser_group_id', 'siteuser_id', 'shop_seller_id', 'shop_currency_id', 'shop_group_id', 'shop_producer_id', 'shop_producer','shop_measure_id', 'vendorcode', 'description', 'weight', 'seo_title', 'seo_description', 'seo_keywords', 'image_large_height', 'image_large_width', 'yandex_market', 'rambler_pokupki', 'yandex_market_bid', 'yandex_market_cid', 'yandex_market_sales_notes', 'showed', 'deleted', 'date', 'rest');

   static public function onBeforeGetXml($object, $args)
   {
      $oProperty = $object->Property;

      // Property type is informationsystem
      if ($oProperty->type == 5 && $object->value != 0 && Core::moduleIsActive('informationsystem'))
      {
         $oInformationsystem_Item = $object->Informationsystem_Item;
         
         foreach (self::$aForbiddenTags as $sForbiddenTag)
         {
            $oInformationsystem_Item->addForbiddenTag($sForbiddenTag);
         }
      }
   }
}
Авторизация