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

时间:2017-04-14 13:33:52

标签: smarty prestashop prestashop-1.6

我正在使用PrestaShop 1.6的配额模块,其中一个功能是需要在购物车的页面中以及从主页向购物车添加商品时打开的模式中显示消息

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

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

观点: enter image description here

enter image description here

你能帮助我吗?

1 个答案:

答案 0 :(得分:2)

要在结帐页面上显示消息,您可以使用所需的任何前控制器挂钩。我想最有意义的是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,其中包括blockcart-ajax.php,它加载blockcart module method加载JSON template文件输出数据(???)
  3. 一种方法是使用钩子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>
    

    现在你应该在弹出窗口中获得引导警报。

    相当多的原生prestashop模块已经(我猜)多年来更新,因为它们中很多都是广泛返工的好候选者,或者至少符合MVC工作流程,这会使像你这样的修改变得更加简单