Tramp1357 28 июня 2015 2 6
Столкнулся с тем, что клиент попросил удалять из URL алиасы промежуточных родителей (выборочно). Документов достаточно много, и заморозка URL — не самый удобный вариант.
Уверен, не я один столкнулся с подобной проблемой.
Поиск привел в github. Да, требуется внести изменения в ядро, но, думаю, оно того стоит.
Решение здесь:

https://github.com/bertoost/revolution/commit/4323cfdbdb9afca3ff23d30faf0492e524b57faa
https://github.com/bertoost/revolution/commit/1a9bd36035b6bba28ff50a2692060b8567949fd3

Необходимо создать в таблице modx_site_content поле exclude_alias_in_childs (boolean), сделать к нему индекс
и внести в MODX изменения, указанные на гитхабе.
У кого русский MODX, можно кроме
core/lexicon/en/resource.inc.php

подправить еще и
core/lexicon/ru/resource.inc.php

дав нужное название чекбоксу.

В результате на закладке документа «Настройки» появится чекбокс «исключить из Exclude resource alias in child aliases».
Если его включить, то алиас этого ресурса не будет участвовать в формировании URL дочерних ресурсов.
6 комментариев
0
0xMiha 28 июня 2015г в 21:41 #
Как вариант, можно было бы написать плагин, срабатывающий при сохранении ресурса и решающий (по какому-то критерию), какой uri установить у ресурса. По-моему, это проще. Или я неверно понял задачу?
Fi1osof1
Fi1osof 28 июня 2015г в 21:45 #
Это крайне проблематично. Дело в том, что установка uri выполняется не в самом плагине, а в modResource::refreshURIs(), к тому же еще и рекурсивно. Без модификации ядра тут вряд ли что-то можно сделать.
0
0xMiha 28 июня 2015г в 21:51 #
Я извиняюсь, что задаю вопрос, не разбираясь в механизм формирования uri и очистки кэша, но всё-таки сделаю это.
А что, если плагин будет замораживать uri при сохранении? Я, не вчитываясь, углядел в методе refreshURIs какую-то проверку на заморозку uri.
0
0xMiha 28 июня 2015г в 21:53 #
Опять таки, под неудобством заморозки URI автор имел ввиду ручную заморозку. Если организовать это в плагине, то я пока не вижу проблем.
Fi1osof1
Fi1osof 28 июня 2015г в 21:59 #
Ури замораживается только для текущего документа и не учитывается дочерними. Если заморозку не трогать, то меняя алиас какого-нибудь раздела, ури обновляются у всех подразделов и дочерних документов на любой уровень вложенности. То, что предлагает Саша, учитывается в формировании УРЛов всех дочерних документов автоматически. Вы же предлагаете морозить урлы отдельных документов.
0
0xMiha 28 июня 2015г в 22:22 #
Я всё равно не понимаю. Давайте, разберём пример и я пойму, почему я не прав?
Допустим, есть родительский ресурс news, у которого есть дочерние ресурсы. Соответственно, список статей доступен по адресу localhost/news/, а каждая новость доступна по адресу localhost/news/nazvanie. Но мы захотели, чтобы uri любой новости выглядел так: localhost/nazvanie.
Для простоты допустим, что у нас ещё нет новостей. Итак, я кликаю правой клавишей по «Новости» -> «Создать ресурс». Заполняю поля. Нажимаю сохранить. Плагин замораживает uri у только что созданного ресурса новости, исключая uri родительского ресурса. И, каждый раз создавая ресурс, его uri будет замораживаться и не будет меняться при очистке кэша и пр.
Допустим, даже, что у нас уже были какие-то дочерние ресурсы. Не составляет сложности пройтись единожды по этим ресурсам и подкорректировать uri, предварительно заморозив.
Fi1osof1
Fi1osof 28 июня 2015г в 22:30 #
Вы хорошо понимаете что такое рекурсия и как сделать выборку всех документов без ограничения количества вложенности? Не Wayfinder юзая, но свой код на php написав?
Tramp13571
Tramp1357 28 июня 2015г в 22:19 #
Можно и так, конечно. но у меня стоит проблема с перенесением достаточно большого количества страниц, к тому же придется делать это вручную, т.к. на старом сайте страшный контент, и нужно будет его чистить руками.
Да и плагин плагином, но, на мой взгляд, так поудобнее все-таки. И я не понимаю, почему такой удобной функции до сих пор нет в самом ядре.
Fi1osof1
Fi1osof 28 июня 2015г в 22:29 #
И я не понимаю, почему такой удобной функции до сих пор нет в самом ядре.
Если бы все интересные и полезные функции в ядро отправлялись, MODX бы уже сдох наверно от переизбытка веса :)
Но да, некоторые вещи даже очень важные в ядро почему-то не попадают. К примеру вот это я писал в далеком 11-ом году: Тюнинг MODx Revolution. Оптимизация кэша. Загрузка страницы менее чем за 0,4 сек. при > 1 000 000 документов. И все, что надо было — это просто добавить в документ галочку «не добавлять в кеш-карту». Это бы позволило MODX-у без проблем работать с десятками и сотнями тысяч документов. То есть, как не крути, а именно из-за этой мелочи MODX до сих пор себя плохо ведет с большим количеством документов.
Ан нет… До сих пор не включено. До сих пор приходится юзать cacheOptimizer на больших проектах.
Tramp13571
Tramp1357 28 июня 2015г в 22:33 #
со всем согласен, но такие вещи хотя бы как псевдомодули (или патчи, расшмрения) оформлять как-то можно бы :)
Tramp13571
Tramp1357 28 июня 2015г в 22:34 #
блин, как жаль что комментарии не редактируются :(
Fi1osof1
Fi1osof 28 июня 2015г в 22:38 #
Когда-нибудь будут, как руки дойдут :)
0
0xMiha 28 июня 2015г в 22:31 #
к тому же придется делать это вручную
Зачем что-то вручную делать, если у MODX есть пригодный для этого API? На крайний случай — SQL или простой PHP-скрипт.
Возможно, такой функционал действительно пользовался бы спросом, но я лично не припомню, чтобы это когда-либо требовалось (да, я видел новостные сайты, где alias новости идёт сразу после доменного имени, но до сих пор не понимаю целесообразности). Если не секрет, для чего потребовалось изменять ядро ради задачи, решаемой элементарным плагином?
Fi1osof1
Fi1osof 28 июня 2015г в 22:40 #
Если не секрет, для чего потребовалось изменять ядро ради задачи, решаемой элементарным плагином?
Василий, еще раз: то, что вы предлагаете, плагином не решается. Разве еще не ясно? Попробуйте влезть плагином в это изменение, да так, чтобы все дочерние документы обновились как надо:
$doc = $modx->getObject('modResource', $id);
$doc->set('alias', $new_alias);
$doc->save();
0
0xMiha 28 июня 2015г в 22:48 #
Как-нибудь попробую подумать на эту тему. Я изначально подумал про частный случай с двумя уровнями (новости/новость), не учитывая больший уровень вложенности. Тогда однозначно спасибо Александру. Если этого не будет в ядре, когда понадобится, обращусь к статье.
Tramp13571
Tramp1357 28 июня 2015г в 22:42 #
можно отключить вложенные URI, но
1.это не всегда подходит
к примеру, есть товар, который лежит в каталоге в
/каталог/потолки/подвесные потолки/подвесные_потолки_armstrong/название_конкретного_товара

а на выходе должно быть
/каталог/подвесные_потолки_armstrong/название_конкретного_товара

2.возникает проблема с уникальностью URI.

На самом деле я не навязываю этот способ, просто второй раз сталкиваюсь с такой проблемой, и подумал, вдруг кому еще пригодится :)
M
MisterN 28 июня 2015г в 21:45 #
А как же поставить галко «Заморозить урл» и вписать нужное в настройках ресурса? Или я неверно понял задачу ))?
M
MisterN 28 июня 2015г в 21:49 #
Документов достаточно много, и заморозка URL — не самый удобный вариант.

Понял, ставлю плюс в тему.
Tramp13571
Tramp1357 28 июня 2015г в 22:28 #
Примеры:
1. каталог с большим уровнем вложенности и сотнями товаров. Грустно будет править url в каждом, да и ошибиться нетрудно.
2. много статей — для удобства работы можно создать технические подпапки
articles/dir1/dir1-1/article1
articles/dir1/dir1-2/article2
articles/dir2/dir1-1/article3
...

и можно не греть голову с url типа
/articles/dir1/dir1-1/article1

а будем точно знать (и не переживать, что забыли подправить), что адреса будут
articles/article1
articles/article2
articles/article3
...

Да и работы меньше при наполнении. :)
t
tozhdestvo 29 июня 2015г в 09:42 #
CustomUrls не решает эту задачу?
Tramp13571
Tramp1357 29 июня 2015г в 14:13 #
Насколько я его понял, он выполняет другие задачи. Не нашел я (правда, глубоко не вдавался) в нем возможности из
/каталог/потолки/подвесные потолки/подвесные_потолки_armstrong/название_конкретного_товара
сделать
/каталог/подвесные_потолки_armstrong/название_конкретного_товара

Да и на самом деле то, что предложено в этом топике, делается за 5 минут, и не требует больше никаких действий кроме как выставить/снять галочку.
Я не сторонник различных довесков, которые нагружают систему.
Да и банальная лень — проще сделать как проще :)
Tramp13571
Tramp1357 10 ноября 2015г в 13:42 #
Действительно, почему-то удалены. Сегодня постараюсь выложить описание процесса
d
derzaiii 10 ноября 2015г в 13:44 #
А можно как то сейчас их получить?
Спасибо заранее)
Tramp13571
Tramp1357 10 ноября 2015г в 13:46 #
К сожалению, я за компьютером буду около 16-00. Все надо собрать с рабочего сайта.
d
derzaiii 10 ноября 2015г в 13:59 #
Ок, тогда жду )
Tramp13571
Tramp1357 12 ноября 2015г в 17:51 #
Написал новый топик c описанием переделок
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.