Fatal error: Call to a member function toArray() Новый

Дополнение: miniShop2

Добрый день.
Столкнулся с такой проблемой.
Получаю список товаров из каталога при помощи сниппета
[[!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, 08:01    Александр Мельник   
0    624 0

Комментарии (4)

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