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

Материал из Umicms
Перейти к:навигация, поиск
Строка 1: Строка 1:
'''Актуально для версии 2.9'''
+
'''Актуально для версии 20'''
 +
 
 +
== Задача ==
 +
 
 +
При создании новой фотографии для фотогалереи копировать эту фотографию в другую языковую версию
 +
 
 +
== Решение ==
  
 
Если на сайте несколько языковых версий, то добавлять материалы, не содержащие текста, такие как фотографии можно одинаковые во все языковые версии. Воспользуемся для этого событийной моделью UMI.CMS.
 
Если на сайте несколько языковых версий, то добавлять материалы, не содержащие текста, такие как фотографии можно одинаковые во все языковые версии. Воспользуемся для этого событийной моделью UMI.CMS.
 
Для того, чтобы при добавлении фотографии, создавалась её виртуальная копия в другой языковой версии, напишем обработчик события systemCreateElement.
 
Для того, чтобы при добавлении фотографии, создавалась её виртуальная копия в другой языковой версии, напишем обработчик события systemCreateElement.
В файле ~/classes/modules/content/custom_events.php размещаем код вызова обработчика:
+
 
 +
1. Для добавления обработчика события нужно создать файл ~/classes/components/content/custom_events.php и в него добавить сдедующий код::
 
<source lang="php">
 
<source lang="php">
 
<?php
 
<?php
 
new umiEventListener('systemCreateElement', 'content', 'copy_on_other_lang');
 
new umiEventListener('systemCreateElement', 'content', 'copy_on_other_lang');
?>
+
 
 
</source>
 
</source>
сам обработчик поместим в файл ~/classes/modules/content/__custom.php после строки //TODO: Write here your own macroses, код обработчика будет примерно следующий:
+
 
 +
2. Сам обработчик нужно поместить в файл ~/classes/components/content/customMacros.php. Код обработчика будет примерно следующий:
 
<source lang="php">
 
<source lang="php">
 
<?php
 
<?php
public function copy_on_other_lang(iUmiEventPoint $oEventPoint) {
+
 
if ($oEventPoint->getMode() === "after"){
+
/** Класс пользовательских макросов */
  $object = $oEventPoint->getRef("element");
+
class ContentCustomMacros {
  $id=$object->id;
+
 
  $parentId=$object->getParentId();
+
/** @var content $module */
  $hierarchy = umiHierarchy::getInstance();
+
public $module;
  $module=$object->getModule();
+
  //Если модуль photoalbum, выполняем копирование
+
public function copy_on_other_lang(iUmiEventPoint $oEventPoint) {
  if($module=='photoalbum'){
+
if ($oEventPoint->getMode() === "after") {
  $newPhoto=$hierarchy->copyElement($id,$parentId);
+
$object = $oEventPoint->getRef("element");
  $hierarchy = umiHierarchy::getInstance();
+
$module = $object->getModule();
  $photo=$hierarchy->getElement($newPhoto);
+
//Если модуль photoalbum, выполняем копирование
  $photo->setLangId(2);
+
if ($module == 'photoalbum') {
  $hierarchy->moveFirst($newPhoto,157);
+
$hierarchy = umiHierarchy::getInstance();
  $photo->commit();
+
$parentId = $object->getParentId();
  }
+
$newPhoto = $hierarchy->copyElement($object->id, $parentId);
  return true;
+
$hierarchy = umiHierarchy::getInstance();
}
+
$photo = $hierarchy->getElement($newPhoto);
}
+
$photo->setLangId(2);
 +
$hierarchy->moveFirst($newPhoto, 343);
 +
$photo->commit();
 +
}
 +
return true;
 +
}
 +
}
 +
}
 +
 
?>
 
?>
 
</source>
 
</source>
в данном случае, при добавлении фотографии будет создана её виртуальная копия в языковой версии с id 2 в фотогалерею с id 157. Если требуется производить копирование ещё в несколько языковых версий, следует повторить для каждой языковой версии участок кода
+
в данном случае, при добавлении фотографии будет создана её виртуальная копия в языковой версии с id 2 в фотогалерею с id 343. Если требуется производить копирование ещё в несколько языковых версий, следует повторить для каждой языковой версии участок кода
 
<source lang="php">
 
<source lang="php">
 
<?php
 
<?php
  $newPhoto=$hierarchy->copyElement($id,$parentId);
+
$newPhoto = $hierarchy->copyElement($object->id, $parentId);
  $hierarchy = umiHierarchy::getInstance();
+
$hierarchy = umiHierarchy::getInstance();
  $photo=$hierarchy->getElement($newPhoto);
+
$photo = $hierarchy->getElement($newPhoto);
  $photo->setLangId(id_языковой_версии);
+
$photo->setLangId(/*id_языковой_версии*/);
  $hierarchy->moveFirst($newPhoto,id_фотогалереи_в_другой_языковой_версии);
+
$hierarchy->moveFirst($newPhoto, /*id_фотогалереи_в_другой_языковой_версии*/);
  $photo->commit();
+
$photo->commit();
 
?>
 
?>
 
</source>
 
</source>
 
указывая необходимые id языковой версии и фотогалереи в ней. Если требуется копирование страницы, а не создание виртуальной копии, то в обработчике нужно заменить copyElement на cloneElement.
 
указывая необходимые id языковой версии и фотогалереи в ней. Если требуется копирование страницы, а не создание виртуальной копии, то в обработчике нужно заменить copyElement на cloneElement.
Для работы обработчика, необходимо также добавить в файл ~/classes/modules/content/permissions.custom.php запись об этом кастомном методе:
+
3. Для работы обработчика, необходимо добавить в файл ~/classes/components/content/permissions.custom.php права на этот кастомный метод:
 
<source lang="php">
 
<source lang="php">
 
<?php
 
<?php
Строка 51: Строка 67:
 
'sitetree' => Array('copy_on_other_lang')
 
'sitetree' => Array('copy_on_other_lang')
 
);
 
);
?>
+
 
 
</source>
 
</source>
<p>
+
 
Данный функционал был проверен на работоспособность в версии системы 2.8.5.2.
+
Теперь при создании нового изображения в фотоальбоме его виртуальная копия будет создана и на других языковых версиях.
</p>
+
 
 
[[Категория:Модуль Фотогалереи]][[Категория:Написание кастомных макросов]]
 
[[Категория:Модуль Фотогалереи]][[Категория:Написание кастомных макросов]]

Версия 12:00, 31 мая 2019

Актуально для версии 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')
);

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