Как заставить правильно работать makeUrl() для документа, созданного программно?

Создаю программно кучу документов.
Методы перепробовал все, перечисленные вот тут:
modx.im/blog/questions/4983.html

На первом проходе их просто создаю.
На втором проходе пробегаюсь по созданным документам и меняю у некоторых родителя, создавая иерархическую структуру.
И после этого, пытаясь получить адрес у созданного документа с помощью функции makeUrl() — получаю вместо этого адрес с числом вместо последовательности алиасов.


//цикл перебора $modx_id, порядка 6000 документов
{
	$doc = new modResource($modx);
	$doc->edit($modx_id);
	$modx_new_parent = MyFunction($modx_id);//возвращает id док-ма, созданного на предыдущем проходе
	$doc->set('parent',$modx_new_parent);
	$doc->save(true, true);//тут баловался разными параметрами - и true, и false
	echo "new url of $modx_id = ".$modx->makeUrl($modx_id)."<hr>";
        //и вот тут вместо нормального url получаю что-то вроде "/8613.html"


Как ее заставить правильный адрес выдавать?

13 комментариев

avatar
Подозреваю что оно не пишет в кеш потому и не хочет работать как надо. Тоесть получается кеш сбросили а новый не создали еще.
avatar
А чего нужно вызвать, чтобы он создался?
avatar
по простому обновить страничку. Но тогда действие надо разбивать на 2 :( что не есть хорошо
avatar
Да, мне нужно, чтобы все сделалось в один запуск, без обновлений страницы.
А что такого запускается при загрузке страницы, может его принудительно запустить можно?
avatar
Можно попробовать запустить очистку кеша родную
$modx->clearCache('full');
avatar
Это уже пробовал, не помогло.
avatar
Любопытства ради попробуйте вместо
echo "new url of $modx_id = ".$modx->makeUrl($modx_id)."<hr>";
написать
echo "new url of $modx_id = ".$doc->getUrl()."<hr>";

Понимаю, что скорей всего результат не измениться, но реально любопытно)))
  • EGO
  • 0
avatar
Проверил, все то же самое.
avatar
Тут несколько вариантов может быть: включить aliasListing только для папок, получить ссылку на родителя и к ней добавить alias документа, загрузить файл кэша после сброса или вручную изменить aliasListing.
avatar
Ссылку на родителя тоже не получится получить, так как родитель тоже создан программно… тогда уже проще свой рекурсивный обход написать, или на этапе построения в массив адреса сохранять и добавлять к ним «добавки» при установке родителя (собственно, в текущем варианте почти так и сделано) :)

А вот с aliasListing можно поподробнее, что эта опция делает?
Я ее включил, попробовал — стало лучше, во всяком случае адреса стали строиться осмысленные, а не «численные», но в адрес попадают только родительские ресурсы, которые я не создавал при обходе (а у меня некоторые родительские ресурсы тоже создаются программно).
Комментарий отредактирован 2017-09-28 09:25:51 пользователем Dreamer
avatar
aliasListing это карта ссылок, которую использует makeUrl; var_dump($modx->aliasListing) и будет понятно что с этим делать (:
avatar
Да, посмотрел, там в этом массиве полная жесть :)
Почему-то осталась куча ресурсов, уже удаленных ранее, у измененных программно ресурсов родители не правильно заполнены.

В общем, остановился пока на формировании массива адресов на этапе построения.

Спасибо.
avatar
Сегодня столкнулся с такой же проблемой, единственное, что нашёл гугл — данный топик.
Оставлю тут костыль, который помог мне.
Перед вызовом $modx->makeUrl(), а точнее, сразу после создания ресурса, я вызываю (evo cms 3)
\UrlProcessor::getAliasListing($id); //ID свежесозданной страницы. Полагаю, что в старом API также есть $modx->getAliasListing($id);
После этого — makeUrl даёт корректный результат. Надеюсь, кому-то когда-нибудь может помочь)
Комментарий отредактирован 2021-04-22 16:51:18 пользователем jrgektor
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.