Редирект на ресурс сразу после его создания

Использование 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 проектов.

← Предыдущая заметка
Простейшая настройка мультиязычности
Следующая заметка →
Консольный импорт в miniShop из 1С
Комментарии (13)
ArtdevueValentin Rasulov
15.10.2012 13:22

Знакомая тема (одна из многих — forums.modx.com/index.php?topic=56819.0), ни раз встречал вопросы по ней, но решения не видел. Молодец.

По поводу лицензии — я узнал, после того как купил, но даже не растраиваюсь, идешка того стоит!

bezumkinВасилий Наумкин
15.10.2012 13:29

Поддержал ребят! Тем более, они нашенские, и Питера.

О проблеме не знал, пока сам не столкнулся.

Максим Франц
15.10.2012 13:56

Питерские? Чтож они only english то.

e055e39181d7a47f69d0dae37Ivan Klimchuk
15.10.2012 13:28

А лицензию уже дали? И насколько быстро дали?

bezumkinВасилий Наумкин
15.10.2012 13:31

На следующий день.

Надо заполнить форму, указать свой проект, репозиторий и всякое такое, отправить.

Сразу приходит сообщение, мол получили, щас рассмотрим, ну а потом лицензия.

Я уже второй раз получил. Прошлую по глупости удалил из почты — когда не смог с напрыгу разобраться с IDE…

e055e39181d7a47f69d0dae37Ivan Klimchuk
15.10.2012 13:52

Я то давно их продуктами пользуюсь. Еще на PyCharm начинал, когда проект делал на джанге, теперь вот PhpStorm. Нужно будет выпустить свой SE Manager и тоже просить. А то триалы надоело раз в месяц качать :)

alex.vakhitovAlex Vakhitov
15.10.2012 13:44

phpStorm отличная вещь, и ценовая политика у них тоже отличная, не то что у Adobe

argnistВиталий Киреев
15.10.2012 13:49

Пробовал триальную версию. Что-то не пошло. Показалось Netbeans лучше. Так на нем и остался.

Зачем в sendRedirect отправлять полный адрес? $modx->sendRedirect($modx->makeUrl($id)); короче и отправит туда же)

ArtdevueValentin Rasulov
15.10.2012 14:10

в принципе кто как желает. Я вообще, если под проект пишу, то без makeUrl

$uri = $response->response['object']['uri'];

$modx->sendRedirect($uri);

bezumkinВасилий Наумкин
15.10.2012 14:18

Можно и так, но будет работать только со включенными friendly_urls.

Максим Франц
16.10.2012 07:43

Не затруднит подробней описать свой опыт использования PhpStorm? Раньше Вы пользовались чистым notepad++? Пробовали другие IDE? Например на хабре так же рекомендовали NetBeans.

С PhpStorm работать стало быстрей? Удобней?

Это примерно как блокнот и HomeSite/Dreamweaver для html/css?

bezumkinВасилий Наумкин
16.10.2012 08:24

Напишу, но позже, когда получше разберусь.

Алексей Добряков
07.02.2013 07:24

Спасибо, как раз понадобилось!

bezumkin
Василий Наумкин
01.06.2023 02:28
Молодец, я очень рад! Мне когда приходится по работе сталкиваться с другими системами - это боль.
inetlover
Александр Наумов
31.05.2023 18:12
Понял, спасибо!
Nurbol Boken
28.05.2023 10:07
Спасибо большое!
futuris
Futuris
26.05.2023 08:05
Можно и так. Главное - варианты есть, если хочешь ковырять VESP). Virtual Box я использовал на дескт...
futuris
Futuris
21.05.2023 14:51
Да, теперь появились! Спасибо за твое терпение!
bezumkin
Василий Наумкин
15.05.2023 06:11
Молодец!
bezumkin
Василий Наумкин
09.05.2023 01:01
Не знаю даже, что ответить. По идее работать должно везде, возможно просто глюк, который лечится пер...
futuris
Futuris
05.05.2023 09:49
Блин, вот оказывается из-за чего! Извини Василий, не было злого умысла!) Я видно уже припарился и ко...
bezumkin
Василий Наумкин
29.04.2023 05:08
Думаю, что не помогут
futuris
Futuris
28.04.2023 14:37
Не то слово!