2012-02-24 10 views
16

मैं कार्ट में उत्पादों के आधार पर शिपिंग विधियों को प्रतिबंधित करने के लिए एक त्वरित और गंदे मॉड्यूल लिख रहा हूं। उदाहरण के लिए, यदि ग्राहक भोजन जोड़ता है, तो मैं केवल रातोंरात शिपिंग विधियों का चयन करना चाहता हूं। कुछ वाणिज्यिक एक्सटेंशन केवल ओवरकिल हैं और मुझे जिस तरह की अधिक कार्यक्षमता चाहिए।प्रोग्रामिंग रूप से सभी शिपिंग विधियों की सूची पुनर्प्राप्त करें

प्रत्येक उत्पाद में "शिपिंग क्लास" नामक एक ड्रॉपडाउन विशेषता होगी। व्यवस्थापक बैकएंड में इन शिपिंग क्लासेस बनाने में सक्षम होंगे। वे इसे एक नाम देंगे और चुनें कि किन तरीकों की अनुमति है।

शिपिंग उद्धरण प्राप्त करने का समय आने पर, हम शिपिंग कक्षा के आधार पर केवल अनुमति विधियां दिखाएंगे।

मेरा मुख्य प्रश्न यह है कि: मैं इन शिपिंग कक्षाओं को बनाने के दौरान व्यवस्थापक के लिए सभी शिपिंग विधियों की एक सूची कैसे प्राप्त कर सकता हूं?

और द्वितीयक प्रश्न के रूप में, क्या यह Mage_Sales_Model_Quote_Address :: requestShippingRates के अंदर अनुमत विधियों के फ़िल्टरिंग को समझ में आता है? (मैं निश्चित रूप से इस विधि अधिभावी किया जाएगा)


संपादित करें:

@BrianVPS के लिए धन्यवाद, मैं नीचे दिए गए कोड के साथ आने में सक्षम था। यह ऑप्टग्रुप का उपयोग कर वाहकों से सभी व्यक्तिगत तरीकों को प्रदर्शित करता है। Multiselect के साथ महान काम करता है! मुझे नहीं लगता कि यह जांचता है कि विधि वास्तव में सक्षम हैं या नहीं।

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

एक शिपिंग क्लास केवल स्वीकृत शिपिंग विधियों का संग्रह है जिसे किसी उत्पाद को असाइन किया जा सकता है। उदाहरण के लिए, मैं "खाद्य" नामक एक कक्षा बना सकता हूं जो पूरे रातोंरात शिपिंग विधियों से जुड़ा हुआ है। सभी खाद्य उत्पादों को "खाद्य" शिपिंग कक्षा सौंपा जाएगा। जब शिपिंग उद्धरण प्राप्त करने का समय आता है, तो Magento यह देखने के लिए जांच करेगा कि कार्ट में किसी भी उत्पाद में शिपिंग कक्षा है या नहीं।यदि हमारे उत्पादों में से एक केक है, तो Magento को सभी शिपिंग विधियों को छिपाना चाहिए जो रातोंरात नहीं हैं। –

उत्तर

24

यहाँ मैं एक शिपिंग विस्तार मैंने लिखा के लिए एक source_model में है कोड का एक खंड है। उम्मीद है कि यह वही है जो आप खोज रहे हैं।

... आपके दूसरे प्रश्न, यकीन नहीं के लिए के रूप में ....

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

मैंने पहले से दिए गए उत्तरों में से इस के लिए एक फ़ंक्शन बनाया है। ,

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

तो हम फ़ंक्शन को कॉल करें और इस प्रकार यह करने के लिए $_methods वस्तु पारित कर सकते हैं:

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 से एक वस्तु है: यह सभी शिपिंग तरीकों का एक विकल्प समूह बनाता है :

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

आशा है कि किसी और की सहायता करें।

संबंधित मुद्दे