[solved] Почему могут не обрабатываться события?

UPD: всем спасибо, вопрос решен. Почему-то если повесить плагин на несколько событий, он не работал.

Всем превед, я тут недавно. Совсем недавно :)

Переношу старый конторский сайт на Revo. Ресурс «Новости», тип «Collection».

ЧПУ включен, отключить нельзя. Половина новостей имеют заголовок типа «Рекомендуем» и «Поздравляем», из-за чего при создании очередной новости с заголовком «Рекомендуем» видим ошибку «Ресурс с идентификатором… уже использует URI… Пожалуйста, введите уникальный псевдоним ...»

ЧПУ и заголовки новостей меняться не будут «потому что я так сказала»,© значит проблему нужно решать программно.

Нет ничего проще! Можно влезть в кишки, найти кто генерит эту ошибку и заставить движок самостоятельно дополнять алиас каким-нть ну почти случайным текстом, например id создаваемого ресурса. Но при обновлении MODX все это превратится в тыкву.

Был когда-то второй способ: плагин customURLs. Но он не работает в Revo 2.5 — вместо страницы редактировния фильтров пустота. Официально в его доке так и сказано: «до 2.3» (кто-то писал, что в некоторых 2.4 он тоже работает).

Ок, есть и третий способ. Написать плагин, повесить его на OnResourceDuplicate или OnDocFormSave и далее то же самое.

Но тут возникает одно «но» :)
Что бы я ни делал, я не могу отловить ни одно из этих событий. Прилетает описанная ошибка, и все останавливается. Такое впечатление, что до плагина даже не доходит.
if ($modx->event->name == 'OnDocFormSave') 
{
	echo 'jopa';
	die;
}



Ничего не эхается, скрипт не останавливается. Даже если убрать условие, ничего не меняется.

В чем может быть причина?
Спасибы, пиво и все такое.
gluck
03 июня 2017, 08:12
modx.pro
2 803
0

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

Павел Романов
03 июня 2017, 14:16
+1
Поставьте CuctomURLs — там можно гибко настроить генерацию псевдонимов.

А в плагине используйте не echo, а пишите в лог:
$modx->log(modX::LOG_LEVEL_ERROR, 'что писать');
    gluck
    03 июня 2017, 14:30
    0
    Йоу, совсем забыл, сорри: customUrls не работает в revo 2.5.
    Про лог спасибо, но это несколько неудбно. Впрочем если вместо эха поставить вашу строку, в логу будет пусто…
      Павел Романов
      03 июня 2017, 15:18
      0
      Проверьте без условия:
      <?php
      $modx->log(modX::LOG_LEVEL_ERROR, 'бла-бла-бла');

      И если есть еще какие-то плагины на OnDocFormSave, поиграйтесь с приоритетом.
        gluck
        03 июня 2017, 16:22
        0
        Даже если убрать условие, ничего не меняется.
        А как проверить, висят ли на событии еще какие-то плагины?
          Сергей Шлоков
          04 июня 2017, 07:59
          0
          Вот так.
            gluck
            04 июня 2017, 09:38
            0
            Мерсибо, полезная фича.

            На OnResourceDuplicate висит только мой экспериментальный плагин, с которым работаю, приоритет 0.
            На OnDocFormSave:
            — adminTools
            — мой плагин
            — modDevTools
            , у всех приоритет 0. Поставил остальным 1 и 2, протестил, не изменилось ничего :(
            Почистил кэш, открыл новую вкладку — увы. Эха нет, в логе пусто.

            Какой-то поллитргейст…
    Евгений
    03 июня 2017, 16:20
    0
    Может использовать OnBeforeDocFormSave? Чтоб плагин отработал раньше проверки ресурса на ошибки?
      gluck
      03 июня 2017, 16:25
      0
      Не помогло :( В логе не появилось ничего нового.
        Сергей Шлоков
        04 июня 2017, 08:00
        0
        Для того, чтобы плагин сработал, нужно чекнуть соответствующие события на вкладке событий плагина.
          gluck
          04 июня 2017, 09:21
          0
            Сергей Шлоков
            04 июня 2017, 09:35
            0
            Ярко. Для полной красоты можно было бы добавить ещё красный треугольник. Единственный вопрос — где стрелочки, кружочки и квадратики, выделяющие событие OnBeforeDocFormSave? И где само это событие на картинке??? Хотя это уже второй вопрос.

            П.С. Событие OnDocFormSave срабатывает после сохранения ресурса, а ошибка возникает при сохранении.
              gluck
              04 июня 2017, 09:47
              0
              OnBeforeDocFormSave также не помогает.

              Экспериментальный плагин висит еще на событии OnResourceDuplicate. Я так понимаю, оно же вызывает ошибку «Ресурс с идентификатором… уже использует URI…»?

              П.С. мерси, это интересно, последовательности событий я пока не знаю :(
      gluck
      04 июня 2017, 10:16
      0
      Выяснилось, что события
      OnBeforeDocFormSave
      OnResourceDuplicate
      наступают ПОСЛЕ генерации ошибки «Ресурс с идентификатором… уже использует URI…".

      То есть при возникновении этой ошибки до событий дело не доходит… :(

      Получается что отловить момент генерации ошибки и исправить алиас невозможно?
      Revo 2.5.7
        Володя
        04 июня 2017, 11:03
        +1
        Напишите плагин на onHandleRequest в нем определяете что идет запрос на создание ресурса и самостоятельно проверяет на дубли. Если дубль то формируетее правильное значение. Думаю должно сработать.
          gluck
          04 июня 2017, 11:58
          0
          Сделал уже, там проще получилось.
          if ( $resource->get('parent') == 9 && $mode == 'new') на OnBeforeDocFormSave.
          Сергей Шлоков
          04 июня 2017, 11:46
          0
          Насколько я понимаю, перенос происходит вручную. Если при сохранении нового документа возникает ошибка, то проще в форме в поле alias добавить, например, дату документа — congratulation-2016-01-01.
            gluck
            04 июня 2017, 11:54
            0
            Да, вручную, я смоделировал работу редактора.
            Полчаса назад сделал точно как вы описали здесь, только еще добавил и время создания. Мало ли редактору захочется написать > 1 новости сегодня…

            if ( $resource->get('parent') == 9 && $mode == 'new')
            {
                $resource->set('alias',$resource->get('alias').'-'.$resource->get('createdon'));
            }
            Повесился только на один OnBeforeDocFormSave, это было ключевым моментом, спасибо за подсказку. Если повеситься на несколько событий — не происходило ничего.
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        19