CÂU HỎI THƯỜNG GẶP: Chúng tôi đã theo dõi điều này xuống phương pháp thêm tùy chỉnh vào giỏ hàng. Tôi đã hoàn toàn sửa đổi câu hỏi.Tùy chọn thêm vào giỏ hàng của Magento không hoạt động
Tôi đang làm việc trên một trang web đang sử dụng Magento ver. 1.3.2.4 là nền tảng thương mại điện tử của nó. Chúng tôi đã xây dựng quy trình "Thêm vào giỏ hàng" tùy chỉnh, thêm nhiều mục vào giỏ hàng qua yêu cầu AJAX. Sau yêu cầu này, một số xử lý sau được thực hiện viw JavaScript trong trình duyệt trước khi chuyển hướng đến trang "Xem giỏ hàng". 99% thời gian quá trình này dường như hoạt động bình thường trong Firefox và Safari nhưng trong IE8, quá trình này không thành công. Khi thêm một mục vào giỏ hàng, sau khi được chuyển hướng đến trang "Giỏ hàng của bạn", giỏ hàng trống.
Không phải tất cả các mục trên trang web đều được thêm qua quy trình AJAX này. Vấn đề này chỉ xảy ra khi giỏ hàng trống trước khi thêm các mục thông qua AJAX. Đó là để nói, nếu một mục được thêm vào thông qua quá trình Magento bình thường được thêm vào con mèo đầu tiên, thì yêu cầu thêm vào giỏ hàng AJAX luôn thành công. Xóa cookie Blu và sau đó tìm cách thêm thông qua AJAX sẽ không thành công trên IE8.
Máy chủ là máy chủ Apache/PHP với PHP 5.2.9, eAccelerator và Suhosin. Vui lòng yêu cầu bất kỳ thông tin bổ sung nào và tôi sẽ sẵn lòng cung cấp thông tin đó. Chúng tôi đang lưu trữ các phiên trong cơ sở dữ liệu MySQL.
Đây là mã cho phương thức thêm vào giỏ hàng tùy chỉnh của chúng tôi. Mã này tọa lạc tại /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();
}
Xin đừng trả lời với "Di chuyển mã vào thư mục /app/code/local/
". Tôi hiểu rằng đó là một nơi tốt hơn cho nó, và sẽ di chuyển nó ở đó trong tương lai, nhưng trừ khi câu trả lời của bạn sẽ giải quyết vấn đề, xin vui lòng chỉ cần gửi bình luận. Để nhận được phản hồi nhanh hơn, tôi bắt đầu một khoản tiền thưởng và muốn có câu trả lời hay cho vấn đề cụ thể này, không chỉ là các mẹo về cách tốt hơn để tích hợp mã này.
Nếu có bất kỳ thông tin nào tôi có thể cung cấp để hỗ trợ, vui lòng cho tôi biết. Chúng tôi đang trong thời hạn chặt chẽ ...
tôi đã làm mất tiền thưởng của tôi ngay cả khi tôi chấp nhận câu trả lời của riêng tôi. Và câu trả lời của riêng tôi không trả lời đầy đủ câu hỏi. Không ai muốn 550 điểm đại diện? ;-) – Josh
@Josh, Nếu bạn muốn một nửa số tiền thưởng của bạn, chỉ cần upvote câu trả lời của ai đó, không chấp nhận bất cứ điều gì, nếu câu trả lời nhận được +2 upvotes, và nếu bạn không chấp nhận bất cứ điều gì, bạn và anh ta sẽ chia sẻ bounty nửa/nửa khi tiền thưởng kết thúc. http://stackoverflow.com/faq – YOU
@ S.Mark: Tôi muốn có câu trả lời nhiều hơn số tiền thưởng của tôi. Nhưng ngay cả khi tôi đã làm như bạn nói, tôi không nhận được một nửa trở lại. Từ câu hỏi thường gặp: Trong mọi trường hợp, bạn sẽ luôn từ bỏ số lượng uy tín được chỉ định trong tiền thưởng, vì vậy nếu bạn bắt đầu một tiền thưởng, hãy chắc chắn theo dõi và chấp nhận câu trả lời tốt nhất! – Josh