2011-11-28 26 views
11

tôi sử dụng mã này:Magento: Lấy số lượng trong giỏ cho một sản phẩm nhất định

// $items = Mage::getModel('checkout/cart')->getQuote()->getAllItems(); 
$items = Mage::getSingleton('checkout/session')->getQuote()->getAllItems(); 
  
foreach($items as $item) { 
    echo 'ID: '.$item->getProductId().'<br />'; 
    echo 'Name: '.$item->getName().'<br />'; 
    echo 'Sku: '.$item->getSku().'<br />'; 
    echo 'Quantity: '.$item->getQty().'<br />'; 
    echo 'Price: '.$item->getPrice().'<br />'; 
    echo "<br />"; 
} 

Để có được thông tin về sản phẩm trong giỏ hàng.

Làm cách nào tôi chỉ nhận được số lượng cho một sản phẩm nhất định (productId)

Cảm ơn rất nhiều.

Trả lời

39

tl; dr: Câu trả lời cho câu hỏi này khác nhau về độ phức tạp dựa trên loại sản phẩm (cấu hình, đơn giản, vv).Điều này có thể dẫn đến cách bạn thiết lập danh mục và đặt mức hiển thị sản phẩm đơn giản. Nếu tất cả những gì bạn có trong danh mục của bạn là các mục đơn giản, nhiệm vụ này rất dễ dàng. Ngoài ra: xem chỉnh sửa ở cuối.

Có rất nhiều tình huống cần xem xét. Ví dụ: nếu bạn thêm một mục có thể định cấu hình vào giỏ hàng, báo giá sẽ có hai mục trích dẫn cho mỗi tùy chọn: một mục báo giá cho sản phẩm có thể định cấu hình sẽ chứa thông tin về số lượng tùy chọn và một mục báo giá sẽ cung cấp dữ liệu sản phẩm đơn giản của tùy chọn. Các mục nhóm sẽ có một mục của gói chính cũng như một mục đơn giản cho mỗi tùy chọn gói.

Điều này tóm tắt là bạn cần quyết định cách bạn thể hiện số lượng của từng loại sản phẩm cho người dùng; ví dụ, bạn có muốn đại diện cho cùng một mô hình của áo sơ mi như một mục hàng với tất cả các đại lượng kích thước không, hoặc bạn muốn tách chúng ra cho mỗi kích thước (sau này là cách Magento hiển thị chúng trong các khu vực giỏ hàng/xem xét).

tôi khuyên bạn nên thêm các sản phẩm của mình vào giỏ hàng, sau đó sử dụng này trong frontend để xem dữ liệu mục quote:

<?php 

include 'app/Mage.php'; 
Mage::setIsDeveloperMode(true); 

Mage::app(); // Mage_Core_Model_App 

Mage::getSingleton('core/session', array('name'=>'frontend')); 

$quote = Mage::helper('checkout/cart')->getCart()->getQuote(); 

echo count($quote->getItemsCollection()); 
foreach ($quote->getItemsCollection() as $item){ 
    Zend_Debug::dump($item->debug()); 
} 

tôi khuyên bạn nên sử dụng một cài đặt với các dữ liệu mẫu và thêm số lượng khác nhau của từng loại sản phẩm vào giỏ hàng. Dựa trên điều này + đầu ra từ mã trên, bạn sẽ thấy rằng bạn có một số phương pháp tiếp cận và gotchas khi bạn lặp qua. Các kịch bản gây nhiễu là khi bạn có những điều sau đây:

  • mục cấu hình
    • Đối với mỗi tùy chọn, bạn sẽ có sản phẩm cấu hình như một mục các sản phẩm đơn giản mà từ đó các tùy chọn có nguồn gốc như một món đồ. Nếu bạn muốn hiển thị tổng số phụ huynh có thể cấu hình, bạn sẽ cần phải kiểm đếm tổng qty cấu hình trong vòng lặp:

Code:

$configurables = array(); 

// ...then, inside your foreach 
if($item->getProductType() === 'configurable'){ 
    if(isset($configurables[$item->getProductId()])){ 
     //add to the other options' quantity 
     $configurables[$item->getProductId()] += $item->getQty(); 
    } 
    else { 
     $configurables[$item->getProductId()] = $item->getQty(); 
    } 
} 
  • Items Xử lí
    • Sản phẩm đơn giản được thêm vào báo giá như một phần của một mục được nhóm riêng biệt với các mục đơn giản được thêm vào riêng lẻ ly và các nhóm khác mà chúng có thể thuộc về.Nếu bạn muốn tổng hợp này, bạn có thể lặp qua như vậy:

Code:

$grouped = array(); 

// ...then, inside your foreach 
if($item->getProductType() === 'grouped' || $item->getProductType() === 'simple'){ 
    if(isset($grouped[$item->getProductId()])){ 
     //add to the other options' quantity 
     $grouped[$item->getProductId()] += $item->getQty(); 
    } 
    else { 
     $grouped[$item->getProductId()] = $item->getQty(); 
    } 
} 
  • Items Bundle
    • Bundle mục quote sản phẩm được đại diện bởi một mục cho sản phẩm bó và các mục sản phẩm đơn giản riêng biệt cho từng tùy chọn. Các mục sản phẩm đơn giản có thông tin số lượng được lưu trữ với chúng. Các mục đơn giản có ID mục cha, tham chiếu đến mục báo giá sản phẩm của gói, giống như các mục con của mục sản phẩm trích dẫn có thể định cấu hình.

Bạn có thể thấy rằng việc xử lý tất cả các tình huống là cồng kềnh. Tôi muốn tôi có thể nói với bạn rằng việc thực hiện điều này dễ dàng hơn thông qua các mô hình tài nguyên, nhưng thực tế là trong cơ sở dữ liệu, bảng sales_flat_quote_item_option lưu trữ thông tin số lượng trong một cột dữ liệu tuần tự, vì vậy bạn sẽ cần phải đưa mọi thứ vào PHP để đến bất kỳ đâu với chúng (được thực hiện cho bạn thông qua mô hình tài nguyên).

Xin lỗi, đây là câu trả lời dài, nhưng bạn có thể thấy rằng, dựa trên thiết lập danh mục của bạn, bạn đang xem xét cẩn thận và thử nghiệm để đảm bảo rằng bạn đã có cơ sở của mình.

EDIT:Trong khi cố gắng triệt để, tôi không đề cập đến việc bạn nên xem bảng sales_flat_quote_item. Tùy thuộc vào yêu cầu của bạn, bạn có thể dễ dàng sử dụng dữ liệu trong đó để nhanh chóng, duyên dáng và hiệu quả mô hình dữ liệu mà bạn cần để đạt được các yêu cầu hiển thị của bạn.

0

bạn có thể thử:

$quote = Mage::getSingleton('checkout/session')->getQuote(); 
$item = Mage::getModel('sales/quote_item')->getCollection() 
       ->addFieldToFilter('quote_id', $quote->getId()) 
       ->addFieldToFilter('product_id', $productId) 
       ->getFirstItem(); 
//to get the quantity: $item->getQty(); 
+0

tôi nhận được lỗi này: Fatal error: Call to một hàm thành viên getStoreId() trên một tổ chức phi vật thể trong/app/code/core/Mage/Sales/Model/Mysql4/Trích dẫn/Item/Collection.php trên dòng 67 – Bizboss

+0

Bạn sẽ gặp vấn đề với điều này vì báo giá sẽ chờ đợi một đối tượng lưu trữ được nạp. Nếu bạn đang chạy mã này "bên ngoài" của Mage :: run(), sử dụng 'Mage :: getSingleton ('core/session', mảng ('name' => 'frontend'));' – benmarks

0

Bạn nên sử dụng phương pháp

setQUote 

khi gọi bộ sưu tập. Nên trông như thế này

$quote = Mage::getModel('sales/quote')->load($quote_id); 
$salesQuoteItem = Mage::getModel('sales/quote_item')->getCollection() 
      ->setQuote($quote) 
      ->addFieldToFilter('quote_id', $quote_id) 
      ->addFieldToFilter('product_id', $data['product_id']) 
      ->getFirstItem(); 
3

Hãy thử điều này:

// if you don't have the product object already... 
$_product = Mage::getModel('catalog/product')->load($productid); 

$_quote = Mage::getSingleton('checkout/session')->getQuote(); 
$_item = $_quote ? $_quote->getItemByProduct($_product) : false; 
$qty = $_item ? $_item->getQty() : 0; 
Các vấn đề liên quan