Fatal error: Call to a member function toArray()
Добрый день.
Столкнулся с такой проблемой.
Получаю список товаров из каталога при помощи сниппета
Fatal error: Call to a member function toArray() on a non-object in /var/www/u0207603/data/www/tech-development3.ru/core/cache/includes/elements/modsnippet/31.include.cache.php on line 49
Ругается на вот этот вот участок кода
Если кто может — помогите пожалуйста разобраться в чем проблема и почему она возникает не постоянно, а иногда.
Спасибо.
Только что понял, что тот php файл, на который ругается сайт — это код используемого сниппета — LastView, который я использую для отображения последних просмотренных товаров. Хм… Вызов этого сниппета происходит на странице карточки товара и периодически дает сбой.
Столкнулся с такой проблемой.
Получаю список товаров из каталога при помощи сниппета
[[!msProducts?
&parents=`2`
&limit=`9`
&tpl=`good`
&includeThumbs=`130x150,420x484`
&sortdir=`DESC`
]]
В шаблоне good идет формирование ссылки на товар в таком виде — <a href="[[~[[+id]]]]"><img width="277" height="319" src="[[+image:default=`[[++assets_url]]components/minishop2/img/web/ms2_small.png`]]" alt=""></a>
Все работает, но иногда, то часто то редко, то на разных браузерах, то на одном и том же клик по этой ссылке ведет на страницу с ошибкой вот с таким содержимым.Fatal error: Call to a member function toArray() on a non-object in /var/www/u0207603/data/www/tech-development3.ru/core/cache/includes/elements/modsnippet/31.include.cache.php on line 49
Ругается на вот этот вот участок кода
// Выводим просмотренные страницы без вызова сниппета
if ($show == '1' && $snippet == false) {
$output = '';
foreach ($ids as $tsID) {
if($tsID != $id) {
$page = $modx->getObject('modResource', $tsID)->toArray();
$output .= $modx->getChunk($tpl, $page);
}
}
return $output;
}
Если кто может — помогите пожалуйста разобраться в чем проблема и почему она возникает не постоянно, а иногда.
Спасибо.
Только что понял, что тот php файл, на который ругается сайт — это код используемого сниппета — LastView, который я использую для отображения последних просмотренных товаров. Хм… Вызов этого сниппета происходит на странице карточки товара и периодически дает сбой.
Комментарии: 4
// Выводим просмотренные страницы без вызова сниппета
if ($show == '1' && $snippet == false) {
$output = '';
foreach ($ids as $tsID) {
if($tsID != $id) {
if ($obj = $modx->getObject('modResource', $tsID)) {
$page = $obj->toArray();
$output .= $modx->getChunk($tpl, $page);
}
}
}
return $output;
}
Спасибо. Уже применил для вывода последних товаров другой код. Но Ваше исправление все равно протестирую.
Илья привел правильный пример кода, но чтобы было понятно, что происходит, я прокомментирую. В вашем коде вы вызывали toArray() сразу же после того, как пробовали получить объект ресурса. Но видимо в некоторых случаях запрашиваемого объекта не было и метод getObject возвращал null, а затем вы следом пытались вызвать метод toArray, который есть у объекта ресурса, но закономерно, такого нет у null. Поэтому и возникала ошибка. В код Ильи стоит дополнительная проверка, только если вернулся валидный объект, отличный от null, только в таком случае будет вызван метод toArray. Казалось бы, такое незначительно улучшение и решает проблему с fatal error, но на деле обычная практика обработки потенциальных ошибок в коде.
Спасибо за детальное пояснение. Действительно решило проблему.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.