, висловлюючись в термінах системи, установки значення властивості з кодом MAIN_METAMARK елемента інформаційного блоку «Ігри» при зміну, видалення або додаванні елемента інформаційного блоку «Огляди», в якому в значення властивості з кодом GAME_ID збігається з ідентифікатором елемента інформаційного блоку «Ігри». Але вносити зміни в сценарії роботи панелі управління системи не рекомендується. Таким чином, актуальним стає питання, як можна перехопити подія додавання елемента інформаційного блоку.
Для вирішення такого типу проблем у системі передбачена технологія подій і обробників подій панелі управління. При реалізації зазначеного в попередньому абзаці вимоги необхідно використовувати такі типи подій:
- Подія додавання елемента інформаційного блоку. Нас цікавить подія, що наступає при успішному додаванні елемента. В системі дана подія має код «OnAfterIblockElementAdd»;
- Подія зміни елемента інформаційного блоку. Код - «OnAfterIblockElementUpdate»;
- Подія видалення елемента інформаційного блоку. Код - «OnBeforeIblockElementDelete»;
Маючи можливість перехоплення і обробки зазначених вище подій, можна вибудувати алгоритм реалізації вимоги.
- Отримати дані елемента інформаційного блоку, що бере участь у події;
- Визначити інформаційний блок, якому належить елемент
- Якщо інформаційний блок не відповідає інформаційному блоку «Огляди», припинити обробку події;
- Визначити змінюваний елемент інформаційного блоку «Ігри» (властивість з кодом GAME_ID);
- Провести розрахунок і привласнити отриманий результат властивості за кодом MAIN_METAMARK елемента інформаційного блоку «Ігри».
Щоб зареєструвати обробник, необхідно скористатися вбудованою функцією API системи:
void AddEventHandler (string from_module_id, string event_id, mixed callback, int sort=100, mixed full_path=false)
from_module_id - ідентифікатор модуля, який буде ініціювати подія; _id - ідентифікатор події; - назва функції обробника;
sort - черговість (порядок), в якому виконується даний обробник; _path - повний шлях до файлу для підключення при виникненні події перед викликом callback;
У нашому випадку, реєстрація обробників подій буде виглядати наступним чином:
AddEventHandler («iblock», «OnAfterIblockElementAdd», «add_review_handler»); («iblock», «OnAfterIblockElementUpdate», «add_review_handler»); («iblock», «OnBeforeIblockElementDelete», «delete_review_handler») ;
Для реалізації алгоритму, зазначеного вище, написано дві функції:
void delete_review_handler (int ID)
Функція - обробник події видалення елемента інформаційного блоку з ідентифікатором ID.
void add_review_handler (array & arFields)
Функція - обробник події додавання елемента інформаційного блоку. $ ArFields - передається за посиланням масив з даними доданого елемента. Ця ж функція обробляє і подія зміни елементу.
Таким чином, вимога по автоматичному підрахунку оцінки гри за оцінками оглядів може бути реалізоване без зміни сценаріїв панелі управл...