Редирект на ресурс сразу после его создания
Использование PhpStorm дает первые плоды. Вот вам характерный случай.
Делаю компонент, в котором ресурсы создаются во фронтенде, через процессоры. Процессор возвращает id ресурса и я должен отправить юзера сразу на него.
$response = $modx->runProcessor('resource/create', $data);
if ($response->isError()) {
return $response->getMessage();
}
$id = $response->response['object']['id'];
$modx->sendRedirect($modx->makeUrl($id,'','','full'));
И не работает. $modx->makeUrl() не возвращает url - просто пустота.
Полез смотреть код makeUrl() и выяснил, что оно ищет ресурсы в $modx->context->resourceMap или $modx->context->aliasMap (зависит от настроек friendly_urls). Даже если полностью чистить кэш сразу после создания ресурса - его id не появляется в этих переменных.
Ну вот не появляется, и все тут! Причем, если смотреть в файл с кэшем контекста - там все есть. Выходит, эти переменные инициализируются раньше, и затем не обновляются при очистке кэша. Да и не хочу я кэш всех ресурсов чистить.
Значит, нужно обновить их вручную.
Начал раскручивать генерацию карты ресурсов и алиасов. И благодаря PhpStorm добрел до метода $modx->cacheManager->generateContext($context_key), который генерирует кэш контекста, не трогая кэш ресурсов, а затем возвращает все нужное.
Дальше дело техники:
$results = $modx->cacheManager->generateContext($modx->context->key);
$modx->context->resourceMap = $results['resourceMap'];
$modx->context->aliasMap = $results['aliasMap'];
И вот теперь, $modx->makeUrl() отлично генерирует нам url нового ресурса, по всем правилам и можно делать редирект юзера на него. Карта ресурсов тоже обновлена, поэтому ресурс нормально загрузится и закэшируется.
Обращаю ваше внимание: если при создании ресурса сразу его не публиковать и не указывать "обновить сайт", то есть, в массиве параметров published = 0 и syncsite = 0 - то кэш ресурсов не будет очищен.
А опубликовать можно вручную. Вот, что вышло у меня в итоге:
// Создаем ресурс
$response = $modx->runProcessor('resource/create', $data);
if ($response->isError()) {
return $response->getMessage();
}
$id = $response->response['object']['id'];
// Публикуем
if ($res = $modx->getObject('modResource', $id)) {
$res->fromArray(array(
'published' => 1
,'publishedon' => time()
,'publishedby' => $modx->user->id
));
$res->save();
}
// Генерируем карту ресурсов
$results = $modx->cacheManager->generateContext($modx->context->key);
$modx->context->resourceMap = $results['resourceMap'];
$modx->context->aliasMap = $results['aliasMap'];
// Редиректим юзера
$modx->sendRedirect($modx->makeUrl($id,'','','full'));
Наверное, я бы докопался и без новой IDE, но с ней вышло гораздо быстрее и приятнее. Между прочим, они дают бесплатную лицензию для OpenSource проектов.
0
👍
👎
❤️
🔥
😮
😢
😀
😡
2 682
15.10.2012, 12:41:26
13 комментариев
Valentin Rasulov
15.10.2012, 17:22:41
Знакомая тема (одна из многих — forums.modx.com/index.php?topic=56819.0), ни раз встречал вопросы по ней, но решения не видел. Молодец.
По поводу лицензии — я узнал, после того как купил, но даже не растраиваюсь, идешка того стоит!
Василий Наумкин
15.10.2012, 17:29:21
Поддержал ребят! Тем более, они нашенские, и Питера.
О проблеме не знал, пока сам не столкнулся.
Максим Франц
15.10.2012, 17:56:07
Питерские? Чтож они only english то.
Ivan Klimchuk
15.10.2012, 17:28:44
А лицензию уже дали? И насколько быстро дали?
Василий Наумкин
15.10.2012, 17:31:41
На следующий день.
Надо заполнить форму, указать свой проект, репозиторий и всякое такое, отправить.
Сразу приходит сообщение, мол получили, щас рассмотрим, ну а потом лицензия.
Я уже второй раз получил. Прошлую по глупости удалил из почты — когда не смог с напрыгу разобраться с IDE…
Ivan Klimchuk
15.10.2012, 17:52:06
Я то давно их продуктами пользуюсь. Еще на PyCharm начинал, когда проект делал на джанге, теперь вот PhpStorm. Нужно будет выпустить свой SE Manager и тоже просить. А то триалы надоело раз в месяц качать :)
Alex Vakhitov
15.10.2012, 17:44:25
phpStorm отличная вещь, и ценовая политика у них тоже отличная, не то что у Adobe
Виталий Киреев
15.10.2012, 17:49:13
Пробовал триальную версию. Что-то не пошло. Показалось Netbeans лучше. Так на нем и остался.
Зачем в sendRedirect отправлять полный адрес? $modx->sendRedirect($modx->makeUrl($id)); короче и отправит туда же)
Valentin Rasulov
15.10.2012, 18:10:29
в принципе кто как желает. Я вообще, если под проект пишу, то без makeUrl
$uri = $response->response['object']['uri'];
$modx->sendRedirect($uri);
Василий Наумкин
15.10.2012, 18:18:26
Можно и так, но будет работать только со включенными friendly_urls.
Максим Франц
16.10.2012, 11:43:38
Не затруднит подробней описать свой опыт использования PhpStorm? Раньше Вы пользовались чистым notepad++? Пробовали другие IDE? Например на хабре так же рекомендовали NetBeans.
С PhpStorm работать стало быстрей? Удобней?
Это примерно как блокнот и HomeSite/Dreamweaver для html/css?
Василий Наумкин
16.10.2012, 12:24:10
Напишу, но позже, когда получше разберусь.
Алексей Добряков
07.02.2013, 11:24:30
Спасибо, как раз понадобилось!
bezumkin.ru
Личный сайт Василия Наумкина
Прямой эфир
Василий Наумкин
01.07.2024, 11:56:41
Да, верно, именно так.
А в контроллере, скорее всего, ловить данные методом post.
Василий Наумкин
26.06.2024, 09:38:15
О, точно, вылезает если не залогинен.
Спасибо, исправил!
Василий Наумкин
09.04.2024, 04:45:01
> Ошибка 500
Это не похоже на ошибку Nginx, это скорее всего ошибка PHP - надо смотреть его логи.
...
russel gal
09.03.2024, 20:17:18
> А этот стоило написать хотя бы затем, чтобы получить комментарий от юзера, который ничего не писал...
Александр Наумов
27.01.2024, 03:06:18
Василий, спасибо!
Извини, тупанул.