Всего 125 221 комментарий

Роман
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;
?>
Артур Шевченко
22 октября 2025, 21:17
0
Ну сейчас, я бы рекомендовал смотреть в сторону SendIt. Там можно вызвать любой сниппет, не надо писать свой js, SendIt сам умеет вставлять ответ куда надо, есть пагинация.
Roman
22 октября 2025, 21:11
0
Попробовал альтернативный вариант, но мне не нужен msProducts, хочу просто поиск по ресурсам, используя SimpleSearch. Пните, куда копать.
Артур Шевченко
22 октября 2025, 15:28
0
Если бы я хотел предложить свои услуги — предложил бы. А вообще, я намекал на то, что тут безвозмездная помощь, и безвозмездное решение я уже изложил. Если же вы хотите, чтобы кто-то вместо вас его реализовал, пишите в раздел «Работа»
Серый
22 октября 2025, 11:56
-1
Любите когда вас упрашивают вместо того чтобы сразу озвучить прейскурант?
Артур Шевченко
22 октября 2025, 11:52
0
Т.е. ты хочешь чтобы кто-то вместо тебя написал плагин за спасибо? Хитро)))
Серый
22 октября 2025, 11:31
0
И на том спасибо)))
Вы серьёзно считаете, что чел, способный написать плагин, может не знать на какое событие его назначать?)))
Наумов Алексей
22 октября 2025, 10:41
+1
Да, конечно, само собой ничего магически не произойдет.
Lori
22 октября 2025, 10:18
0
Попробую, спасибо. autoRedirector пока не помог. Но все же получается нужно будет условным Console вытащить все старые ссылки, сопоставить им новые и импортировать в easyRedirects?
Lori
22 октября 2025, 10:15
0
Спасибо! Но видимо я не понял логику. Пишет, что он сам создаст правила при изменении урлов. Вот я включил в системных настройках «Использование вложенных», нажал «Обновить URI-ссылки» в меню Управление, но правила не создались и 301 не происходит при переходе на старые ссылки.
Артур Шевченко
22 октября 2025, 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}
Сергей
18 октября 2025, 14:17
0
Спасибо! Так работает, почему у других то работает по другому)
Павел Романов
18 октября 2025, 14:08
0
Тут нет плейсхолдера pagetitle — получайте его через $file.resource_id (для ms2Gallery) или $file.product_id (для msGallery).

{foreach $files as $file}
    <picture>
        <source srcset="{$file['webp250x250']}" type="image/webp">
        <img class="lazyload"
            data-src="{$file['webp250x250']}"
            src="{$file['webp250x250']}"
            alt="{$file.resource_id | resource : 'pagetitle' | htmlent}">
    </picture>
{/foreach}