Prestashop: add customized product to cart

扶醉桌前 提交于 2019-11-29 00:41:30
Michal

I managed to fix the problem.

  1. 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;
    }
    
  2. 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]);
    
  3. 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']);
    

The most simple to validate a cart:

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

the save() method upate the cart if exists or create a new if not. Then force the cookie to have the same id.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!