Получение значений полей страницы до и после её изменения

Материал из Umicms
Версия от 21:40, 12 февраля 2014; Velross (обсуждение | вклад) (Новая страница: «'''Актуально для 2.9.5.''' ---- <p>В некоторых случаях может потребоваться информация о внесенных…»)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к:навигация, поиск

Актуально для 2.9.5.


В некоторых случаях может потребоваться информация о внесенных изменениях при редактировании страницы, например необходимо выполнять какие-либо действия при изменении определенного поля или может потребоваться вести логирование действий пользователя или в целях безопасности игнорировать внесение изменений в определенные поля и т.п.

В этих случаях нам необходимо использовать событие на изменение страницы:

systemModifyElement 
 Вызывается при сохранении изменений страницы в админке

Данное событие, несмотря на описание в документации, умеет работать в двух режимах Before (До) и After (После) передавая при этом ID пользователя, который редактирует страницу и ссылку на редактируемую страницу.

Так как для каждого режима события вызывается повторно, то чтобы сохранить для последующего сравнения значение ДО внесенных изменений необходимо объявить статическую переменную, в которой сохранить значение в режиме Before.

 1public function customMethod(iUmiEventPoint $e) {
 2    static $altNameStaticBefore;
 3    if ($e->getMode() == "before") {            
 4        $element  = $e->getRef('element');
 5	// получаем umiHierarchyElement, либо false, если страница не существует
 6	if (!$element instanceof umiHierarchyElement) {
 7	    return false;
 8	}
 9
10        $altNameStaticBefore = $element->altName;
11    }

Стоит заметить, что если получаемое поле принадлежит объекту, а не странице, то получать его нужно у объекта. Так, поле alt_name (псевдостатический адрес) свойственно только странице, однако поле name, хотя и присутствует у получаемой страницы, но проверять данное поле на изменения необходимо у объекта.

14$objId =  $element->objectId;
15$elementObject = umiObjectsCollection::getInstance()->getObject($objId);
16$nameStaticBefore = $elementObject->getName();

Производить сравнение необходимо в режиме After, вновь получая это же поле, но уже с новыми данными:

18    elseif ($e->getMode() == "after") {            
19        $element  = $e->getRef('element');
20	// получаем umiHierarchyElement, либо false, если страница не существует
21	if (!$element instanceof umiHierarchyElement) {
22	    return false;
23	}
24
25        $objId =  $element->objectId;
26        $elementObject = umiObjectsCollection::getInstance()->getObject($objId);
27        $nameAfter = $elementObject->getName();
28
29        if ($nameStaticBefore != $nameAfter) {
30            // Here your logic
31        }
32    }

Пример полностью:

 1public function customMethod(iUmiEventPoint $e) {
 2    static $altNameStaticBefore;
 3    static $nameStaticBefore;
 4    if ($e->getMode() == "before") {  
 5          
 6        $element  = $e->getRef('element');
 7	// получаем umiHierarchyElement, либо false, если страница не существует
 8	if (!$element instanceof umiHierarchyElement) {
 9	    return false;
10	}
11
12        $altNameStaticBefore = $element->altName;
13
14        $objId =  $element->objectId;
15        $elementObject = umiObjectsCollection::getInstance()->getObject($objId);
16        $nameStaticBefore = $elementObject->getName();
17
18    }   elseif ($e->getMode() == "after") {   
19         
20        $element  = $e->getRef('element');
21	// получаем umiHierarchyElement, либо false, если страница не существует
22	if (!$element instanceof umiHierarchyElement) {
23	    return false;
24	}
25
26        $altNameBefore = $element->altName;
27
28        $objId =  $element->objectId;
29        $elementObject = umiObjectsCollection::getInstance()->getObject($objId);
30        $nameAfter = $elementObject->getName();
31
32        if ($altNameStaticBefore != $altNameBefore) {
33            // Here your logic
34        }
35
36        if ($nameStaticBefore != $nameAfter) {
37            // Here your logic
38        }
39    }
40}

Примечание: не забудьте создать в папке /classes/modules/data файл custom_events.php с объявлением события

1<?php
2    new umiEventListener('systemModifyElement', 'data', 'customMethod');
3?>