Автопереименование повторяющегося URL

Честно гуглил, найти не смог, нейронки не могут.
Вся надежда на органический интеллект
Просто дописываем в URL "_1" при сохранении, если документ с аналогичным URL уже существует.
_2, _3 и тд, просто меняем цифру
Помогите пожалуйста, полезная штука…
Серый
21 октября 2025, 20:51
modx.pro
434
0

Комментарии: 8

Артур Шевченко
22 октября 2025, 10:07
0
Пишешь плагин на событие OnDocFormSave и меняешь alias и uri как тебе надо.
    Серый
    22 октября 2025, 11:31
    0
    И на том спасибо)))
    Вы серьёзно считаете, что чел, способный написать плагин, может не знать на какое событие его назначать?)))
      Артур Шевченко
      22 октября 2025, 11:52
      0
      Т.е. ты хочешь чтобы кто-то вместо тебя написал плагин за спасибо? Хитро)))
        Серый
        22 октября 2025, 11:56
        -1
        Любите когда вас упрашивают вместо того чтобы сразу озвучить прейскурант?
          Артур Шевченко
          22 октября 2025, 15:28
          0
          Если бы я хотел предложить свои услуги — предложил бы. А вообще, я намекал на то, что тут безвозмездная помощь, и безвозмездное решение я уже изложил. Если же вы хотите, чтобы кто-то вместо вас его реализовал, пишите в раздел «Работа»
    Роман
    23 октября 2025, 07:20
    0
    вот ИИ предложил, сам не проверял:
    <?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;
    ?>
      Роман
      23 октября 2025, 07:34
      +1
      на событие 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;
        Серый
        28 октября 2025, 18:31
        0
        Не заработало((
        MODX 2.8.8
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      8