После обновления до modx 2.3.2 изменились все uri
После обновления modx 2.2.14 => 2.3.0 => 2.3.2 обнаружил, что все uri ресурсов оказались перегенерированы стандартным генератором modx. Так и должно быть?
uri для всех ресурсов я генерирую плагином на OnDocFormSave и OnResourceDuplicate (по собственному алгоритму). Но после обновления modx все uri оказались идентичны псевдонимам. Никто не обратил внимание?
Если это не глюк, а запрограммированное поведение, то нужно что-то предпринимать. Например, использовать заморозку (но при следующем обновлении снова нужно будет проверить, может и замороженные uri modx перегенерирует).
uri для всех ресурсов я генерирую плагином на OnDocFormSave и OnResourceDuplicate (по собственному алгоритму). Но после обновления modx все uri оказались идентичны псевдонимам. Никто не обратил внимание?
Если это не глюк, а запрограммированное поведение, то нужно что-то предпринимать. Например, использовать заморозку (но при следующем обновлении снова нужно будет проверить, может и замороженные uri modx перегенерирует).
Комментарии: 4
Нормальное поведение, а вот замороженные uri никто не будет перегенерировать.
Да, это стандартное поведение modx — обеспечение соответствия uri ресурсов псевдонимам и настройкам.
modx выполняет перегенерацию uri в 5 случаях:
1) При сохранении и копировании ресурсов (процессоры "resource/update", "resource/duplicate" и "resource/updatefromgrid")
2) Обновление сайта ("Сайт — Обновить", процессор "system/clearcache") — принудительно обновляет uri всех ресурсов. До версии modx 2.3.x перегенерацию URI при обновлении сайта не выполнял.
3) При изменении системных настроек типов контента (content type): процессоры "system/contenttype/update" и "system/contenttype/updatefromgrid"
4) При изменении системных настроек дружественных URL: процессор "system/settings/update"
5) При создании или изменении настроек дружественных URL для контекстов: процессоры "context/settings/create", "context/settings/update" и "context/settings/updatefromgrid"
modx выполняет перегенерацию uri в 5 случаях:
1) При сохранении и копировании ресурсов (процессоры "resource/update", "resource/duplicate" и "resource/updatefromgrid")
2) Обновление сайта ("Сайт — Обновить", процессор "system/clearcache") — принудительно обновляет uri всех ресурсов. До версии modx 2.3.x перегенерацию URI при обновлении сайта не выполнял.
3) При изменении системных настроек типов контента (content type): процессоры "system/contenttype/update" и "system/contenttype/updatefromgrid"
4) При изменении системных настроек дружественных URL: процессор "system/settings/update"
5) При создании или изменении настроек дружественных URL для контекстов: процессоры "context/settings/create", "context/settings/update" и "context/settings/updatefromgrid"
Зато теперь возникает проблема реализации собственного генератора URL.
Возможны 3 варианта:
1.Замена стандартного генератора uri собственным. Реализуется перегрузкой одного из методов: modx::refreshURIs() либо modResource::getAliasPath(). При каждом вызове стандартного генератора фактически будет вызываться наш собственный генератор
Плюсы:
1) Не придётся отслеживать моменты, когда и для каких ресурсов нужно выполнить перегенерацию URI — этим будет заниматься modx
2) Внутри собственного генератора URI можно легко отслеживать изменение URI и вызывать соответствующие методы Редиректора
Минусы:
1) Перегрузка классов modx или modResource реализуется не совсем чисто и не надёжно (нужно решать проблему «подсовывания» своих классов в нужных местах и в нужные моменты времени). Если для перегрузки класса modx достаточно ручной корректировки одной строки кода в 4 файлах при каждой установке и обновлении modx, то подсовывание своего класса modResource остаётся проблемой.
2) Поскольку необходимость перегенерации URI определяет modx, то при изменении тех данных, которые используются собственным генератором uri, но не используются стандартным, — при изменении этих данных собственный генератор вызываться не будет
2.Собственный генератор URI наряду со стандартным (без использования заморозки). Собственный автоматический генератор замороженные uri не трогает (так же, как и стандартный)
Плюсы:
1) Не нужно ничего перегружать
2) Сохраняется стандартная логика modx: если uri заморожен, то автоматическая генерация его затронуть не должна. Заморозка предоставляет возможность некоторым ресурсам задавать uri вручную (отлично от тех, что генерируются автоматически) и быть уверенным, что никакая «автоматка» эти uri не тронет
Минусы. Необходимо отслеживать все изменения uri стандартным генератором, чтобы после его отработки запустить собственный генератор для тех же ресурсов.
Но в автоматическом режиме задача нерешаема по следующим причинам:
а) события на генерацию URI нет
б) метод modResource::save() не генерирует никаких событий.
(Для сравнения: у элементов (плагинов, сниппетов, чанков, шаблонов, tv) при выполнении метода {ELEMENT}::save() генерируются события OnBefore{ELEMENT}Save и On{ELEMENT}Save)
в) при изменении системных настроек, настроек контекста и типов контента тоже не генерируется никаких событий
Т.е. возможно отследить только обновление сайта (событие OnSiteRefresh) и изменение/сохранение ресурса (события OnBeforeDocFormSave и OnDocFormSave)
3.Собственный генератор URI наряду со стандартным (с использованием заморозки). Собственный автоматический генератор при генерации uri их замораживает.
Плюсы:
1) Не нужно ничего перегружать
2) Нет необходимости отслеживать моменты изменения uri стандартным генератором, т.к. стандартный генератор замороженные uri не трогает
Минусы:
1) Нарушается стандартная логика modx: если uri заморожен, то собственная автоматическая генерация его затронет (например, при сохранении ресурса). Т.е. для ресурсов не будет возможности задавать uri вручную.
2) Придётся самостоятельно отслеживать изменение тех данных, которые учитываются при работе собственного генератора.
Если собственный генератор учитывает системные настройки, настройки контекстов или настройки типов контента (последнее — уж обязательно), то эта задача опять-таки в автоматическом режиме нерешаема, т.к. нет событий, наступающих при изменении этих настроек.
==========================================================================
Мой выбор — вариант №2. Сохраняющий стандартную (корректную) логику работы с замороженными url
Только как автоматически и универсально отслеживать изменение url стандартным генератором?
Возможны 3 варианта:
1.Замена стандартного генератора uri собственным. Реализуется перегрузкой одного из методов: modx::refreshURIs() либо modResource::getAliasPath(). При каждом вызове стандартного генератора фактически будет вызываться наш собственный генератор
Плюсы:
1) Не придётся отслеживать моменты, когда и для каких ресурсов нужно выполнить перегенерацию URI — этим будет заниматься modx
2) Внутри собственного генератора URI можно легко отслеживать изменение URI и вызывать соответствующие методы Редиректора
Минусы:
1) Перегрузка классов modx или modResource реализуется не совсем чисто и не надёжно (нужно решать проблему «подсовывания» своих классов в нужных местах и в нужные моменты времени). Если для перегрузки класса modx достаточно ручной корректировки одной строки кода в 4 файлах при каждой установке и обновлении modx, то подсовывание своего класса modResource остаётся проблемой.
2) Поскольку необходимость перегенерации URI определяет modx, то при изменении тех данных, которые используются собственным генератором uri, но не используются стандартным, — при изменении этих данных собственный генератор вызываться не будет
2.Собственный генератор URI наряду со стандартным (без использования заморозки). Собственный автоматический генератор замороженные uri не трогает (так же, как и стандартный)
Плюсы:
1) Не нужно ничего перегружать
2) Сохраняется стандартная логика modx: если uri заморожен, то автоматическая генерация его затронуть не должна. Заморозка предоставляет возможность некоторым ресурсам задавать uri вручную (отлично от тех, что генерируются автоматически) и быть уверенным, что никакая «автоматка» эти uri не тронет
Минусы. Необходимо отслеживать все изменения uri стандартным генератором, чтобы после его отработки запустить собственный генератор для тех же ресурсов.
Но в автоматическом режиме задача нерешаема по следующим причинам:
а) события на генерацию URI нет
б) метод modResource::save() не генерирует никаких событий.
(Для сравнения: у элементов (плагинов, сниппетов, чанков, шаблонов, tv) при выполнении метода {ELEMENT}::save() генерируются события OnBefore{ELEMENT}Save и On{ELEMENT}Save)
в) при изменении системных настроек, настроек контекста и типов контента тоже не генерируется никаких событий
Т.е. возможно отследить только обновление сайта (событие OnSiteRefresh) и изменение/сохранение ресурса (события OnBeforeDocFormSave и OnDocFormSave)
3.Собственный генератор URI наряду со стандартным (с использованием заморозки). Собственный автоматический генератор при генерации uri их замораживает.
Плюсы:
1) Не нужно ничего перегружать
2) Нет необходимости отслеживать моменты изменения uri стандартным генератором, т.к. стандартный генератор замороженные uri не трогает
Минусы:
1) Нарушается стандартная логика modx: если uri заморожен, то собственная автоматическая генерация его затронет (например, при сохранении ресурса). Т.е. для ресурсов не будет возможности задавать uri вручную.
2) Придётся самостоятельно отслеживать изменение тех данных, которые учитываются при работе собственного генератора.
Если собственный генератор учитывает системные настройки, настройки контекстов или настройки типов контента (последнее — уж обязательно), то эта задача опять-таки в автоматическом режиме нерешаема, т.к. нет событий, наступающих при изменении этих настроек.
==========================================================================
Мой выбор — вариант №2. Сохраняющий стандартную (корректную) логику работы с замороженными url
Только как автоматически и универсально отслеживать изменение url стандартным генератором?
CustomURLs реализует вариант №3 (с заморозкой) => нельзя вручную задавать uri
AutoRedirector — вариант №2 (без заморозки), при этом обновление сайта и настроек (когда запускается стандартный генератор uri) никак не отслеживает… со всеми вытекающими…
AutoRedirector — вариант №2 (без заморозки), при этом обновление сайта и настроек (когда запускается стандартный генератор uri) никак не отслеживает… со всеми вытекающими…
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.