我正在使用prestashop 1.5.6.0。当用户点击添加到购物车按钮时,我正在创建购物车规则并将其分配到购物车,如果我点击"购物车"链接在右上角,我收到了致命错误:第565行第565页上的/classes/CartRule.php中的非对象上调用成员函数getProducts()。但如果购物车不是空的,那我就不会收到错误。
为了将购物车规则分配到购物车,我使用了以下代码:
public function hookActionCartSave($params){
$code = $this->context->cookie->__get('token');
if (($cartRule = new CartRule(CartRule::getIdByCode($code))) && Validate::isLoadedObject($cartRule)) {
if ($error = $cartRule->checkValidity($this->context, false, true)) {
$this->errors[] = $error;
} else {
$this->context->cart->addCartRule($cartRule->id);
}
}
}
任何人都可以帮助解决此问题
由于
答案 0 :(得分:0)
你为什么这样做?如果您未将代码设置为购物车规则,则会自动将其添加到购物车...
对于您的错误,问题是当挂钩被触发时,您的购物车不会填充您的上下文。因此,如果您真的需要这样做,则必须在函数" initContent"中创建自己的钩子,放置在ParentOrderController中,这是检查并添加推车规则的地方。
答案 1 :(得分:0)
您的代码假定Cart
对象中存在有效的Context
对象,即使它不存在。例如,在初始购物车创建过程中调用此功能时不会。
无论如何,这条规则在空车上毫无意义。
只需添加:
if (!isset($this->context->cart) || !$this->context->cart || !$this->context->cart->nbProducts())
return;
作为你的钩子函数的第一行,应该做的伎俩。我假设您的购物车规则逻辑正常运行(例如当购物车包含产品时)。
编辑:只是为了进一步澄清。 $cartRule->checkValidity($this->context, false, true)
取决于Cart
中的Context
对象,如果未设置,则可能会返回null
或false
。