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

Материал из Umicms
Версия от 23:08, 12 февраля 2014; Velross (обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к:навигация, поиск

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


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

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

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

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

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

 1 public 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     }

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

 1 public 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 ?>