Получение значений полей страницы до и после её изменения
Актуально для 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 ?>