单击添加到购物车按钮后,将动态创建的购物车规则分配给购物车时出现问题

时间:2014-03-27 08:53:43

标签: hook prestashop

我正在使用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);
       }
    }
}

任何人都可以帮助解决此问题

由于

2 个答案:

答案 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对象,如果未设置,则可能会返回nullfalse