关于Ajax的PS 1.6模块触发事件添加到购物车

时间:2017-04-10 07:07:30

标签: javascript php module prestashop prestashop-1.6

我一直在研究PrestaShop模块最近是如何工作的,如果有人能指出我正确的方向,那将会很棒。 我想触发一个事件(准确的javascript方法,让我们称之为" MyShop"),它将获得其中的所有产品详细信息。 我有一些较旧的代码,但要么是使用旧版本的PS,要么它只适用于普通的添加到购物车而不是ajax。 问题是,在按下"添加到购物车后,它甚至都不会被触发。按钮,它实际上是Google Analytics模块的一段代码。

这是我模块的主要.php文件中的一段修改过的代码,应该在添加到购物车时触发,它使用" hookActionCartSave()"但是我不确定1.6是否仍然可以使用或者被其他东西取代,或者它是否只是不能与ajax一起工作而我应该在其他地方寻找?

 /**
         * hook save cart event to implement addtocart and remove from cart functionality
         */
        public function hookActionCartSave()
        {
            if (!isset($this->context->cart))
                return;

            $cart = array(
                          'controller' => Tools::getValue('controller'),
                          'addAction' => Tools::getValue('add') ? 'add' : '',
                          'removeAction' => Tools::getValue('delete') ? 'delete' : '',
                          'extraAction' => Tools::getValue('op'),
                          'qty' => (int)Tools::getValue('qty', 1)
                          );

            $cart_products = $this->context->cart->getProducts();

            if (isset($cart_products) && count($cart_products))
                foreach ($cart_products as $cart_product)
                if ($cart_product['id_product'] == Tools::getValue('id_product'))
                    $add_product = $cart_product;

            if ($cart['removeAction'] == 'delete')
            {
                $add_product_object = new Product((int)Tools::getValue('id_product'), true, (int)Configuration::get('PS_LANG_DEFAULT'));
                if (Validate::isLoadedObject($add_product_object))
                {
                    $add_product['name'] = $add_product_object->name;
                    $add_product['manufacturer_name'] = $add_product_object->manufacturer_name;
                    $add_product['category'] = $add_product_object->category;
                    $add_product['reference'] = $add_product_object->reference;
                    $add_product['link_rewrite'] = $add_product_object->link_rewrite;
                    $add_product['link'] = $add_product_object->link_rewrite;
                    $add_product['price'] = $add_product_object->price;
                    $add_product['ean13'] = $add_product_object->ean13;
                    $add_product['id_product'] = Tools::getValue('id_product');
                    $add_product['id_category_default'] = $add_product_object->id_category_default;
                    $add_product['out_of_stock'] = $add_product_object->out_of_stock;
                    $add_product = Product::getProductProperties((int)Configuration::get('PS_LANG_DEFAULT'), $add_product);
                }
            }

            if (isset($add_product) && !in_array((int)Tools::getValue('id_product'), self::$products))
            {
                self::$products[] = (int)Tools::getValue('id_product');
                $ga_products = $this->wrapProduct($add_product, $cart, 0, true);
                if (array_key_exists('id_product_attribute', $ga_products) && $ga_products['id_product_attribute'] != '' && $ga_products['id_product_attribute'] != 0)
                    $id_product = $ga_products['id_product_attribute'];
                else
                    $id_product = Tools::getValue('id_product');
                if (isset($this->context->cookie->MyShop_cart))
                    $MyShop_cart = unserialize($this->context->cookie->MyShop_cart);
                else
                    $MyShop_cart = array();
                if ($cart['removeAction'] == 'delete')
                    $ga_products['quantity'] = -1;
                elseif ($cart['extraAction'] == 'down')
                {
                    if (array_key_exists($id_product, $MyShop_cart))
                        $ga_products['quantity'] = $MyShop_cart[$id_product]['quantity'] - $cart['qty'];
                    else
                        $ga_products['quantity'] = $cart['qty'] * -1;
                }
                elseif (Tools::getValue('step') <= 0) // Sometimes cartsave is called in checkout
                {
                    if (array_key_exists($id_product, $MyShop_cart))
                        $ga_products['quantity'] = $MyShop_cart[$id_product]['quantity'] + $cart['qty'];
                }
                $MyShop_cart[$id_product] = $ga_products;
                $this->context->cookie->MyShop_cart = serialize($MyShop_cart);

                $this->didCartChange = 1;
            }
        }

我知道关于我正在寻找的东西是在blockcart / ajax-cart.js和controllers / front / CartController.php中处理但是我不确定在哪里或者要找什么,这样我希望有人会引导我找到正确的方向,或者节省一些时间进行搜索。

我还假设关于javascript药水,我必须修改模板本身,这是我的模块头文件中的一段代码:.tpl:

var MyShop_blockcart_log = function(json) {
    var products = json.products;
    var product;
    var ps = [];
    var p;

    for(var i=0; i<products.length; i++) {
        product = products[i];
        p = {};

        p.id = product.id;
        p.link = product.link;
        p.imageUrl = product.id_image.replace("medium_default", "large_default");
        p.quantity = product.quantity;
        p.name = product.name;
        p.price = "{$currency->sign} " + (parseInt(product.price_float) / product.quantity).toFixed(2);


        ps.push(p);
    }

    MyShop("log", "product", "cart", ps);
}

该代码不会导致任何错误,它只是在将产品添加到购物车后才会被触发,它应该是。 我是否必须通过我的header.tpl文件将其绑定到添加到购物车按钮?如果是,那我该怎么做呢?

提前致谢, 欢呼声。

1 个答案:

答案 0 :(得分:0)

hookActionCartSave仅在cart->add()cart->update()上执行。但是当CartController更新/添加产品时,如果该客户已经存在购物车,则它不会执行其中任何一个。

我建议使用actionBeforeCartUpdateQty:

Hook::exec('actionBeforeCartUpdateQty', array(
        'cart' => $this,
        'product' => $product,
        'id_product_attribute' => $id_product_attribute,
        'id_customization' => $id_customization,
        'quantity' => $quantity,
        'operator' => $operator,
        'id_address_delivery' => $id_address_delivery,
        'shop' => $shop,
        'auto_add_cart_rule' => $auto_add_cart_rule,
    ));

它可能适合您的需求。或寻找另一个钩子。在最后一种情况下,您可以覆盖CartController->postProcess并检查它是否尝试添加/删除产品。我使用此覆盖来让用户添加购物车可用的最大金额。例如,如果stock为5,并且用户尝试添加6,则它将添加5并且不发送错误。它还会检查包装中使用的产品。如果同一产品是2包装,则用户无法订购两个包装的最大库存。