[solved] Почему могут не обрабатываться события?
UPD: всем спасибо, вопрос решен. Почему-то если повесить плагин на несколько событий, он не работал.
Всем превед, я тут недавно. Совсем недавно :)
Переношу старый конторский сайт на Revo. Ресурс «Новости», тип «Collection».
ЧПУ включен, отключить нельзя. Половина новостей имеют заголовок типа «Рекомендуем» и «Поздравляем», из-за чего при создании очередной новости с заголовком «Рекомендуем» видим ошибку «Ресурс с идентификатором… уже использует URI… Пожалуйста, введите уникальный псевдоним ...»
ЧПУ и заголовки новостей меняться не будут «потому что я так сказала»,© значит проблему нужно решать программно.
Нет ничего проще! Можно влезть в кишки, найти кто генерит эту ошибку и заставить движок самостоятельно дополнять алиас каким-нть ну почти случайным текстом, например id создаваемого ресурса. Но при обновлении MODX все это превратится в тыкву.
Был когда-то второй способ: плагин customURLs. Но он не работает в Revo 2.5 — вместо страницы редактировния фильтров пустота. Официально в его доке так и сказано: «до 2.3» (кто-то писал, что в некоторых 2.4 он тоже работает).
Ок, есть и третий способ. Написать плагин, повесить его на OnResourceDuplicate или OnDocFormSave и далее то же самое.
Но тут возникает одно «но» :)
Что бы я ни делал, я не могу отловить ни одно из этих событий. Прилетает описанная ошибка, и все останавливается. Такое впечатление, что до плагина даже не доходит.
Ничего не эхается, скрипт не останавливается. Даже если убрать условие, ничего не меняется.
В чем может быть причина?
Спасибы, пиво и все такое.
Всем превед, я тут недавно. Совсем недавно :)
Переношу старый конторский сайт на Revo. Ресурс «Новости», тип «Collection».
ЧПУ включен, отключить нельзя. Половина новостей имеют заголовок типа «Рекомендуем» и «Поздравляем», из-за чего при создании очередной новости с заголовком «Рекомендуем» видим ошибку «Ресурс с идентификатором… уже использует URI… Пожалуйста, введите уникальный псевдоним ...»
ЧПУ и заголовки новостей меняться не будут «потому что я так сказала»,© значит проблему нужно решать программно.
Нет ничего проще! Можно влезть в кишки, найти кто генерит эту ошибку и заставить движок самостоятельно дополнять алиас каким-нть ну почти случайным текстом, например id создаваемого ресурса. Но при обновлении MODX все это превратится в тыкву.
Был когда-то второй способ: плагин customURLs. Но он не работает в Revo 2.5 — вместо страницы редактировния фильтров пустота. Официально в его доке так и сказано: «до 2.3» (кто-то писал, что в некоторых 2.4 он тоже работает).
Ок, есть и третий способ. Написать плагин, повесить его на OnResourceDuplicate или OnDocFormSave и далее то же самое.
Но тут возникает одно «но» :)
Что бы я ни делал, я не могу отловить ни одно из этих событий. Прилетает описанная ошибка, и все останавливается. Такое впечатление, что до плагина даже не доходит.
if ($modx->event->name == 'OnDocFormSave')
{
echo 'jopa';
die;
}
Ничего не эхается, скрипт не останавливается. Даже если убрать условие, ничего не меняется.
В чем может быть причина?
Спасибы, пиво и все такое.
Комментарии: 19
Поставьте CuctomURLs — там можно гибко настроить генерацию псевдонимов.
А в плагине используйте не echo, а пишите в лог:
А в плагине используйте не echo, а пишите в лог:
$modx->log(modX::LOG_LEVEL_ERROR, 'что писать');
Йоу, совсем забыл, сорри: customUrls не работает в revo 2.5.
Про лог спасибо, но это несколько неудбно. Впрочем если вместо эха поставить вашу строку, в логу будет пусто…
Про лог спасибо, но это несколько неудбно. Впрочем если вместо эха поставить вашу строку, в логу будет пусто…
Проверьте без условия:
И если есть еще какие-то плагины на OnDocFormSave, поиграйтесь с приоритетом.
<?php
$modx->log(modX::LOG_LEVEL_ERROR, 'бла-бла-бла');
И если есть еще какие-то плагины на OnDocFormSave, поиграйтесь с приоритетом.
Даже если убрать условие, ничего не меняется.А как проверить, висят ли на событии еще какие-то плагины?
Вот так.
Мерсибо, полезная фича.
На OnResourceDuplicate висит только мой экспериментальный плагин, с которым работаю, приоритет 0.
На OnDocFormSave:
— adminTools
— мой плагин
— modDevTools
, у всех приоритет 0. Поставил остальным 1 и 2, протестил, не изменилось ничего :(
Почистил кэш, открыл новую вкладку — увы. Эха нет, в логе пусто.
Какой-то поллитргейст…
На OnResourceDuplicate висит только мой экспериментальный плагин, с которым работаю, приоритет 0.
На OnDocFormSave:
— adminTools
— мой плагин
— modDevTools
, у всех приоритет 0. Поставил остальным 1 и 2, протестил, не изменилось ничего :(
Почистил кэш, открыл новую вкладку — увы. Эха нет, в логе пусто.
Какой-то поллитргейст…
Может использовать OnBeforeDocFormSave? Чтоб плагин отработал раньше проверки ресурса на ошибки?
Не помогло :( В логе не появилось ничего нового.
Для того, чтобы плагин сработал, нужно чекнуть соответствующие события на вкладке событий плагина.
Ярко. Для полной красоты можно было бы добавить ещё красный треугольник. Единственный вопрос — где стрелочки, кружочки и квадратики, выделяющие событие OnBeforeDocFormSave? И где само это событие на картинке??? Хотя это уже второй вопрос.
П.С. Событие OnDocFormSave срабатывает после сохранения ресурса, а ошибка возникает при сохранении.
П.С. Событие OnDocFormSave срабатывает после сохранения ресурса, а ошибка возникает при сохранении.
OnBeforeDocFormSave также не помогает.
Экспериментальный плагин висит еще на событии OnResourceDuplicate. Я так понимаю, оно же вызывает ошибку «Ресурс с идентификатором… уже использует URI…»?
П.С. мерси, это интересно, последовательности событий я пока не знаю :(
Экспериментальный плагин висит еще на событии OnResourceDuplicate. Я так понимаю, оно же вызывает ошибку «Ресурс с идентификатором… уже использует URI…»?
П.С. мерси, это интересно, последовательности событий я пока не знаю :(
Выяснилось, что события
OnBeforeDocFormSave
OnResourceDuplicate
наступают ПОСЛЕ генерации ошибки «Ресурс с идентификатором… уже использует URI…".
То есть при возникновении этой ошибки до событий дело не доходит… :(
Получается что отловить момент генерации ошибки и исправить алиас невозможно?
Revo 2.5.7
OnBeforeDocFormSave
OnResourceDuplicate
наступают ПОСЛЕ генерации ошибки «Ресурс с идентификатором… уже использует URI…".
То есть при возникновении этой ошибки до событий дело не доходит… :(
Получается что отловить момент генерации ошибки и исправить алиас невозможно?
Revo 2.5.7
Напишите плагин на onHandleRequest в нем определяете что идет запрос на создание ресурса и самостоятельно проверяет на дубли. Если дубль то формируетее правильное значение. Думаю должно сработать.
Сделал уже, там проще получилось.
if ( $resource->get('parent') == 9 && $mode == 'new') на OnBeforeDocFormSave.
if ( $resource->get('parent') == 9 && $mode == 'new') на OnBeforeDocFormSave.
Насколько я понимаю, перенос происходит вручную. Если при сохранении нового документа возникает ошибка, то проще в форме в поле alias добавить, например, дату документа — congratulation-2016-01-01.
Да, вручную, я смоделировал работу редактора.
Полчаса назад сделал точно как вы описали здесь, только еще добавил и время создания. Мало ли редактору захочется написать > 1 новости сегодня…
Полчаса назад сделал точно как вы описали здесь, только еще добавил и время создания. Мало ли редактору захочется написать > 1 новости сегодня…
if ( $resource->get('parent') == 9 && $mode == 'new')
{
$resource->set('alias',$resource->get('alias').'-'.$resource->get('createdon'));
}
Повесился только на один OnBeforeDocFormSave, это было ключевым моментом, спасибо за подсказку. Если повеситься на несколько событий — не происходило ничего.
Советую поставить Tickets. Он удобнее для ведения блога — в нем есть генератор урла для документов, возможность не показывать документы в дереве и т.п.
Спасибо, но пожалуй откажусь :)
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.