Я пишу собственный контроллер для Prestashop. Предполагается сделать простую задачу: 1. Создать новую корзину, если она не была создана (отлично работает) 2. Получить идентификатор атрибута из базы данных (нормально работать) 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'] равным нулю), но во второй раз все работает нормально. Даже первый продукт исправлен.
Мне удалось решить проблему.
Правильный способ создания тележки:
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; }
Добавить настройку
$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]);
Получить настройки
$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 иметь тот же идентификатор.