Не зарегистрирован
Вход
Забыли пароль?
Регистрация
Подписаться
Сэкономьте время — перед вопросом на форуме узнайте, как найти ответ быстрее
По техническим проблемам необходимо обращаться в Консультационный центр

Поиск по форуму: 

Приглашаем в блог Amiro.CMS. Регулярные обзоры, опыт, решения, практикумы.

Форум  ->   Разработка плагинов, вопросы по API  ->  Обработка событий каталога

Раздел для разработчиков. Обсуждение создания плагинов, вопросы и пожелания по API Amiro.CMS

Добавлено: 17.03.14 14:51:09 #1

Партнер


Регистрация: 22.02.09
Сообщений: 466


Обратиться по имени

Здравствуйте!
На сколько я понял, в 6-й версии, после открытия модели каталога на запись, появилась возможность обрабатывать и события каталога.
Соответствующий раздел документации это подтверждает.
Однако обработать событие сохранения элемента (товара) у меня так и не получается.
Как я понял из вышеуказанного раздела документации, подходящим для этой задачи событием является v5_on_item_prepare.
Попробовал добавить обработчик:
AMI_Event::addHandler('v5_on_item_prepare', 'cstHandleSaveEshopItem', 'eshop_item');
function cstHandleSaveEshopItem($name, array $aEvent, $handlerModId, $srcModId){
	mail(...);
    return $aEvent;
}

Пробовал и такой вариант:
AMI_Event::addHandler('on_before_save_model_item', 'cstHandleSaveEshopItem', 'eshop_item');

результат тот же - письма-уведомления я не получаю.
Подскажите, в чем причина? Что я делаю не верно и как можно обрабатывать событие "перед сохранением товара"?



Добавлено: 17.03.14 15:19:16 #2

Амиро



Регистрация: 21.03.07
Сообщений: 258


Обратиться по имени

Обработчик события "v5_on_item_prepare" следует добавлять со следующим значением параметра $handlerModId:
AMI_Event::addHandler('v5_on_item_prepare', 'cstHandleSaveEshopItem', AMI_Event::MOD_ANY);
function cstHandleSaveEshopItem($name, array $aEvent, $handlerModId, $srcModId){
    if('eshop_item' === $aEvent['modId']){
        mail(...);
    }

    return $aEvent;
}



Добавлено: 17.03.14 15:37:13 #3

Партнер


Регистрация: 22.02.09
Сообщений: 466


Обратиться по имени

Спасибо! В таком варианте обработчик срабатывает.
Антон, скажите, а что означает префикс "v5" в названии события?
У меня первая ассоциация была с 5-й версией системы, т.е. или что-то устаревшее, добавленное для обратной совместимости или что-то в этом духе...



Добавлено: 17.03.14 15:46:53 #4

Амиро



Регистрация: 21.03.07
Сообщений: 258


Обратиться по имени

В таких событиях данные могут несколько отличаться от формата 6-ой версии. Например, в данном случае $aEvent['aData'] содержит массив полей вместо модели элемента.



Добавлено: 17.03.14 16:42:22 #5

Партнер


Регистрация: 22.02.09
Сообщений: 466


Обратиться по имени

Антон:
В таких событиях данные могут несколько отличаться от формата 6-ой версии.
мда... судя по всему, данные отличаются весьма существенно
$aEvent['aData'] и в событии 'on_before_save_model_item' содержит массив значений полей элемента.
А в этом событии кроме $aEvent['aData'] есть только $aEvent['modId'] и $aEvent['itemId'] и все?
При этом в $aEvent['aData'] нет даже свойств товара (custom_fields)?
Нет мета-данных?



Добавлено: 18.03.14 08:41:01 #6

Партнер


Регистрация: 22.02.09
Сообщений: 466


Обратиться по имени

Здравствуйте!
Антон, Вы не могли бы порекомендовать, каким образом решить задачу изменения данных (которых нет в массиве $aEvent['aData']) при создании нового товара или изменении существующего (при определенных условиях)?
Например, необходимо сгенерировать мета-данные по собственному алгоритму.
Однако, как я понимаю, если я сделаю это в функции обработки события 'v5_on_item_prepare' и сохраню их, то они будут просто перезаписаны при сохранении данных товара в БД.
События 'после_сохранения_элемента' я не нашел.
Подскажите, пожалуйста, как можно поступить? Какое событие использовать?

И второй вопрос - в документации есть событие 'v5_on_generate_eshop_item_keywords'
Но с ним я тоже не смог разобраться самостоятельно.
В какой момент оно возникает и/или как добавить обработчик для этого события?



Добавлено: 18.03.14 10:26:30 #7

Амиро



Регистрация: 21.03.07
Сообщений: 258


Обратиться по имени

Evgeney S.:
каким образом решить задачу изменения данных (которых нет в массиве $aEvent['aData']) при создании нового товара или изменении существующего (при определенных условиях)?

Часть данных можно задавать в обработчике этого события, но для генерации мета-данных используйте событие 'v5_on_generate_eshop_item_keywords'.
В обработчике можно задать свои значения для следующих переменных:
$aEvent['aData']['html_title'] // title
$aEvent['aData']['html_keywords'] // keywords
$aEvent['aData']['html_description'] // description



Добавлено: 18.03.14 10:56:58 #8

Партнер


Регистрация: 22.02.09
Сообщений: 466


Обратиться по имени

Антон, спасибо за ответ!
Антон:
но для генерации мета-данных используйте событие 'v5_on_generate_eshop_item_keywords'.

Уточните, пожалуйста, каким образом использовать это событие?
Я пробовал установить обработчик так
AMI_Event::addHandler('v5_on_generate_eshop_item_keywords', 'cstHandleSaveEshopItem', AMI_Event::MOD_ANY);
и так
AMI_Event::addHandler('v5_on_generate_eshop_item_keywords', 'cstHandleSaveEshopItem', 'eshop_item');
но обработчик не сработал ни разу - я пробовал удалять мета-данные у товара и сохранять его, а так же генерировать мета-данные через групповые операции.
Поэтому вопрос остается - В какой момент оно возникает и как добавить обработчик для этого события?



Добавлено: 18.03.14 11:24:03 #9



Регистрация: 22.10.12
Сообщений: 73


Обратиться по имени

Evgeney S.:
Уточните, пожалуйста, каким образом использовать это событие?


Пример использования -

AMI_Event::addHandler('v5_on_generate_eshop_item_keywords', 'cstMetaHandler', AMI_Event::MOD_ANY);

function cstMetaHandler($name, array $aEvent, $handlerModId, $srcModId) {
    foreach (
        array(
            'html_title' => 'name',
            'html_keywords' => 'keywords',
            'html_description' => 'description'
        )
    as $dstFieldName => $srcFieldName ) {
        $aEvent['aData'][$dstFieldName] = 'custom generated '.$aEvent['aData'][$srcFieldName];
        }
    return $aEvent;
    }

Код добавлен в /_local/admin_functions.php



Добавлено: 18.03.14 17:26:16 #10

Партнер


Регистрация: 22.02.09
Сообщений: 466


Обратиться по имени

Спасибо, Дмитрий!
Вы не могли бы уточнить, когда возникает это событие? При каждом сохранении товара?
И возникает ли оно при генерации мета-данных товара через групповые операции?



Добавлено: 19.03.14 10:34:14 #11



Регистрация: 22.10.12
Сообщений: 73


Обратиться по имени

Evgeney S.:
Вы не могли бы уточнить, когда возникает это событие? При каждом сохранении товара?
И возникает ли оно при генерации мета-данных товара через групповые операции?


Событие возникает при каждом сохранении товара с формы.
Если использовать групповые операции, то событие v5_on_generate_eshop_item_keywords сгенерировано не будет.



Добавлено: 19.03.14 11:00:03 #12

Партнер


Регистрация: 22.02.09
Сообщений: 466


Обратиться по имени
Добавлено: 20.03.14 10:44:39 #13

Партнер


Регистрация: 22.02.09
Сообщений: 466


Обратиться по имени

Здравствуйте!
Новый вопрос в продолжении темы ))
При генерации мета-данных необходимо так же сохранить информацию об этом факте.
Был выбран вариант сохранения даты генерации в свойство товара (кастомное поле).
И вот на этом моменте и возникает проблема.
В обработчиках событий v5_on_generate_eshop_item_keywords и v5_on_item_prepare сделать это не удается ни изменением значения в массиве $aEvent['aData']:
$aEvent['aData']['custom_field_XXX'] = YYY;
ни непосредственной записью в базу (события происходят до сохранения данных о товаре в базу и при сохранении мои изменения просто перетираются).
Скажите, пожалуйста, как решить данную задачу (изменение кастомного поля вместе с генерацией мета-данных)?
Есть ли событие "после_сохранения_товара"?
И как можно узнать больше о механизме генерации и обработки событий - какие еще события генерируются при сохранении товара, какова последовательность их возникновения, какие данные можно изменять в каждом из них, как передавать данные от одного события другому (предполагаю, что через $aEvent)?



Добавлено: 20.03.14 10:54:52 #14

Амиро



Регистрация: 21.03.07
Сообщений: 258


Обратиться по имени

В обработчике события 'v5_on_generate_eshop_item_keywords' взведите флаг, сигнализирующий об успешной генерации мета-данных:
AMI_Registry::set('custom/meta_generated', TRUE);

Добавьте обработчик события 'v5_on_item_prepare', проверяйте в нем флаг и заполняйте поле в нём:
if(TRUE === AMI_Registry::get('custom/meta_generated', FALSE)){
    AMI_Registry::delete('custom/meta_generated');
    $aEvent['aData']['custom_field_XXX'] = YYY;
}



Добавлено: 20.03.14 12:42:07 #15

Партнер


Регистрация: 22.02.09
Сообщений: 466


Обратиться по имени

1. Опытном путем установлено (сейчас еще раз проверил с использованием флага из примера), что событие 'v5_on_generate_eshop_item_keywords' возникает после события 'v5_on_item_prepare'.
Поэтому в обработчике события v5_on_item_prepare не доступен флаг, установленный при обработке события v5_on_generate_eshop_item_keywords (его еще просто не установили).
Наоборот - да, доступен.

2. В обработчике события 'v5_on_item_prepare' не удается изменить значения кастомных полей.
Т.е. конструкция вида
$aEvent['aData']['custom_field_XXX'] = YYY;
не дает никакого результата. Данные, которые есть в массиве $aEvent['aData'] - да, можно изменить. Но кастомных полей там нет...





Создать новую тему

Всего тем: 6590
Всего сообщений: 27654
Всего зарегистрированных пользователей: 47917
Последний зарегистрированный пользователь: user73294998