CMS DLE по умолчанию не предоставляет встроенного механизма для генерации уникальных ID пользовательских страниц, особенно при работе с дополнительными модулями или кастомными шаблонами. Однако, возможность реализовать собственный генератор ID существует и не требует сложных зависимостей. Главное – обеспечить уникальность, читаемость и отсутствие конфликтов при повторной генерации или миграции контента.
Оптимальный способ – использование комбинации временной метки и случайной строки, сохранённой в дополнительном поле или таблице. Например, генерация может опираться на выражение md5(microtime(true) . mt_rand()), что даёт 32-символьный уникальный ключ. Для повышения читаемости его можно сократить до первых 12 символов или транслитерировать часть заголовка, добавляя контрольную сумму в конец.
Важно учитывать, что ID должны быть устойчивыми к дублированию при массовом импорте данных. Рекомендуется создавать проверку существования идентификатора в базе перед сохранением. В DLE это можно реализовать через вызов функции $db->super_query() с условием поиска по нужному полю. При совпадении – пересоздание ID в цикле до получения уникального значения.
Подключение пользовательской функции генерации ID в init.php
Откройте файл engine/init.php
в корне движка. Найдите место после подключения основных файлов конфигурации, но до инициализации кэширования или маршрутизации. Это оптимальное место для вставки кода с пользовательскими функциями.
Добавьте следующий код для подключения собственного файла с функцией генерации ID:
require_once ENGINE_DIR . '/inc/custom_id_generator.php';
Создайте файл engine/inc/custom_id_generator.php
, если он отсутствует. В этом файле разместите вашу функцию, например:
function generateCustomPageId($title) {
$id = strtolower(trim($title));
$id = preg_replace('/[^a-z0-9\-]+/u', '-', $id);
$id = preg_replace('/\-+/', '-', $id);
return trim($id, '-');
}
Убедитесь, что в местах создания новых страниц (например, в engine/inc/addnews.php
) функция вызывается корректно. Замените встроённую генерацию на вызов:
$page_id = generateCustomPageId($_POST['title']);
Проверьте, чтобы ID не конфликтовал с уже существующими. Добавьте проверку в БД перед сохранением:
$check = $db->super_query("SELECT COUNT(*) as count FROM " . PREFIX . "_post WHERE alt_name = '{$page_id}'");
if ($check['count']) {
$page_id .= '-' . time();
}
Такой подход позволяет централизованно управлять логикой генерации ID и адаптировать её без вмешательства в ядро движка.
Создание уникального идентификатора с учётом структуры URL
При ручной генерации ID страниц в DLE важно учитывать логику формирования URL, особенно если используется ЧПУ (человекопонятный URL). Уникальный идентификатор должен быть не только отличимым в рамках системы, но и логично вписываться в структуру адресов сайта.
Для начала необходимо определить шаблон формирования URL. Например, если URL строится по принципу /категория/название-страницы/, то идентификатор должен отражать уникальность в рамках категории. Использовать просто числовой ID недостаточно – лучше сформировать строковый ключ на основе заголовка и категории.
Оптимальный вариант – транслитерация заголовка страницы с добавлением уникального суффикса. Например: /statyi/kak-nastroit-apache-001/. Суффикс может формироваться из даты добавления (например, -20250513) или случайного набора символов фиксированной длины (-a7f2), чтобы избежать коллизий.
Перед сохранением следует проверить, существует ли уже такой идентификатор. Это можно реализовать через SELECT-запрос к базе данных с условием поиска по URL. При совпадении – автоматически добавлять или изменять суффикс до тех пор, пока не будет найден уникальный вариант.
Избегайте использования спецсимволов и пробелов – они могут привести к ошибкам в маршрутизации. Рекомендуется использовать только латинские буквы, цифры и дефис. Максимальная длина идентификатора – до 100 символов, чтобы избежать проблем с индексированием и хранением.
Если структура URL включает подкатегории, стоит включать в ID элементы всей иерархии: /manuals/server/apache/kak-nastroit-mod_rewrite/. Это исключит дублирование и облегчит логическую маршрутизацию на уровне CMS.
Изменение шаблона добавления и редактирования материалов
Для внедрения ручного генератора ID в DataLife Engine необходимо внести корректировки в шаблоны addnews.tpl
и editnews.tpl
используемого шаблона сайта. Эти файлы расположены в директории /templates/ваш_шаблон/
.
Откройте addnews.tpl
и найдите место, где размещены стандартные поля формы добавления материала. Вставьте следующий код в нужное место (обычно перед заголовком или основным текстом):
<input type="text" name="custom_id" placeholder="Введите ID страницы" value="{custom_id}" />
В файле editnews.tpl
аналогично найдите секцию редактирования и добавьте аналогичный элемент формы:
<input type="text" name="custom_id" value="{custom_id}" />
Для обеспечения корректной передачи значения ID в шаблонах, необходимо зарегистрировать переменную {custom_id}
в файлах engine/inc/addnews.php
и engine/inc/editnews.php
. В этих скриптах найдите участок обработки пользовательских данных и добавьте:
$custom_id = htmlspecialchars(trim($_POST['custom_id']), ENT_QUOTES, $config['charset']);
Затем перед сохранением данных внесите соответствующее значение в массив $row
или в SQL-запрос добавления/обновления. Также убедитесь, что поле custom_id
существует в таблице dle_post
базы данных, иначе MySQL не сможет сохранить значение.
Сохранение сгенерированного ID в базу данных при публикации
Для сохранения уникального ID страницы в базе данных DLE при публикации материала необходимо вмешательство в обработку данных до их записи в таблицу dle_post
или соответствующую таблицу модуля.
- Откройте файл
engine/modules/addnews.php
. - Найдите участок, где формируется SQL-запрос на вставку данных. Обычно это блок с
$db->query("INSERT INTO ...
. - До выполнения запроса добавьте генерацию ID. Например, используйте
uniqid('page_', true)
или собственную функцию, исключающую коллизии.
Пример добавления ID:
$custom_id = $db->safesql(uniqid('page_', true));
- Добавьте поле
custom_id
в SQL-запрос на вставку данных:
$db->query("INSERT INTO " . PREFIX . "_post (custom_id, title, short_story, ...) VALUES ('$custom_id', '$title', '$short_story', ...)");
- Убедитесь, что поле
custom_id
существует в таблицеdle_post
:
ALTER TABLE dle_post ADD custom_id VARCHAR(255) NOT NULL;
- Добавьте проверку на уникальность ID перед вставкой. При совпадении – перегенерация:
do {
$custom_id = $db->safesql(uniqid('page_', true));
$check = $db->super_query("SELECT COUNT(*) as count FROM " . PREFIX . "_post WHERE custom_id = '$custom_id'");
} while ($check['count'] > 0);
Таким образом, уникальный идентификатор будет сохраняться в базу при каждой публикации и может использоваться для маршрутизации, API или внутренней логики проекта.
Обработка дубликатов и проверка уникальности ID
При ручной генерации ID страниц в DLE необходимо исключить дублирование, иначе система выдаст ошибку или произойдёт перезапись существующего материала. Для проверки уникальности используется запрос к базе данных перед сохранением нового ID.
Пример SQL-запроса на проверку:
SELECT COUNT(*) FROM dle_post WHERE alt_name = 'proverka-id';
Если результат больше нуля – ID уже занят. В этом случае следует автоматически модифицировать ID, добавив уникализирующий суффикс. Например, добавление числа:
'proverka-id-1', 'proverka-id-2'
Контент материала