Обратите внимание на $category->getProducts(): попытка получить свойство не-объекта

Я пытаюсь получить общее количество продуктов в одной категории в Prestashop, я получаю правильное число, но с этим уведомлением:

"Попытка получить свойство не-объекта в Category.php".

Вот мой код:

<?php
define('PRESTASHOP_S_EXTERNAL_SCRIPT', true);
include(dirname(__FILE__).'\..\prestashop_1.6.1.0\prestashop\config\config.inc.php');

//returns 1
echo Configuration::get('PS_LANG_DEFAULT');

$id_category = 123;

$category = new Category($id_category, (int)Configuration::get('PS_LANG_DEFAULT'),(int)Configuration::get('PS_SHOP_DEFAULT'));

//works
echo $category->getName();

//returns 1   
echo is_object($category);

//returns the correct number but with a PHP notice ("Trying to get property of non-object in Category.php on line 671")
echo $category->getProducts(1,1,1000,null,null,1,1);

person Stéphane1405    schedule 17.02.2016    source источник


Ответы (1)


Это уведомление выдается, потому что в вашем контексте не установлен какой-либо контроллер.

Если вы посмотрите на Category.php в строке 671:

public function getProducts($id_lang, $p, $n, $order_by = null, $order_way = null, $get_total = false, $active = true, $random = false, $random_number_products = 1, $check_access = true, Context $context = null)
{
    // [...]
    $front = in_array($context->controller->controller_type, array('front', 'modulefront'));
    // [...]
}

Проблема возникает из-за этого кода $context->controller->controller_type. В вашем контексте не определен контроллер, потому что вы не запускаете свой скрипт из Prestashop.

Вы можете попробовать вручную добавить контроллер в объект контекста:

$context = Context::getContext();
$context->controller = new FrontController();
echo $category->getProducts(1,1,1000,null,null,1,1);
person Florian Lemaitre    schedule 17.02.2016
comment
Я добавил: $context = Context::getContext(); $context->controller = new Controller(); Последняя строка выдает фатальную ошибку Не удается создать экземпляр контроллера абстрактного класса. - person Stéphane1405; 18.02.2016
comment
Плохо, попробуйте вместо этого AdminController. - person Florian Lemaitre; 18.02.2016
comment
AdminController выдает пару ошибок, но FrontController работает нормально. Итак, код: $context = Context::getContext(); $context->controller = new FrontController(); - person Stéphane1405; 18.02.2016