Prestashop:将定制产品添加到购物车 [英] Prestashop: add customized product to cart
问题描述
我正在写一个Prestashop的自定义控制器.它应该做一个简单的任务: 1.如果没有创建一个新的购物车(可以正常工作) 2.从数据库获取属性ID(可以正常工作) 3.分配自定义(一个文本字段) 4.将此产品添加到购物车.
I'm writnig a custom controller for Prestashop. It is suposed to do a simple task: 1. Create a new cart if it wasn't created (working fine) 2. Get attribute ID from database (working fine) 3. Assign customization (one text field) 4. Add this product to cart.
我当前的代码:
$idProduct = 1; // for me it's always one
$qty= 1; // always add one item
$text = (string)Tools::getValue('textField9'); // string of text customization
$attribute = (int)Tools::getValue('sel_combination'); // atribute combination ID
// get cart id if exists
if ($this->context->cookie->id_cart)
{
$cart = new Cart($this->context->cookie->id_cart);
}
// create new cart if needed
if (!isset($cart) OR !$cart->id)
{
$cart = new Cart();
$cart->id_customer = (int)($this->context->cookie->id_customer);
$cart->id_address_delivery = (int) (Address::getFirstCustomerAddressId($cart->id_customer));
$cart->id_address_invoice = $cart->id_address_delivery;
$cart->id_lang = (int)($this->context->cookie->id_lang);
$cart->id_currency = (int)($this->context->cookie->id_currency);
$cart->id_carrier = 1;
$cart->recyclable = 0;
$cart->gift = 0;
$cart->add();
$this->context->cookie->id_cart = (int)($cart->id);
$cart->update();
}
// get product to add into cart
$productToAdd = new Product(1, true, (int)($this->context->cookie->id_lang));
// default attributes
// $default_id_product_attribute = Product::getDefaultAttribute($productToAdd->id, $minimumQuantity);
// assign real attributes
$attributes = $attribute;
$cart->update();
// add customizatated text
$customization = $this->context->cart->addTextFieldToProduct((int)($idProduct), 9, Product::CUSTOMIZE_TEXTFIELD, $text );
$exising_customization = Db::getInstance()->executeS('SELECT id_customization FROM '._DB_PREFIX_.'customized_data ORDER BY id_customization DESC LIMIT 0,1');
$customization = $exising_customization[0]['id_customization'];
Db::getInstance()->execute('UPDATE ps_customization SET in_cart = 1, id_product_attribute = '.$attributes.' WHERE id_customization = ' .$customization);
// add product to cart
$cart->updateQty($qty, (int)($idProduct), (int)($attributes), (int)($customization), Tools::getValue('op', 'up'));
$prods = $cart->getProducts(true);
print_r ($prods[0]['id_customization']);
// update cart
$cart->update();
已创建购物车,并向其中添加了产品.购物车上说,有一种产品-但没有显示.重新加载以上代码后,购物车将显示2个项目,其中包含正确的自定义数据.
The cart is created and a product is added to it. The cart says, that there is one product - but it's not displayed. After reload of the above code, the cart shows 2 items with proper customization data.
从我可以发现的问题出在定制中.第一次没有分配它($ cart-> getProducts(true);显示['id_customization']为空),但是第二次一切都正常.甚至第一个产品都是固定的.
From what I could find the problem lies in in the customization. The first time it is not assigned ($cart->getProducts(true); shows ['id_customization'] to be null), but the second time everything is working fine. Even the first product is fixed.
推荐答案
我设法解决了该问题.
-
创建购物车的正确方法:
Proper way to create a cart:
if (!$this->context->cart->id)
{
if (Context::getContext()->cookie->id_guest)
{
$guest = new Guest(Context::getContext()->cookie->id_guest);
$this->context->cart->mobile_theme = $guest->mobile_theme;
}
$this->context->cart->add();
if ($this->context->cart->id)
$this->context->cookie->id_cart = (int)$this->context->cart->id;
}
添加自定义
Add customization
$this->product = new Product(1, true, (int)($this->context->cookie->id_lang));
$authorized_text_fields = array();
if (!$field_ids = $this->product->getCustomizationFieldIds())
return false;
foreach ($field_ids as $field_id)
if ($field_id['type'] == Product::CUSTOMIZE_TEXTFIELD)
$authorized_text_fields[(int)$field_id['id_customization_field']] = 'textField'.(int)$field_id['id_customization_field'];
$indexes = array_flip($authorized_text_fields);
foreach ($_POST as $field_name => $value)
if (in_array($field_name, $authorized_text_fields) && !empty($value))
{
if (!Validate::isMessage($value))
$this->errors[] = Tools::displayError('Invalid message');
else
$this->context->cart->addTextFieldToProduct($this->product->id, $indexes[$field_name], Product::CUSTOMIZE_TEXTFIELD, $value);
}
else if (in_array($field_name, $authorized_text_fields) && empty($value))
$this->context->cart->deleteCustomizationToProduct((int)$this->product->id, $indexes[$field_name]);
获取自定义内容
Get the customizations
$texts = $this->context->cart->getProductCustomization($this->product->id, Product::CUSTOMIZE_TEXTFIELD, true);
$text_fields = array();
foreach ($texts as $text_field)
$text_fields['textFields_'.$this->product->id.'_'.$text_field['index']] = str_replace('<br />', "\n", $text_field['value']);
这篇关于Prestashop:将定制产品添加到购物车的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!