Fatal error: Call to a member function toArray()

Добрый день.
Столкнулся с такой проблемой.
Получаю список товаров из каталога при помощи сниппета
[[!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, который я использую для отображения последних просмотренных товаров. Хм… Вызов этого сниппета происходит на странице карточки товара и периодически дает сбой.
Александр Мельник
27 октября 2016, 05:01
modx.pro
3 409
0

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

Илья Уткин
27 октября 2016, 09:22
+2
// Выводим просмотренные страницы без вызова сниппета
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;
}
    Александр Мельник
    27 октября 2016, 09:34
    0
    Спасибо. Уже применил для вывода последних товаров другой код. Но Ваше исправление все равно протестирую.
      Іван Клімчук
      27 октября 2016, 11:10
      +1
      Илья привел правильный пример кода, но чтобы было понятно, что происходит, я прокомментирую. В вашем коде вы вызывали toArray() сразу же после того, как пробовали получить объект ресурса. Но видимо в некоторых случаях запрашиваемого объекта не было и метод getObject возвращал null, а затем вы следом пытались вызвать метод toArray, который есть у объекта ресурса, но закономерно, такого нет у null. Поэтому и возникала ошибка. В код Ильи стоит дополнительная проверка, только если вернулся валидный объект, отличный от null, только в таком случае будет вызван метод toArray. Казалось бы, такое незначительно улучшение и решает проблему с fatal error, но на деле обычная практика обработки потенциальных ошибок в коде.
        Александр Мельник
        27 октября 2016, 18:29
        0
        Спасибо за детальное пояснение. Действительно решило проблему.
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    4