首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

Magento 取得購物車商品數量、金額與明細的完整程式碼範例

     編輯:PHP 相關知識

前言

在 Magento 專案中,頁首購物車摘要、AJAX 迷你購物車、結帳流程等情境都需要即時取得購物車資料。本文整理從單一商品明細到總計金額的各種取得方式,並說明 Mage::getModel() 與 Mage::getSingleton() 的差異。

核心程式碼範例

1. 取得所有購物車商品明細(含 ID、名稱、SKU、數量、單價)

<?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>';
}
?>

2. 快速取得購物車統計數值

<?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();
?>

3. 直接取得 Quote 物件進行進階操作

<?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>

場景二:AJAX 迷你購物車(回傳 JSON)

<?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() 格式化,自動處理貨幣符號、小數位、匯率轉換。
  • Quote 狀態:getQuote() 回傳的是「作用中購物車」;已結帳訂單請用 Mage::getModel('sales/order') 載入。

除錯技巧

<?php
// 快速印出 Quote 完整結構(僅開發環境使用)
$quote = Mage::getSingleton('checkout/session')->getQuote();
Zend_Debug::dump($quote->debug()); // 顯示所有欄位與關聯資料
?>
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved