2010-10-03 20 views
5

Xin lưu ý, câu hỏi này liên quan đến chi phí vận chuyển chứ không phải giá. Có một sự khác biệt quan trọng, nghĩa là $$ tính phí cho phương thức giao hàng đối với chủ sở hữu cửa hàng, trái với khoản phí $$ được khách hàng thanh toán.Truy cập chi phí vận chuyển trong giỏ hàng của Magento và/hoặc thanh toán

Bảng cơ sở dữ liệu shipping_tablerate bao gồm trường cost, được điền trong đối tượng Mage_Shipping_Model_Carrier_Tablerate trong phương thức collectRates. Tuy nhiên, trường đó không thể truy cập được ở bất kỳ nơi nào khác trong ngăn xếp, ví dụ: từ địa chỉ của một trích dẫn.

Tôi cần truy cập vào giá trị đó trên trang giỏ hàng và tôi không thể tìm thấy bất kỳ giá trị nào để đạt được nó, ngoài việc khởi tạo đối tượng Mage_Shipping_Model_Rate_Request để chuyển vào collectRates(). Điều đó có vẻ không hiệu quả không cần thiết vì dữ liệu đã được tải từ bảng và có thể truy cập được.

Tôi đã thử Quan sát sự kiện <shipping_carrier_tablerate_load/>, nhưng có vẻ như sự kiện _load không được ném cho mô hình đó.

Tôi cũng đã cố gắng truy cập vào các tỷ lệ từ quote:

$quote = Mage::getSingleton('checkout/cart')->getQuote(); 
$address = $quote->getShippingAddress(); 
$rate = $address->getShippingRateByCode($code ='tablerate_bestway'); 

tôi có thể thấy tính price, tuy nhiên cost là không có mặt trong mô hình đó.

Ở giai đoạn này, tôi hết ý tưởng. Bất cứ lời đề nghị nào cũng biết ơn!

Cảm ơn, Jonathan

Trả lời

6

Thứ nhất, cố gắng không lo lắng quá nhiều về hiệu suất cho đến khi bạn thấy một nút cổ chai thực tế ở đâu đó. Có niềm tin vào vô số các hệ thống bộ nhớ đệm. Nói một cách hoài nghi hơn, Magento đã có một chút của một con quái vật SQL, vì vậy nếu bạn có một cửa hàng điều chỉnh tốt, một vài truy vấn phụ sẽ không bị tổn thương.

Thứ hai, lần truy cập cơ sở dữ liệu có thể thậm chí không thành vấn đề. Mô hình shipping/rate_request dường như không được cơ sở dữ liệu hỗ trợ. Nếu bạn nhìn vào hai lần nó được sử dụng trong mã lõi

Mage_Shipping_Model_Shipping::collectRatesByAddress 
Mage_Sales_Model_Quote_Address::requestShippingRates 

bạn sẽ nhìn thấy mô hình shipping/rate_request đang được khởi tạo, và sau đó dân cư từ các lĩnh vực đã được nạp. Ngoài ra, tất cả các mô hình được sử dụng trong Mage_Shipping_Model_Carrier_Tablerate::collectRates không tải bất kỳ thứ gì từ cơ sở dữ liệu, chúng chỉ thực hiện các phép tính. Thật đáng ngưỡng mộ khi bạn muốn xây dựng thứ gì đó hiệu quả nhất có thể trong lần đầu tiên, nhưng có quá nhiều tương tác phức tạp trong một hệ thống OO hiện đại để kỳ diệu biết cách thực hiện nhất để làm điều gì đó. Thực hiện những gì bạn cần để có được thông tin bạn cần và xử lý hiệu suất (nếu cần) trong khi phát hành bảo trì (hoặc nếu bạn không đủ may mắn để có bản phát hành bảo trì, khi ai đó có quyền lực trong tổ chức của bạn càu nhàu về tốc độ đâu đó)

Thứ ba, khi hệ thống không cung cấp quyền truy cập vào thứ gì đó mà bạn cần, đó là những gì hệ thống ghi đè lớp học dành cho. Một cái gì đó như

class Package_Module_Model_Carriertablerate extends 
Mage_Shipping_Model_Carrier_Tablerate 
{ 
    public function getRate(Mage_Shipping_Model_Rate_Request $request) 
    { 
     $rate = parent::getRate($request); 
     Mage::register('package_module_carriertablerates', $rate); 
     return $rate; 
    } 

} 

... 
//later, retrieve the rate 
$rates = Mage::registry('package_module_carriertablerates'); 

Về cơ bản, bạn đang gọi cùng một mã như trước đây, nhưng sắp xếp kết quả ở đâu đó để truy cập sau này. Về an toàn như một ghi đè có thể nhận được.

+0

Cảm ơn Alan, câu trả lời hay.Mối quan tâm của tôi về việc quay trở lại cơ sở dữ liệu là vì mô hình này dường như không trải qua quá trình tự động tải tiêu chuẩn, do đó tại sao sự kiện '$ model_load' không được ném ra. Tôi thích ý tưởng sử dụng 'Mage :: register' để lưu trữ giá trị. Liệu 'Mage :: register' lưu trữ trên toàn cầu hay chỉ cho' checkout/Session'? Nếu nó là toàn cục, thì tôi cần phải kiểm tra xem tỷ lệ được lưu bao gồm 'dest_zip' được sử dụng để tính toán nó hay không. Nhưng đó là một chi tiết thực hiện. –

+0

P.S. Tải cơ sở dữ liệu cho 'tablerate' được thực hiện trong' Mage_Shipping_Model_Mysql4_Carrier_Tablerate_Collection :: __ construct() 'và phức tạp một cách hợp lý vì nó liên quan đến ba bảng trong phép nối. –

+2

Ah, tôi hiểu nhầm câu hỏi. Tôi nghĩ bạn muốn lấy nó để sử dụng trong cùng một yêu cầu. Tôi khá chắc chắn Mage :: đăng ký là một điều yêu cầu mỗi .. biến toàn cầu mà không vi phạm phạm vi toàn cầu. Ngoài ra, FWIW, tôi vừa tìm kiếm mã cơ sở 1.4 và 1.4.1 cục bộ của mình và không tìm thấy sự kiện shipping_carrier_tablerate_load ở bất kỳ đâu. –