Всего 125 203 комментария

Роман
5 часов назад
0
на событие 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;
Роман
5 часов назад
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;
?>
Артур Шевченко
Вчера в 21:17
0
Ну сейчас, я бы рекомендовал смотреть в сторону SendIt. Там можно вызвать любой сниппет, не надо писать свой js, SendIt сам умеет вставлять ответ куда надо, есть пагинация.
Roman
Вчера в 21:11
0
Попробовал альтернативный вариант, но мне не нужен msProducts, хочу просто поиск по ресурсам, используя SimpleSearch. Пните, куда копать.
Артур Шевченко
Вчера в 15:28
0
Если бы я хотел предложить свои услуги — предложил бы. А вообще, я намекал на то, что тут безвозмездная помощь, и безвозмездное решение я уже изложил. Если же вы хотите, чтобы кто-то вместо вас его реализовал, пишите в раздел «Работа»
Серый
Вчера в 11:56
-1
Любите когда вас упрашивают вместо того чтобы сразу озвучить прейскурант?
Артур Шевченко
Вчера в 11:52
0
Т.е. ты хочешь чтобы кто-то вместо тебя написал плагин за спасибо? Хитро)))
Серый
Вчера в 11:31
0
И на том спасибо)))
Вы серьёзно считаете, что чел, способный написать плагин, может не знать на какое событие его назначать?)))
Наумов Алексей
Вчера в 10:41
+1
Да, конечно, само собой ничего магически не произойдет.
Lori
Вчера в 10:18
0
Попробую, спасибо. autoRedirector пока не помог. Но все же получается нужно будет условным Console вытащить все старые ссылки, сопоставить им новые и импортировать в easyRedirects?
Lori
Вчера в 10:15
0
Спасибо! Но видимо я не понял логику. Пишет, что он сам создаст правила при изменении урлов. Вот я включил в системных настройках «Использование вложенных», нажал «Обновить URI-ссылки» в меню Управление, но правила не создались и 301 не происходит при переходе на старые ссылки.
Артур Шевченко
Вчера в 10:07
0
Пишешь плагин на событие OnDocFormSave и меняешь alias и uri как тебе надо.
Максим
19 октября 2025, 19:12
0
Спасибо большое за помощь!
Николай Савин
19 октября 2025, 17:25
+1
Нужно вызывать вот такой класс
MODX\Revolution\Processors\Security\Login
Пример вызова

$response = $this->modx->runProcessor(\MODX\Revolution\Processors\Security\Login::class, $this->scriptProperties);
Ivan K.
18 октября 2025, 17:08
0
Здравствуйте. Обязательно займусь доработкой, но в ноябре.
Константин Ильин
18 октября 2025, 16:14
0
не для текущего ресурса. Хоть где выводи msGallery, будет выводить именно тот pagetitle ресурса(товара) к которому принадлежит файл.

Другое дело если, вам надо вывести pagetitle текущего ресурса, к которому файл не относится, то надо так:
{$_modx->resource.pagetitle | htmlent}
Ну и скорее всего вы обманываете всех, вы используете ms2Gallery, а не msGallery.

там уже другой код
{$file['resource_id'] | resource : 'pagetitle' | htmlent}