Автоматическое копирование фотографии в другую языковую версию — различия между версиями
Mad grant (обсуждение | вклад) |
Vitaliks (обсуждение | вклад) |
||
(не показана 1 промежуточная версия этого же участника) | |||
Строка 1: | Строка 1: | ||
− | '''Актуально для версии | + | '''Актуально для версии 20''' |
+ | |||
+ | == Задача == | ||
+ | |||
+ | При создании новой фотографии для фотогалереи копировать эту фотографию в другую языковую версию | ||
+ | |||
+ | == Решение == | ||
Если на сайте несколько языковых версий, то добавлять материалы, не содержащие текста, такие как фотографии можно одинаковые во все языковые версии. Воспользуемся для этого событийной моделью UMI.CMS. | Если на сайте несколько языковых версий, то добавлять материалы, не содержащие текста, такие как фотографии можно одинаковые во все языковые версии. Воспользуемся для этого событийной моделью UMI.CMS. | ||
Для того, чтобы при добавлении фотографии, создавалась её виртуальная копия в другой языковой версии, напишем обработчик события systemCreateElement. | Для того, чтобы при добавлении фотографии, создавалась её виртуальная копия в другой языковой версии, напишем обработчик события systemCreateElement. | ||
− | + | ||
+ | 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> | ||
− | + | ||
+ | 2. Сам обработчик нужно поместить в файл ~/classes/components/content/customMacros.php. Код обработчика будет примерно следующий: | ||
<source lang="php"> | <source lang="php"> | ||
<?php | <?php | ||
− | public function copy_on_other_lang(iUmiEventPoint $oEventPoint) { | + | |
− | + | /** Класс пользовательских макросов */ | |
− | + | 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; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
?> | ?> | ||
</source> | </source> | ||
− | в данном случае, при добавлении фотографии будет создана её виртуальная копия в языковой версии с id 2 в фотогалерею с id | + | в данном случае, при добавлении фотографии будет создана её виртуальная копия в языковой версии с id 2 в фотогалерею с id 343. Если требуется производить копирование ещё в несколько языковых версий, следует повторить для каждой языковой версии участок кода |
<source lang="php"> | <source lang="php"> | ||
<?php | <?php | ||
− | + | $newPhoto = $hierarchy->copyElement($object->id, $parentId); | |
− | + | $hierarchy = umiHierarchy::getInstance(); | |
− | + | $photo = $hierarchy->getElement($newPhoto); | |
− | + | $photo->setLangId(/*id_языковой_версии*/); | |
− | + | $hierarchy->moveFirst($newPhoto, /*id_фотогалереи_в_другой_языковой_версии*/); | |
− | + | $photo->commit(); | |
?> | ?> | ||
</source> | </source> | ||
указывая необходимые id языковой версии и фотогалереи в ней. Если требуется копирование страницы, а не создание виртуальной копии, то в обработчике нужно заменить copyElement на cloneElement. | указывая необходимые id языковой версии и фотогалереи в ней. Если требуется копирование страницы, а не создание виртуальной копии, то в обработчике нужно заменить copyElement на cloneElement. | ||
− | Для работы обработчика, необходимо | + | |
+ | 3. Для работы обработчика, необходимо добавить в файл ~/classes/components/content/permissions.custom.php права на этот кастомный метод: | ||
<source lang="php"> | <source lang="php"> | ||
<?php | <?php | ||
Строка 51: | Строка 68: | ||
'sitetree' => Array('copy_on_other_lang') | 'sitetree' => Array('copy_on_other_lang') | ||
); | ); | ||
− | + | ||
</source> | </source> | ||
− | + | ||
− | + | Теперь при создании нового изображения в фотоальбоме его виртуальная копия будет создана и на других языковых версиях. | |
− | + | ||
[[Категория:Модуль Фотогалереи]][[Категория:Написание кастомных макросов]] | [[Категория:Модуль Фотогалереи]][[Категория:Написание кастомных макросов]] |
Текущая версия на 12:06, 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')
);
Теперь при создании нового изображения в фотоальбоме его виртуальная копия будет создана и на других языковых версиях.