Автоматическое копирование фотографии в другую языковую версию

Материал из Umicms
Перейти к:навигация, поиск

Актуально для версии 20

Задача

При создании новой фотографии для фотогалереи копировать эту фотографию в другую языковую версию

Решение

Если на сайте несколько языковых версий, то добавлять материалы, не содержащие текста, такие как фотографии можно одинаковые во все языковые версии. Воспользуемся для этого событийной моделью UMI.CMS. Для того, чтобы при добавлении фотографии, создавалась её виртуальная копия в другой языковой версии, напишем обработчик события systemCreateElement.

1. Для добавления обработчика события нужно создать файл ~/classes/components/content/custom_events.php и в него добавить сдедующий код::

<?php
	new umiEventListener('systemCreateElement', 'content', 'copy_on_other_lang');

2. Сам обработчик нужно поместить в файл ~/classes/components/content/customMacros.php. Код обработчика будет примерно следующий:

<?php

	/** Класс пользовательских макросов */
	class ContentCustomMacros {

		/** @var content $module */
		public $module;
		
		public function copy_on_other_lang(iUmiEventPoint $oEventPoint) {
			if ($oEventPoint->getMode() === "after") {
				$object = $oEventPoint->getRef("element");						
				$module = $object->getModule();
				//Если модуль photoalbum, выполняем копирование
				if ($module == 'photoalbum') {
					$hierarchy = umiHierarchy::getInstance();
					$parentId = $object->getParentId();	
					$newPhoto = $hierarchy->copyElement($object->id, $parentId);
					$hierarchy = umiHierarchy::getInstance();
					$photo = $hierarchy->getElement($newPhoto);
					$photo->setLangId(2);
					$hierarchy->moveFirst($newPhoto, 343);
					$photo->commit();
				}
				return true;
			}
		}
	}
	
?>

в данном случае, при добавлении фотографии будет создана её виртуальная копия в языковой версии с id 2 в фотогалерею с id 343. Если требуется производить копирование ещё в несколько языковых версий, следует повторить для каждой языковой версии участок кода

<?php
	$newPhoto = $hierarchy->copyElement($object->id, $parentId);
	$hierarchy = umiHierarchy::getInstance();
	$photo = $hierarchy->getElement($newPhoto);
	$photo->setLangId(/*id_языковой_версии*/);
	$hierarchy->moveFirst($newPhoto, /*id_фотогалереи_в_другой_языковой_версии*/);
	$photo->commit();
?>

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

3. Для работы обработчика, необходимо добавить в файл ~/classes/components/content/permissions.custom.php права на этот кастомный метод:

<?php
$permissions = Array(
'sitetree' => Array('copy_on_other_lang')
);

Теперь при создании нового изображения в фотоальбоме его виртуальная копия будет создана и на других языковых версиях.