2012-02-24 12 views
16

カート内の商品に基づいて配送方法を制限するクイックアンドダーティーモジュールを作成しています。たとえば、顧客が食品を追加する場合は、翌日配送方法を選択するだけです。いくつかの商用拡張機能は過度の機能しか持たず、必要な機能をさらに備えています。プログラムですべての配送方法のリストを取得

各製品には、「Shipping Class」というドロップダウン属性があります。管理者はバックエンドでこれらの出荷クラスを作成することができます。彼らはそれに名前を付け、どの方法が許されるかを選ぶでしょう。

送料の見積もりを取得するには、出荷クラスに基づいて許可された方法のみが表示されます。

私の主な質問は、これらの出荷クラスを作成する際に管理者が選択するすべての配送方法のリストを取得するにはどうすればよいですか?

また、Mage_Sales_Model_Quote_Address :: requestShippingRatesの内部で許可されたメソッドのフィルタリングを行うのが理にかなっていますか? (私はもちろん、このメソッドをオーバーライドします)


EDIT:@BrianVPSに

おかげで、私は以下のコードを思い付くことができました。 optgroupsを使用しているキャリアからのすべての個々のメソッドを表示します。マルチセレクションでうまくいきます!私はメソッドが実際に有効になっているかどうかをチェックするとは思わない。ここで

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

配送クラスと発送方法を明確にします。 –

+0

出荷クラスは、商品に割り当てることのできる許可された出荷方法の集まりに過ぎません。たとえば、すべての翌日配送方法に関連付けられた「Food」という名前のクラスを作成できます。すべての食品に「食品」輸送クラスが割り当てられます。配送見積もりを取得する時間が来ると、Magentoはカート内の商品に配送クラスがあるかどうかを確認します。私たちの製品の1つがケーキの場合、Magentoは一晩でないすべての配送方法を隠すべきです。 –

答えて

24

は私が書いた出荷伸長のためのsource_modelを持っているコードのブロックです。うまくいけば、これはあなたが探しているものです。

...あなたの2番目の質問ではなく、必ず....

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

ありがとう、本当に役に立ちました!あなたのソリューションはキャリアを返すだけでしたが、メソッドを取得するのは簡単でした。単に ' - > getAllowedMethods()'を呼び出す必要があります。誰かがこの質問に遭遇してそれを必要とする場合に備えて私のコードを含めるように質問を編集しました。私は正しい方向に向いてくれてありがとう! –

+1

いつでも、私が助けることができてうれしい:) – BrianVPS

9

がBrianVPSの答え@撮影用として、私は私の状況で助けるために(示された構造で)下記のコードセグメントを使用しています、私は出荷コードからシンプルな人間のラベルを求めていました。

$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

すでに用意されている回答のうち、このために関数を作成しました。これは、すべての配送方法のオプショングループを作成します。

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

$_methods引数はMagentoのからのオブジェクトです:だから

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

、我々は関数を呼び出すことができますし、次のようにそこに$_methodsオブジェクトを渡します:

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

他人を助ける希望。

関連する問題