繁体   English   中英

Prestashop:将定制产品添加到购物车

[英]Prestashop: add customized product to cart

我正在为Prestashop编写一个自定义控制器。 它是一个简单的任务:1。创建一个新的购物车,如果它没有创建(工作正常)2。从数据库中获取属性ID(正常工作)3。分配自定义(一个文本字段)4。添加此产品去购物车。

我目前的代码:

$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项具有适当自定义数据的项目。

从我能找到的问题出现在定制中。 第一次没有分配($ cart-> getProducts(true);显示['id_customization']为null),但第二次一切正常。 即使是第一个产品也是固定的。

我设法解决了这个问题。

  1. 正确的方法来创建购物车:

     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; } 
  2. 添加自定义

     $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]); 
  3. 获取自定义

     $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']); 

验证购物车最简单:

// Validate the object cart $this->context->cart->save(); $this->context->cookie->id_cart = (int)$this->context->cart->id;

如果存在,save()方法会更新购物车,如果不存在则创建新购物。 然后强制cookie具有相同的ID。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM