在 Magento 專案中,頁首購物車摘要、AJAX 迷你購物車、結帳流程等情境都需要即時取得購物車資料。本文整理從單一商品明細到總計金額的各種取得方式,並說明 Mage::getModel() 與 Mage::getSingleton() 的差異。
<?php
// 方式 A:透過 checkout/cart model(較常見)
$items = Mage::getModel('checkout/cart')->getQuote()->getAllItems();
// 方式 B:透過 checkout/session singleton(效能較佳,避免重複載入)
$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 'Qty: ' . $item->getQty() . '<br>';
echo 'Price: ' . $item->getPrice() . '<br>';
echo '<br>';
}
?>
<?php
// 商品種類數(不同 SKU 數量)
$totalItems = Mage::getModel('checkout/cart')->getQuote()->getItemsCount();
// 所有商品總數量(含同一商品多件)
$totalQuantity = Mage::getModel('checkout/cart')->getQuote()->getItemsQty();
// 小計金額(未含稅、運費)
$subTotal = Mage::getModel('checkout/cart')->getQuote()->getSubtotal();
// 總計金額(含稅、運費、折扣)
$grandTotal = Mage::getModel('checkout/cart')->getQuote()->getGrandTotal();
?>
<?php
$quote = Mage::getSingleton('checkout/session')->getQuote();
// 取得特定商品項目
$item = $quote->getItemById($itemId);
// 取得應用購物車規則後的折扣金額
$discountAmount = $quote->getSubtotal() - $quote->getSubtotalWithDiscount();
// 取得運費
$shippingAmount = $quote->getShippingAddress()->getShippingAmount();
// 取得稅額
$taxAmount = $quote->getShippingAddress()->getTaxAmount();
?>
| 需求 | 方法 | 回傳型別 | 說明 |
|---|---|---|---|
| 所有商品項目集合 | getAllItems() | Array of Mage_Sales_Model_Quote_Item | 含父子商品(如可配置商品的子項) |
| 可見商品項目(前台顯示用) | getAllVisibleItems() | Array | 過濾掉父商品、隱藏子項 |
| 商品種類數 | getItemsCount() | int | 不同 SKU 數 |
| 商品總數量 | getItemsQty() | float | 所有商品數量相加 |
| 小計 | getSubtotal() | float | 未含稅運 |
| 總計 | getGrandTotal() | float | 含稅運折扣 |
| 基礎貨幣小計 | getBaseSubtotal() | float | 以基礎貨幣計價 |
| 基礎貨幣總計 | getBaseGrandTotal() | float | 以基礎貨幣計價 |
<?php
// 使用 singleton 避免重複載入 quote
$quote = Mage::getSingleton('checkout/session')->getQuote();
$count = $quote->getItemsCount();
$qty = (int)$quote->getItemsQty();
$subtotal = Mage::helper('core')->currency($quote->getSubtotal(), true, false);
?>
<a href="/checkout/cart/">
購物車 ( 種 / 件) -
</a>
<?php
// controllers/Ajax/CartController.php
public function summaryAction() {
$quote = Mage::getSingleton('checkout/session')->getQuote();
$items = [];
foreach ($quote->getAllVisibleItems() as $item) {
$items[] = [
'id' => $item->getId(),
'name' => $item->getName(),
'sku' => $item->getSku(),
'qty' => (int)$item->getQty(),
'price' => Mage::helper('core')->currency($item->getPrice(), true, false),
'row_total'=> Mage::helper('core')->currency($item->getRowTotal(), true, false),
'image' => Mage::helper('catalog/image')
->init($item->getProduct(), 'thumbnail')
->resize(50, 50)
->__toString(),
'url' => $item->getProduct()->getProductUrl(),
];
}
$this->getResponse()->setBody(json_encode([
'items' => $items,
'count' => $quote->getItemsCount(),
'qty' => (int)$quote->getItemsQty(),
'subtotal' => Mage::helper('core')->currency($quote->getSubtotal(), true, false),
'grand_total'=> Mage::helper('core')->currency($quote->getGrandTotal(), true, false),
]));
}
?>
<?php
$quote = Mage::getSingleton('checkout/session')->getQuote();
if ($quote->getItemsCount() === 0) {
echo '購物車是空的';
} else {
echo '購物車有 ' . $quote->getItemsCount() . ' 種商品';
}
?>
Mage::getSingleton('checkout/session'):同一次請求中重複呼叫不會重複載入 Quote,減少資料庫查詢。$item->getProduct() 會觸發額外查詢。若需大量產品資料,改用 Collection 加入 addUrlRewrite()、addMediaGallery() 等一次撈取。Mage::helper('core')->currency() 格式化,自動處理貨幣符號、小數位、匯率轉換。getQuote() 回傳的是「作用中購物車」;已結帳訂單請用 Mage::getModel('sales/order') 載入。<?php
// 快速印出 Quote 完整結構(僅開發環境使用)
$quote = Mage::getSingleton('checkout/session')->getQuote();
Zend_Debug::dump($quote->debug()); // 顯示所有欄位與關聯資料
?>