Автопереименование повторяющегося URL
Честно гуглил, найти не смог, нейронки не могут.
Вся надежда на органический интеллект
Просто дописываем в URL "_1" при сохранении, если документ с аналогичным URL уже существует.
_2, _3 и тд, просто меняем цифру
Помогите пожалуйста, полезная штука…
Вся надежда на органический интеллект
Просто дописываем в URL "_1" при сохранении, если документ с аналогичным URL уже существует.
_2, _3 и тд, просто меняем цифру
Помогите пожалуйста, полезная штука…
Комментарии: 8
Пишешь плагин на событие OnDocFormSave и меняешь alias и uri как тебе надо.
И на том спасибо)))
Вы серьёзно считаете, что чел, способный написать плагин, может не знать на какое событие его назначать?)))
Вы серьёзно считаете, что чел, способный написать плагин, может не знать на какое событие его назначать?)))
Т.е. ты хочешь чтобы кто-то вместо тебя написал плагин за спасибо? Хитро)))
Любите когда вас упрашивают вместо того чтобы сразу озвучить прейскурант?
Если бы я хотел предложить свои услуги — предложил бы. А вообще, я намекал на то, что тут безвозмездная помощь, и безвозмездное решение я уже изложил. Если же вы хотите, чтобы кто-то вместо вас его реализовал, пишите в раздел «Работа»
вот ИИ предложил, сам не проверял:
<?php
/**
* Plugin: Unique URL Checker
* Event: OnDocFormSave
* Description: Проверяет уникальность URL документа и добавляет цифры к alias при дублировании
*/
// Проверяем, что мы в контексте сохранения документа
if ($mode == modSystemEvent::MODE_NEW || $mode == modSystemEvent::MODE_UPD) {
$resource = &$scriptProperties['resource'];
// Пропускаем если это не обычный ресурс или если alias пустой
if (!($resource instanceof modResource) || empty($resource->get('alias'))) {
return;
}
// Получаем контекст и текущий alias
$context = $resource->get('context_key');
$originalAlias = $resource->get('alias');
$currentAlias = $originalAlias;
$parent = $resource->get('parent');
// Исключаем текущий ресурс из проверки при обновлении
$excludeId = $resource->get('id') ?: 0;
$counter = 1;
$maxAttempts = 100; // Защита от бесконечного цикла
// Проверяем уникальность alias
while ($counter <= $maxAttempts) {
// Проверяем существование ресурса с таким alias в том же контексте и родителе
$criteria = [
'alias' => $currentAlias,
'context_key' => $context,
'parent' => $parent,
'id:!=' => $excludeId,
'deleted' => false
];
$existingResource = $modx->getObject('modResource', $criteria);
// Если ресурс с таким alias не найден - выходим из цикла
if (!$existingResource) {
break;
}
// Если нашли дубликат - добавляем цифру к alias
if ($counter == 1) {
$currentAlias = $originalAlias . '-' . $counter;
} else {
// Увеличиваем число в суффиксе
$currentAlias = preg_replace('/-\d+$/', '-' . $counter, $originalAlias);
}
$counter++;
}
// Если alias изменился - сохраняем новый alias
if ($currentAlias != $originalAlias) {
$resource->set('alias', $currentAlias);
// Добавляем сообщение в системный лог
$modx->log(modX::LOG_LEVEL_INFO,
"Автоматически изменен alias ресурса {$resource->get('id')} с '{$originalAlias}' на '{$currentAlias}' для избежания дублирования"
);
}
}
return;
?>
на событие OnBeforeDocFormSave сработал этот вариант:
<?php
/**
* Plugin: Unique URL Checker
* Event: OnBeforeDocFormSave
*/
$resource = $scriptProperties['resource'];
if (!($resource instanceof modResource)) {
return;
}
$mode = $scriptProperties['mode'];
$pagetitle = $resource->get('pagetitle');
// Генерируем базовый alias из pagetitle
$baseAlias = $resource->cleanAlias($pagetitle);
if (empty($baseAlias)) {
return;
}
$context = $resource->get('context_key');
$parent = $resource->get('parent');
$resourceId = $resource->get('id');
$finalAlias = $baseAlias;
$counter = 1;
$maxAttempts = 100;
while ($counter <= $maxAttempts) {
$criteria = [
'alias' => $finalAlias,
'context_key' => $context,
'parent' => $parent,
'id:!=' => $resourceId,
'deleted' => false
];
$existing = $modx->getCount('modResource', $criteria);
if ($existing == 0) {
break;
}
$finalAlias = $baseAlias . '-' . $counter;
$counter++;
}
// Устанавливаем финальный alias
$resource->set('alias', $finalAlias);
if ($finalAlias != $baseAlias) {
$modx->log(modX::LOG_LEVEL_INFO,
"Сгенерирован уникальный alias: {$finalAlias} (ресурс ID: {$resourceId})"
);
}
return;
Не заработало((
MODX 2.8.8
MODX 2.8.8
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.