[РЕШЕНО] Не могу получить ресурс
Всем привет, есть вот такой код
У кого есть идеи что не так?
<?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 проблем нет. У кого есть идеи что не так?
Поблагодарить автора
Отправить деньги
Комментарии: 10
В частности не срабатываетЧто находится в $resource после получения объекта?
Приведи $scriptProperties['loginResourceId'] к числу и залогируй еще раз результат.
$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
Так а в $resource что находится после получения ресурса?
Залогируй его тоже, проверь результат. Если null, то попробуй указать напрямую 18, прям в коде.
Залогируй его тоже, проверь результат. Если null, то попробуй указать напрямую 18, прям в коде.
Попробовал указать 18 прям в коде, в логах пусто, т.е.
$resource = $modx->getObject('modResource', 18);
возвращает null. Ничего не понимаю.
Ты получаешь ресурс в том контексте, к которому у тебя нет доступа.
$payload = array_merge($_POST, [
'login_context' => 'web',
'add_contexts' => 'твои дополнительные контексты через запятую',
]);
$loginResponse = $modx->runProcessor('/security/login', $payload);
Если нужен только 1 специфичный контекст, то его можно указать в login_context, а add_contexts опустить.
Я вывел в лог из этого файла core/model/modx/processors/security/login.class.php вот это
$this->modx->log(1, $this->loginContext);
И там было web. Что в общем-то ожидаемо, поскольку этот код работает на другом сайте. Тем не менее я попробовал добавить ваш вариант, ничего не изменилось.
Можешь скинуть доступы в личку, посмотрю.
Давай через кнопку в профиле напишу тебе письмо.
1. После логина через процессор modx считает, что не нужно обновлять свойство $modx->user, поэтому там до сих пор висит пользователь с id 0, т.е. аноним.
2. Для ресурса №18 у тебя указана группа Customers, т.е. пользователь должен иметь доступ к этой группе ресурсов, чтобы ее посмотреть.
3. Поскольку текущий юзер — аноним, то у него нет прав для просмотра ресурса №18, отсюда и null в getObject.
Можешь попробовать убрать галочку с группы Customers у 18 ресурса и getObject волшебным образом заработает.
Решение простое: принудительно присваивай в $modx->user текущего юзера после успешной авторизации, тогда он пройдет проверку прав и все заработает.
Эта проблема уже обсуждалась тут: modx.pro/help/1136
2. Для ресурса №18 у тебя указана группа Customers, т.е. пользователь должен иметь доступ к этой группе ресурсов, чтобы ее посмотреть.
3. Поскольку текущий юзер — аноним, то у него нет прав для просмотра ресурса №18, отсюда и null в getObject.
Можешь попробовать убрать галочку с группы Customers у 18 ресурса и getObject волшебным образом заработает.
Решение простое: принудительно присваивай в $modx->user текущего юзера после успешной авторизации, тогда он пройдет проверку прав и все заработает.
Эта проблема уже обсуждалась тут: modx.pro/help/1136
Спасибо, очень помог!
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.