2012-02-24 21 views
16

Tôi đang viết mô-đun nhanh và bẩn để hạn chế phương thức giao hàng dựa trên các sản phẩm trong giỏ hàng. Ví dụ: nếu khách hàng thêm thực phẩm, tôi chỉ muốn chọn phương thức giao hàng qua đêm. Một số tiện ích mở rộng thương mại chỉ là quá mức cần thiết và có nhiều chức năng hơn mà tôi cần.Lập trình truy xuất danh sách tất cả các phương thức giao hàng

Mỗi sản phẩm sẽ có một thuộc tính kéo xuống được gọi là "Lớp vận chuyển". Quản trị viên sẽ có thể tạo các Lớp vận chuyển này trong chương trình phụ trợ. Họ sẽ đặt tên cho nó và chọn phương pháp nào được cho phép.

Khi đến lúc nhận báo giá giao hàng, chúng tôi sẽ chỉ hiển thị các phương thức được phép dựa trên Lớp vận chuyển.

Câu hỏi chính của tôi là: làm cách nào tôi có thể truy xuất danh sách tất cả các phương thức giao hàng để quản trị viên chọn khi tạo các lớp vận chuyển này?

Và là câu hỏi phụ, bạn có nên lọc các phương thức được phép bên trong Mage_Sales_Model_Quote_Address :: requestShippingRates không? (Tôi sẽ được trọng phương pháp này tất nhiên)


EDIT:

Nhờ @BrianVPS, tôi đã có thể đưa ra các mã dưới đây. Nó hiển thị tất cả các phương pháp riêng lẻ từ các nhà cung cấp dịch vụ bằng cách sử dụng optgroups. Hoạt động tốt với nhiều lựa chọn! Tôi không nghĩ rằng nó sẽ kiểm tra nếu các phương pháp thực sự được kích hoạt mặc dù.

public function getAllShippingMethods() 
{ 
    $methods = Mage::getSingleton('shipping/config')->getActiveCarriers(); 

    $options = array(); 

    foreach($methods as $_ccode => $_carrier) 
    { 
     $_methodOptions = array(); 
     if($_methods = $_carrier->getAllowedMethods()) 
     { 
      foreach($_methods as $_mcode => $_method) 
      { 
       $_code = $_ccode . '_' . $_mcode; 
       $_methodOptions[] = array('value' => $_code, 'label' => $_method); 
      } 

      if(!$_title = Mage::getStoreConfig("carriers/$_ccode/title")) 
       $_title = $_ccode; 

      $options[] = array('value' => $_methodOptions, 'label' => $_title); 
     } 
    } 

    return $options; 
} 
+0

Làm rõ lớp vận chuyển so với phương thức giao hàng. –

+0

Một lớp vận chuyển chỉ là một tập hợp các phương thức giao hàng được phép có thể được gán cho một sản phẩm. Ví dụ, tôi có thể tạo một lớp có tên là "Thực phẩm" được liên kết với tất cả các phương thức vận chuyển qua đêm. Tất cả các sản phẩm thực phẩm sẽ được chỉ định lớp vận chuyển "Thực phẩm". Khi đến lúc nhận báo giá vận chuyển, Magento sẽ kiểm tra xem có sản phẩm nào trong giỏ hàng có lớp vận chuyển hay không.Nếu một trong các sản phẩm của chúng tôi là một chiếc bánh, Magento nên ẩn tất cả các phương thức giao hàng không qua đêm. –

Trả lời

24

Đây là một khối mã tôi có trong một source_model cho một phần mở rộng vận chuyển tôi đã viết. Hy vọng rằng đây là những gì bạn đang tìm kiếm.

... như đối với câu hỏi thứ hai của bạn, không chắc chắn ....

public function toOptionArray($isMultiSelect = false) 
{ 
    $methods = Mage::getSingleton('shipping/config')->getActiveCarriers(); 

    $options = array(); 

    foreach($methods as $_code => $_method) 
    { 
     if(!$_title = Mage::getStoreConfig("carriers/$_code/title")) 
      $_title = $_code; 

     $options[] = array('value' => $_code, 'label' => $_title . " ($_code)"); 
    } 

    if($isMultiSelect) 
    { 
     array_unshift($options, array('value'=>'', 'label'=> Mage::helper('adminhtml')->__('--Please Select--'))); 
    } 

    return $options; 
} 
+2

Cảm ơn, điều đó thực sự hữu ích! Giải pháp của bạn chỉ trả lại các nhà cung cấp dịch vụ, nhưng nó là tầm thường để có được các phương thức - chỉ cần gọi '-> getAllowedMethods()'. Tôi đã chỉnh sửa câu hỏi của mình để bao gồm mã của tôi trong trường hợp ai đó gặp phải câu hỏi này và cần nó. Cảm ơn bạn lần nữa vì đã chỉ cho tôi đúng hướng! –

+1

Bất cứ lúc nào, vui mừng tôi có thể giúp :) – BrianVPS

9

Lấy @ câu trả lời của BrianVPS, Tôi đang sử dụng đoạn mã dưới đây (với cấu trúc thể hiện) để giúp đỡ trong hoàn cảnh của tôi, nơi tôi muốn có một nhãn người đơn giản từ mã vận chuyển.

$methods = Mage::getSingleton('shipping/config')->getActiveCarriers(); 
$shipping = array(); 
foreach($methods as $_ccode => $_carrier) { 
    if($_methods = $_carrier->getAllowedMethods()) { 
     if(!$_title = Mage::getStoreConfig("carriers/$_ccode/title")) 
      $_title = $_ccode; 
     foreach($_methods as $_mcode => $_method) { 
      $_code = $_ccode . '_' . $_mcode; 
      $shipping[$_code]=array('title' => $_method,'carrier' => $_title); 
     } 
    } 
} 
echo "\n";print_r($shipping); 
/* 
[flatrate_flatrate] => Array 
     [title] => Will-call 
     [carrier] => Pickup At Ca Cycleworks 
[freeshipping_freeshipping] => Array 
     [title] => Economy 
     [carrier] => Free Ground Shipping 
[ups_11] => Array 
     [title] => UPS Standard 
     [carrier] => United Parcel Service 
[ups_12] => Array 
     [title] => UPS Three-Day Select 
     [carrier] => United Parcel Service 
[ups_54] => Array 
     [title] => UPS Worldwide Express Plus 
     [carrier] => United Parcel Service 
[ups_65] => Array 
     [title] => UPS Saver 
     [carrier] => United Parcel Service 
[ups_01] => Array 
     [title] => UPS Next Day Air 
     [carrier] => United Parcel Service 
[ups_02] => Array 
     [title] => UPS Second Day Air 
     [carrier] => United Parcel Service 
[ups_03] => Array 
     [title] => UPS Ground 
     [carrier] => United Parcel Service 
[ups_07] => Array 
     [title] => UPS Worldwide Express 
     [carrier] => United Parcel Service 
[ups_08] => Array 
     [title] => UPS Worldwide Expedited 
     [carrier] => United Parcel Service 
[customshippingrate_customshippingrate] => Array 
     [title] => Custom Shipping Rate 
     [carrier] => Custom Shipping Rate 
*/ 
4

Tôi đã tạo hàm cho câu trả lời này đã được cung cấp. Điều này tạo ra một nhóm lựa chọn của tất cả các phương thức giao hàng:

function getShippingMethods($_methods, $fieldId, $fieldName, $fieldClass){ 
    $_shippingHtml = '<select name="' . $fieldName . '" id="' . $fieldId . '" class="' . $fieldClass . '">'; 
    foreach($_methods as $_carrierCode => $_carrier){ 
     if($_method = $_carrier->getAllowedMethods()) { 
      if(!$_title = Mage::getStoreConfig('carriers/' . $_carrierCode . ' /title')) { 
       $_title = $_carrierCode; 
      } 
      $_shippingHtml .= '<optgroup label="' . $_title . '">'; 
      foreach($_method as $_mcode => $_m){ 
       $_code = $_carrierCode . '_' . $_mcode; 
       $_shippingHtml .= '<option value="' . $_code . '">' . $_m . '</option>'; 
      } 
      $_shippingHtml .= '</optgroup>'; 
     } 
    } 
    $_shippingHtml .= '</select>'; 
    return $_shippingHtml; 
} 

Đối số $_methods là một đối tượng từ Magento:

$_methods = Mage::getSingleton('shipping/config')->getActiveCarriers(); 

Vì vậy, chúng ta có thể gọi hàm và truyền đối tượng $_methods với nó như sau :

<?php echo getShippingMethods($_methods, 'shipping_method', 'shipping_method', 'shipping'); ?> 

Hy vọng sẽ giúp người khác.

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