Prestashop:如何在购物车中显示消息

Prestashop: how to display messages in the cart

我正在使用 PrestaShop 1.6 的配额模块,其中一个功能是需要在购物车页面和当您将商品添加到购物车时打开的模式中显示一条消息主页。

我正在使用 hookCart 挂钩函数 public function hookCart($params),它在我模块的 class 中。从它我可以得到这样的控制器实例 $this->context->controller

我的问题是如何在这两个视图中显示消息? 我尝试将它们添加到 errors 数组中。我可以看到消息,但看不到我应该显示的方式。我想在来自 bootstrap.

的那些警报 classes 中显示

观点:

你能帮帮我吗?

要在结帐页面上显示一条消息,您可以使用任何您想要的前端控制器挂钩。我想最有意义的是 displayTop。我们不会在顶部输出任何 html,只是向控制器的错误数组添加一条消息。

public function hookDisplayTop()
{
    $controller = $this->context->controller;
    if ($controller->php_self != 'order' && $controller->php_self != 'order-opc') {
        return false;
    }
    /* 
        You can do custom logic here if you want to display message only
        on some conditions or only on specific step of the checkout
    */
    $controller->errors[] = $this->l('Some message');

    return false;
}

对于弹出窗口,事情变得混乱,因为:

  1. 弹窗没有错误显示区域
  2. Blockcart AJAX 使用奇怪的逻辑调用 CartController which includes blockcart-ajax.php which loads blockcart module method which loads a JSON template 文件输出数据 (???)

一种方法是使用挂钩 actionCartSave。这个钩子几乎在所有购物车操作上都会执行,所以我们需要确保在将产品添加到购物车时添加我们的消息,使用 ajax 等

public function hookActionCartSave()
{
    // If cart doesn't exist or product is not being added to cart in ajax mode - do nothing
    if (!$this->context->cart || !Tools::getValue('id_product) || !Tools::getValue('add') || !Tools::getValue('ajax')) {
        return false;
    }
    /* 
        You can do custom logic here if you want to display message only
        on some conditions
    */
    $this->context->smarty->assign('mycartpopupmessage', $this->l('Message');

    return false;
}

然后您必须修改 themes/default-bootstrap/modules/blockcart/blockcart-json.tpl 文件以将您的消息添加到 JSON 模板中。

...
"wrappingCost": {$wrapping_cost|json_encode},
"nbTotalProducts": {$nb_total_products|intval},
"total": {$total|json_encode},
{if isset($mycartpopupmessage)}
    "mycartpopupmessage": {$mycartpopupmessage|json_encode},
{/if}
....

然后需要修改themes/default-bootstrap/js/modules/blockcart/ajax-cart.js,增加如下内容

if (jsonData.mycartpopupmessage) {
    $('#layer_cart .alert-message').html(jsonData.mycartpopupmessage);
    $('#layer_cart .alert').removeClass('hidden');
}
else {
    $('#layer_cart .alert').addClass('hidden');
}

最后修改themes/default-bootstrap/modules/blockcart/blockcart.tpl 并添加警报 div

<div class="alert alert-danger hidden">
    <button data-dismiss="alert" type="button" class="close">×</button>
    <p>{l s='There is 1 error' mod='mymodule'}</p>
    <ol>
        <li class="alert-message"></li>
    </ol>
</div>

现在您应该会在弹出窗口中收到 bootstrap 警报。

相当多的原生 prestashop 模块(我猜)多年来没有更新,因为它们中的很多都是进行大量返工的良好候选者,或者至少符合 MVC 工作流程,这将使像您这样的修改变得更加简单.