2011-01-25 7 views
8

Realicé búsquedas por un tiempo y solo surgieron soluciones ingeniosas que agregaban conjuntos de opciones totalmente nuevos a productos en una tienda Magento.Agregue valor de opción al producto, luego al carro con Magento

Lo que intento lograr es una forma de agregar un producto simple al carrito. Este producto simple tiene algunas opciones personalizadas predefinidas (campos de texto libre) que deben ser completadas por una función php.

Entonces, ¿cómo puedo hacer esto? Digamos que tengo un producto con la ID "111" y una opción personalizada.

$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(); 

Gracias de antemano por las ciervas.

BTW: la configuración de valores de opciones a través de QueryString es relativamente fácil, como se ve here.

Respuesta

15

No establece la opción personalizada en el modelo de producto, la pasa por el segundo argumento al $cart->addProduct($product, $params).

la puesta a punto que tenemos para un proyecto, que requiere una aplicación externa a añadir a la cesta Magento, es el uso de una matriz $params con el siguiente formato:

$params = array(
    'product' => 1, // This would be $product->getId() 
    'qty' => 1, 
    'options' => array(
     34 => "value", 
     35 => "other value", 
     53 => "some other value" 
    ) 
); 

El $params['options'] contiene la información de opción personalizada . Las claves son las identificaciones de opción personalizadas, puede verlas si inspecciona la sección de opciones personalizadas de la pantalla del producto con Firebug o similar.

El $params['product'] puede ser redundante, escribí este script hace un tiempo para una versión mucho más antigua de Magento.

Además, estoy bastante seguro de que el estándar agregar al carrito eventos se activará cuando se agrega de esta manera, por lo que tendrá que configurarlos usted mismo. Puede haber efectos secundarios.

+0

Gracias Nick! Probado en Magento 1.4.1.1, funciona como se esperaba. – NiBa

+0

en mi caso es un producto configurable, ¿cómo puedo lograr eso? Necesito pasar un valor relacionado al módulo personalizado de addtocart. ¿Cuáles son mis opciones aquí? Puedo usar session, event pero solo lo haré, cuando estoy seguro de que no hay otra forma. pd: tyring para generalizar para todo tipo de productos. –

+0

¡Gracias! ¡Pasé medio día luchando con el mismo problema! –

0

El problema con la respuesta actual es que magento no agregará una segunda línea si el SKU es el mismo, pero las opciones son distintas de la primera. Si desea una manzana de 3 "y una de 4", le gustaría tener líneas de pedido separadas. O al menos yo sí.

Una llamada HTTP a la siguiente URL

/store/checkout/cart/add?product=23&qty=1&options[41]=4 

seguido por

/store/checkout/cart/add?product=23&qty=1&options[41]=3 

añadirá dos elementos de línea.

Pero aún así es solo la mitad de la batalla, ¿qué significan estos códigos de opción? Bueno, el siguiente código PHP te dirá. Y dado que estamos utilizando una llamada HTTP, el código devolverá javascript listo para 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); 
} 
?> 
1

debe escribir el parámetro de entrada para addproduct como el siguiente formato, se prueba por mí mismo:

$params = array(
    'product' => 1, // This would be $product->getId() 
    'qty' => 1, 
    'super_attribute' => array(
     34 => "value", 
     35 => "other value", 
     53 => "some other value" 
    ) 
); 
4

En Magento 1.7 Tiene para envolver la matriz params en un objeto 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); 
Cuestiones relacionadas