MODX — гибкая и мощная система управления контентом (CMS), которая позволяет легко адаптировать функциональность под любые потребности. Одной из распространённых задач при работе с MODX является транслитерация имён загружаемых файлов, особенно если сайт работает на кириллическом контенте или других алфавитах, отличных от латинского. В этой статье рассмотрим, зачем нужна транслитерация, какие проблемы она решает и как её настроить в MODX.
Зачем нужна транслитерация?
- Улучшение URL и SEO: Файлы с кириллическими именами могут создавать некорректные ссылки, что негативно влияет на индексацию поисковыми системами.
- Совместимость с серверами: Некоторые серверы и файловые системы не поддерживают кириллицу или другие нестандартные символы, что может привести к ошибкам при обработке файлов.
- Эстетика и удобство: Транслитерированные имена файлов легче читаются и лучше воспринимаются пользователями и администраторами сайта.
Способы транслитерации файлов
MODX 3
Если у вас сайт работает на MODX 3, вам достаточно установить у настроить пакет translit (и сделать настройки ЧПУ), после этого все загружаемые фалы должны транслитерироваться. Если этого не происходит, проверьте системную настройку upload_translit, она должна быть включена.
MODX 2
В modx 2 системной настройки upload_translit нет, да и работает с ним не только translit, но и более продвинутые плагины транслитерации, такие как Translitor и gTranslit, поэтому путей у нас намного больше.
1. Использование дополнений «translit» + «filetranslit»
Если для ЧПУ вы уже используете дополнение translit, то самое простое решение установить еще дополнение из MODX репозитория, под названием filetranslit.
2. Использование дополнения «translit» + свой плагин
Не хотите устанавливать filetranslit или он у вас не работает, можно поступить к примеру так:
- Добавьте новую системную настройку
upload_translit
. - Установите её значение в
1
(включено). - Перейдите в Элементы → Плагины и создайте новый плагин.
- Привяжите его к событию
OnFileManagerUpload
. - Добавьте следующий код:
<?php $modx->getService('translit', 'modTransliterate'); foreach ($files as $file) { if ($file['error'] == 0) { $newName = $modx->translit->sanitize($file['name'], 'russian'); $oldPath = $file['tmp_name']; $newPath = dirname($oldPath) . '/' . $newName; rename($oldPath, $newPath); } }
Этот код транслитерирует имя файла при загрузке, заменяя оригинальное имя новым.
3. Использование любых плагинов транслитерации + свой плагин
Если вам требуется особая логика транслитерации, можно создать пользовательский плагин.
<?php
setlocale(LC_ALL, 'ru_RU.utf8'); //фикс для неправильных серверов, иначе не будет работать patchinfo с кириллицей
$fullPath = $source->getBases()['pathAbsolute'].$directory; //получаем абсолютную директорию
$dir = scandir($fullPath);
foreach ($files as $key => $file) {
$info = pathinfo($file['name']);
$name = $info['filename'];
$name = modResource::filterPathSegment($modx, $name); //транслитерация
$extension = $info['extension'];
$fullname = $name.'.'.$extension;
//ищем файлы с таким же названием в этой директории
if (!in_array($fullname, $dir)) {
$newFullName = $fullname;
} else {
$newFullName = $name.'_'.rand(1,999999).'.'.$extension;
}
$file['name'] = $newFullName;
$modx->event->params['file'] = $file; //отдаем измененную переменную file
$files[$key] = $file;
}
$modx->event->params['files'] = $files; //отдаем измененную переменную files
Его нужно повесить на событие: OnFileManagerBeforeUpload.
Данный плагин дружит с любыми дополнениями транслитерации: translit, gTranslit и Translitor + если имя не уникально, то ему добавиться префикс.
Заключение
Транслитерация файлов в MODX — важная часть настройки системы для обеспечения совместимости, улучшения SEO и повышения удобства работы с файлами. Использование встроенных возможностей MODX или создание пользовательских плагинов позволяет адаптировать систему под любые требования. Правильная настройка транслитерации сделает ваш сайт более стабильным и удобным для пользователей.