Я искал вокруг какое-то время и только придумал решения, которые добавили целые новые опции для продуктов в магазине Magento.
То, что я пытаюсь сделать, – это способ добавить Простую Продукцию в корзину. Этот простой продукт имеет некоторые заранее определенные пользовательские параметры (свободные текстовые поля), которые должны быть заполнены функцией php.
Итак, как я могу это сделать? Предположим, у меня есть продукт с идентификатором «111» и один пользовательский вариант.
$qty = '1'; $product = Mage::getModel('catalog/product')->load("111"); // set option value in product model? $cart = Mage::helper('checkout/cart')->getCart(); $cart->addProduct($product, $qty); // set option value while passing product to car? $cart->save();
Спасибо заранее за любые задние.
BTW: установка значений опций через QueryString относительно легко, как показано здесь .
Вы не устанавливаете пользовательскую опцию в модели продукта, вы передаете ее через второй аргумент в $cart->addProduct($product, $params)
.
У нас для проекта, который требует внешнего приложения для добавления в корзину Magento, является использование массива $params
следующего формата:
$params = array( 'product' => 1, // This would be $product->getId() 'qty' => 1, 'options' => array( 34 => "value", 35 => "other value", 53 => "some other value" ) );
Параметр $params['options']
содержит настраиваемую опционную информацию. Ключами являются настраиваемые идентификаторы параметров, вы можете увидеть их, если вы просмотрите раздел настраиваемых параметров экрана продукта с помощью Firebug или аналогичный.
$params['product']
может быть избыточным, я написал этот скрипт некоторое время назад для гораздо более ранней версии Magento.
Кроме того, я уверен, что стандартные добавления в корзину событий будут срабатывать, когда вы добавите этот путь, так что вам нужно будет отключить их самостоятельно. Возможны побочные эффекты.
В Magento 1.7 вы должны обернуть массив params в объект Varien.
$params = array( 'product' => $_fancypack->getId(), 'qty' => 1, 'options' => array( $this->_getOptionId($_fancypack,'Product SKU') => $product->getId() .'/'. $product->getSku() ) ); $request = new Varien_Object(); $request->setData($params); $quote->addProduct($_fancypack, $request);
Вы должны написать входной параметр для addproduct
как следующий формат, он сам проверяется:
$params = array( 'product' => 1, // This would be $product->getId() 'qty' => 1, 'super_attribute' => array( 34 => "value", 35 => "other value", 53 => "some other value" ) );
Проблема с текущим ответом заключается в том, что magento не будет добавлять вторую позицию, если SKU является тем же, но параметры отличаются от первого. Если вы хотите, чтобы 3 яблоко и 4 "яблоко вы хотели иметь отдельные позиции. Или, по крайней мере, я это делаю.
HTTP-вызов следующего URL-адреса
/store/checkout/cart/add?product=23&qty=1&options[41]=4
с последующим
/store/checkout/cart/add?product=23&qty=1&options[41]=3
добавит две позиции.
Но все же это всего лишь половина битвы, что означают эти коды опций? Ну, следующий PHP-код скажет вам. И поскольку мы используем HTTP-вызов, код вернет javascript, готовый JSON.
<?php include_once '../app/Mage.php'; Mage::app(); echo getProductOptionsIds($_GET['eventcode']); function getProductOptionsIds($sku) { $ProductID = Mage::getModel('catalog/product')->getIdBySku($sku); $Product = Mage::getModel('catalog/product')->load($ProductID); $config = array(); $config['ProductID'] = $ProductID; foreach ($Product->getOptions() as $option) { // @var $option Mage_Catalog_Model_Product_Option if ($option->getGroupByType() == Mage_Catalog_Model_Product_Option::OPTION_GROUP_SELECT) { $_tmpValues = array(); foreach ($option->getValues() as $value) { // @var $value Mage_Catalog_Model_Product_Option_Value $_tmpValues[$value->getTitle()] = $value->getId(); } $config[$option->getTitle().'list'] = $option->getId(); $optionValue = $_tmpValues; } else { $optionValue = $option->getId(); } $config[$option->getTitle()] = $optionValue; } return json_encode($config); } ?>