2010-03-01 31 views
5

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ẽ ...

+0

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

+0

@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

+0

@ 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

Trả lời

4

Tôi đã dành hơn 10 giờ cho việc này. Hiện tại, tôi tin rằng tôi có một giải pháp một phần . Nhưng tôi không chắc tại sao giải pháp này hoạt động ...

Có vẻ như Magento yêu cầu chuyển hướng để hoàn tất quá trình thêm vào giỏ hàng. Vì vậy, thay vì

header('Content-Type: application/json',true); 
ob_end_clean(); 
echo json_encode($result); 
exit(); 

tôi lưu trữ JSON của tôi trong phiên và chuyển hướng đến một giỏ hành động mới:

$this->_getSession()->setCartJsonResult(json_encode($result)); 
$this->_redirect('checkout/cart/postajaxadd'); 

Hành động đó sau đó bãi dữ liệu JSON

public function postajaxaddAction() 
{ 
    $session = $this->_getSession(); 

    header('Content-Type: application/json',true); 
    ob_end_clean(); 
    echo $this->_getSession()->getCartJsonResult(); 
    exit(); 
} 

này vẫn thất bại đôi khi; tuy nhiên bây giờ mã JavaScript của tôi không nhận được dữ liệu JSON mà nó đang mong đợi và có thể lặp lại yêu cầu. Yêu cầu thứ hai thành công thường xuyên hơn lần đầu tiên ... Tuy nhiên, vẫn có những trường hợp khi yêu cầu AJAX không thành công.

+0

Cách đặt 'text/plain' thay vì' application/json', tôi nghĩ một số trình duyệt không biết loại nội dung đó. – YOU

+0

Tôi đang sử dụng Prototype và nó mong đợi ứng dụng/json ... Ngoài ra, điều này không ảnh hưởng đến việc liệu mặt hàng đó có được thêm vào giỏ hàng hay không. Cảm ơn mặc dù! – Josh

1

Chúng tôi gặp sự cố khi thêm các thứ vào giỏ hàng khi bộ nhớ phiên hết hạn và không thể tạo phiên mới. Nếu bạn đang lưu trữ phiên trên đĩa hoặc trong memcache, hãy kiểm tra xem bạn đã phân bổ đủ dung lượng chưa.

+0

Cảm ơn lời khuyên. Đó là một điểm tốt. Tôi đang lưu trữ các phiên trong cơ sở dữ liệu và không gian là tốt. – Josh

3

Không chắc chắn nếu điều này gây ra sự cố bạn đang gặp phải, nhưng cách tốt hơn để thực hiện phản hồi JSON sẽ là sử dụng "Magento/Zend way" hiện có để thực hiện.

Thay vì:

header('Content-Type: application/json',true); 

ob_end_clean(); 

echo json_encode($result); 

exit(); 

Sử dụng:

$this->getResponse()->setHeader('Content-Type', 'application/json', true)->setBody(json_encode($result)); 
+0

Tuyệt. Điều đó không giải quyết được vấn đề nhưng đó là một cách tốt hơn để xử lý nó hơn là cách của tôi. Cảm ơn rất nhiều! – Josh

+0

Tôi đã triển khai mã đó - nó rõ ràng hơn nhiều, nhưng vấn đề vẫn tồn tại. – Josh

Các vấn đề liên quan