PREGUNTA REVISADA: Hemos seguido este método para agregarlo al carrito. He revisado completamente la pregunta.Magento personalizado agregar al carrito proceso no funciona
Estoy trabajando en un sitio que está utilizando Magento ver. 1.3.2.4 como su plataforma de comercio electrónico. Hemos creado un proceso personalizado de "Agregar al carro" que agrega varios elementos al carro a través de una solicitud de AJAX. Después de esta solicitud, se realiza algún postprocesamiento con JavaScript en el navegador antes de redireccionar a la página "Ver carro". El 99% del tiempo, este proceso parece funcionar correctamente en Firefox y Safari, pero en IE8, el proceso falla. Al agregar un artículo al carro, después de ser redirigido a la página "Su carrito", el carro de compras está vacío.
No todos los elementos en el sitio se agregan a través de este proceso AJAX. Este problema solo ocurre cuando el carro está vacío antes de agregar los artículos a través de AJAX. Es decir, si un elemento que se agrega a través del proceso normal de Magento se agrega al gato primero, las solicitudes para agregar AJAX al carrito siempre se realizan correctamente. Las cookies de eliminación de Blu y luego intentar agregarlas a través de AJAX fallarán consistentemente en IE8.
El servidor es un servidor Apache/PHP con PHP 5.2.9, eAccelerator y Suhosin. Por favor, solicite cualquier información adicional y estaremos encantados de proporcionarla. Estamos almacenando sesiones en una base de datos MySQL.
Aquí está el código para nuestro método personalizado de añadir al carrito. Este código se encuentra en /app/code/core/Mage/Checkout/controllers/CartController.php
:
public function ajaxaddAction()
{
$result = array('success' => true);
try
{
$session = $this->_getSession();
$cart = $this->_getCart();
$products = json_decode($_POST['products'],true);
if(!is_array($products))
{
throw new Exception("Products data not sent");
}
foreach ($products as $product_data)
{
$product = $this->_initProduct($product_data['id']);
if(!$product)
throw new Exception("Product id {$product_data['id']} not found");
$info = array('qty' => $product_data['qty']);
if($product_data['options'])
$info['options'] = $product_data['options'];
$cart->addProduct($product,$info);
}
$cart->save();
$this->_getSession()->setCartWasUpdated(true);
/**
* @todo remove wishlist observer processAddToCart
*/
Mage::dispatchEvent('checkout_cart_add_product_complete',
array('product' => $products[0], 'request' => $this->getRequest(), 'response' => $this->getResponse())
);
$cartItems = $cart->getQuote()->getAllItems();
$result['cart'] = array();
foreach($cartItems as $item)
$result['cart'][] = json_decode($item->toJson());
}
catch (Mage_Core_Exception $e)
{
if ($this->_getSession()->getUseNotice(true)) {
$this->_getSession()->addNotice($e->getMessage());
} else {
$messages = array_unique(explode("\n", $e->getMessage()));
foreach ($messages as $message) {
$this->_getSession()->addError($message);
}
}
$result['success'] = false;
$result['exception'] = $e->getMessage();
}
catch (Exception $e) {
$this->_getSession()->addException($e, $this->__('Can not add item to shopping cart'));
$result['success'] = false;
$result['exception'] = $e->getMessage();
}
header('Content-Type: application/json',true);
ob_end_clean();
echo json_encode($result);
exit();
}
Por favor, no responder con "Mover el código para el directorio /app/code/local/
". Entiendo que es un mejor lugar para eso, y lo moveré allí en el futuro, pero a menos que su respuesta resuelva el problema, simplemente publique un comentario. Para obtener una respuesta más rápida estoy comenzando una recompensa y quiero buenas respuestas a este problema específico, no solo consejos sobre mejores formas de integrar este código.
Si hay alguna información que pueda proporcionar para ayudar, por favor hágamelo saber. Estamos dentro de un plazo apretado ...
pierdo mi recompensa, incluso si acepto mi propia respuesta. Y mi propia respuesta no responde completamente la pregunta. ¿Alguien quiere 550 puntos de rep? ;-) – Josh
@Josh, si quieres recuperar la mitad de tu recompensa, solo repítale la respuesta de alguien, no aceptes nada, si esa respuesta recibe +2 votos a favor y si no aceptas nada, tú y él compartirán mitad/mitad de la recompensa cuando termina la recompensa. http://stackoverflow.com/faq – YOU
@ S.Mark: Bueno, me gustaría obtener una respuesta más que mis puntos de recompensa. Pero incluso si hice lo que dijiste, no recuperé la mitad. De las preguntas frecuentes: en cualquier caso, siempre renunciará a la cantidad de reputación especificada en la recompensa, por lo que si comienza una recompensa, asegúrese de hacer un seguimiento y aceptar la mejor respuesta. – Josh