Как в MODX запретить дубли заголовков (pagetitle)
Зачем нужна проверка дублей pagetitle в MODX?
Если вы работаете с MODX Revolution, особенно на сайтах с большим объёмом контента — блогах, каталогах или разделах услуг, — вы наверняка сталкивались с ситуацией, когда по ошибке создаются две страницы с одинаковым заголовком. Проблема в том, что MODX по умолчанию не проверяет уникальность поля pagetitle, в отличие от alias, где дубли уже контролируются системой.
Это может привести к:
- Путанице при редактировании контента,
- Ошибкам в навигации,
- Сложностям при управлении сайтом, особенно если редакторов несколько.
Но эту проблему легко решить с помощью простого, но эффективного плагина.
Как работает плагин по проверке дублей?
Идея проста: при попытке сохранить ресурс система автоматически проверяет, существует ли уже активный ресурс с таким же pagetitle. При этом:
- Сравнение идёт без учёта регистра: «О нас», «о нас» и «О НАС» считаются одинаковыми.
- Поиск охватывает весь сайт, независимо от родительского раздела.
- Текущий редактируемый ресурс исключается из поиска, чтобы можно было свободно редактировать страницу.
Если дубликат найден:
- Сохранение отменяется,
- Пользователю выводится понятное предупреждение,
- В сообщении указывается ID найденного ресурса — это позволяет быстро перейти к нему и проверить.
Преимущества решения
Такой подход помогает:
- Поддерживать порядок в структуре сайта,
- Избегать случайных ошибок,
- Упрощать работу команды редакторов.
Теперь никто случайно не создаст статью с уже существующим названием.
Техническая реализация
Плагин срабатывает на событии OnBeforeDocFormSave, что позволяет прервать процесс сохранения до внесения изменений в базу данных. Это обеспечивает надёжность и безопасность.
Механизм — отличный пример того, как небольшой объём кода может значительно улучшить удобство работы с MODX. Он:
- Не нагружает систему,
- Работает мгновенно,
- Интегрируется в админку без лишних элементов интерфейса.
Когда это особенно полезно?
Обязательно установите такую проверку, если вы ведёте:
- Блог или новостной сайт,
- Каталог товаров или услуг,
- Сайт с несколькими контент-редакторами.
Настройка займёт всего пару минут, а польза от неё — на годы вперёд.
Код плагина CheckDuplicatePagetitle
Вот готовый рабочий код плагина, который можно сразу использовать:
<?php
if ($modx->event->name !== 'OnBeforeDocFormSave') return;
$resource = $modx->event->params['resource'];
$id = $resource->get('id');
$pagetitle = trim($resource->get('pagetitle'));
if (empty($pagetitle)) { $modx->event->output("Заголовок (pagetitle) не может быть пустым."); return;
}
$q = ['pagetitle' => $pagetitle];
if ($id) { $q['id:!='] = $id;
}
$q['deleted'] = 0;
$second = $modx->getObject('modResource', $q);
if (!$second) { $c = $modx->newQuery('modResource'); $c->where([ 'UPPER(pagetitle)' => strtoupper($pagetitle), 'deleted' => 0, ]); if ($id) { $c->where(['id:!=' => $id]); } $second = $modx->getObject('modResource', $c);
}
if ($second) { $duplicateId = $second->get('id'); $modx->event->output("Ресурс с таким названием уже существует (ID: {$duplicateId}). Задайте другое название.");
}