[РЕШЕНО] Не могу получить ресурс

Всем привет, есть вот такой код
<?php
$result = $modx->runSnippet('FormIt', $scriptProperties);
foreach($modx->placeholders as $key => $ph){
    if(strpos($key, $scriptProperties[placeholderPrefix].'error.') === 0){
        $placeholders[$key] = $ph;
    } 
}

if (!count($placeholders)) {
    $loginResponse = $modx->runProcessor('/security/login', $_POST);
    if(!$loginResponse->response['success']){
        $placeholders['auth.error.msg'] = '<span class="error">'.$loginResponse->response['message'].'</span>';
        return  $AjaxForm->error($loginResponse->response['message'], array('error' => $loginResponse->response['message']));
    }else{
        $resource = $modx->getObject('modResource', $scriptProperties['loginResourceId']);
        $context = $resource->get('context_key');
        return $AjaxForm->success('Вы успешно авторизованы', array(
                'url' => $modx->makeUrl($scriptProperties['loginResourceId'], $context, '', 'full' )
            ));
    }
    
}else{
    return  $AjaxForm->error('В форме содержатся ошибки', array('error' => $placeholders));
}

//$modx->log(1, print_r($loginResponse->response,1));
Его написал я. на одном сайте он работает отлично, на другом, куда я его просто скопировал он не работает. В частности не срабатывает
$resource = $modx->getObject('modResource', $scriptProperties['loginResourceId']);
При этом $scriptProperties['loginResourceId'], если выводить в лог содержит 18 и это id ресурса который существует. Если этот код скопировать в Console и поменять $scriptProperties['loginResourceId'] на 18 проблем нет.
У кого есть идеи что не так?
Артур
26 января 2021, 00:04
modx.pro
353
0
Поблагодарить автора Отправить деньги

Комментарии: 10

Артем
26 января 2021, 01:28
0
В частности не срабатывает
Что находится в $resource после получения объекта?
Приведи $scriptProperties['loginResourceId'] к числу и залогируй еще раз результат.
    Артур
    26 января 2021, 01:42
    0
    $modx->log(1, 'loginResourceId ' . (int)$scriptProperties['loginResourceId']);

    Получил
    26.01.2021	01:41:22	ERROR	core/cache/includes/elements/modsnippet/85.include.cache.php	15
    loginResourceId 18
      Артем
      26 января 2021, 02:00
      0
      Так а в $resource что находится после получения ресурса?
      Залогируй его тоже, проверь результат. Если null, то попробуй указать напрямую 18, прям в коде.
        Артур
        26 января 2021, 15:47
        0
        Попробовал указать 18 прям в коде, в логах пусто, т.е.
        $resource = $modx->getObject('modResource', 18);
        возвращает null. Ничего не понимаю.
          Артем
          26 января 2021, 16:33
          0
          Ты получаешь ресурс в том контексте, к которому у тебя нет доступа.

          $payload = array_merge($_POST, [
              'login_context' => 'web',
              'add_contexts' => 'твои дополнительные контексты через запятую',
          ]);
          $loginResponse = $modx->runProcessor('/security/login', $payload);
          Если нужен только 1 специфичный контекст, то его можно указать в login_context, а add_contexts опустить.
            Артур
            26 января 2021, 17:24
            0
            Я вывел в лог из этого файла core/model/modx/processors/security/login.class.php вот это
            $this->modx->log(1, $this->loginContext);
            И там было web. Что в общем-то ожидаемо, поскольку этот код работает на другом сайте. Тем не менее я попробовал добавить ваш вариант, ничего не изменилось.
              Артем
              26 января 2021, 18:32
              0
              Можешь скинуть доступы в личку, посмотрю.
                Артур
                26 января 2021, 18:38
                0
                Давай через кнопку в профиле напишу тебе письмо.
                  Артем
                  26 января 2021, 20:15
                  +1
                  1. После логина через процессор modx считает, что не нужно обновлять свойство $modx->user, поэтому там до сих пор висит пользователь с id 0, т.е. аноним.
                  2. Для ресурса №18 у тебя указана группа Customers, т.е. пользователь должен иметь доступ к этой группе ресурсов, чтобы ее посмотреть.
                  3. Поскольку текущий юзер — аноним, то у него нет прав для просмотра ресурса №18, отсюда и null в getObject.
                  Можешь попробовать убрать галочку с группы Customers у 18 ресурса и getObject волшебным образом заработает.

                  Решение простое: принудительно присваивай в $modx->user текущего юзера после успешной авторизации, тогда он пройдет проверку прав и все заработает.
                  Эта проблема уже обсуждалась тут: modx.pro/help/1136
                    Артур
                    26 января 2021, 20:42
                    0
                    Спасибо, очень помог!
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    10