我一直在研究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文件将其绑定到添加到购物车按钮?如果是,那我该怎么做呢?
提前致谢, 欢呼声。
答案 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包装,则用户无法订购两个包装的最大库存。