Как ограничить COD по умолчанию в magento только для определенных почтовых индексов?

Я использую метод оплаты наличными по доставке в magento 1.7.0.2.

Мне нужна эта опция оплаты только для определенных почтовых индексов / пин-кодов.

может ли кто-нибудь помочь?

Solutions Collecting From Web of "Как ограничить COD по умолчанию в magento только для определенных почтовых индексов?"

в COD у вас есть функция

public function isAvailable($quote = null) 

в этом до последней строки return $checkResult->isAvailable;

вы устанавливаете условие if($checkResult->isAvailable) вызов

 $this->isZipCodeallowedForCod($zipCode,$quote) 

и в этой функции применяют логику для получения почтового индекса почтового индекса из объекта кавычек и проверки со списком допустимых и установочных флагов zipcodes.

Примечание. При модификации этого кода не изменяйте код ядра, используйте переписать или переопределить концепцию Magento.

URL1- Как ограничить COD по умолчанию в magento только для определенных почтовых индексов?

ШАГ 1
Перейти к файлу

 app\code\core\Mage\Payment\etc\system.xml 

Строка не более 596 под <cashondelivery translate="label"> xml Node
Добавить код

 <pincode translate="label"> <label>pincode</label> <frontend_type>textarea</frontend_type> <sort_order>63</sort_order> <show_in_default>1</show_in_default> <show_in_website>1</show_in_website> <show_in_store>1</show_in_store> </pincode> 

ШАГ 2
Перейти к файлу
app\code\core\Mage\Payment\Model\Method\Cashondelivery.php

Добавьте следующую функцию в Class Mage_Payment_Model_Method_Cashondelivery перед закрытием тега}

 /** * Get All postcode allowed for COD cash on delivary module * @return array */ public function getCODPincodes(){ $pincodes = Mage::getStoreConfig('payment/cashondelivery/pincode'); $results=explode(',',$pincodes); $postcodes=array(); if(count($results)>0){ foreach($results as $result){ $postcodes[] = $result; } } return $postcodes; } - /** * Get All postcode allowed for COD cash on delivary module * @return array */ public function getCODPincodes(){ $pincodes = Mage::getStoreConfig('payment/cashondelivery/pincode'); $results=explode(',',$pincodes); $postcodes=array(); if(count($results)>0){ foreach($results as $result){ $postcodes[] = $result; } } return $postcodes; } 

ШАГ 3
Перейти к файлу
app\code\core\Mage\Payment\Block\Form\Container.php

Следующая Class Mage_Payment_Block_Form_Container функция в Class Mage_Payment_Block_Form_Container перед закрытием тега}

  /** * Chcek Payment Method is COD(cash on delivary) and Shiping Pin code is available in list * @return boolean */ protected function checkmethodbypin($method){ if($method->getCode() == "cashondelivery"){ $shippingPincode = $this->getQuote()->getShippingAddress()->getData('postcode'); $pincodes= Mage::getModel('payment/method_cashondelivery')->getCODPincodes(); if(in_array($shippingPincode, $pincodes)) return true ;else return false; } } 

Шаг 4
Перейти к файлу

 app\design\frontend\base\default\template\checkout\onepage\payment\methods.phtml 

Найти код Near Line 43

 <?php if(!$oneMethod): ?> <input id="p_method_<?php echo $_code ?>" value="<?php echo $_code ?>" type="radio" name="payment[method]"title="<?php echo $this->htmlEscape($_method->getTitle()) ?>" onclick="payment.switchMethod('<?php echo $_code ?>')"<?phpif($this->getSelectedMethodCode()==$_code): ?> checked="checked"<?php endif; ?> class="radio" /> <?php else: ?> <span class="no-display"><input id="p_method_<?php echo $_code ?>" value="<?php echo $_code ?>" type="radio"name="payment[method]" checked="checked" class="radio" /></span> <?php $oneMethod = $_code; ?> <?php endif; ?> <label for="p_method_<?php echo $_code ?>"><?php echo $this->escapeHtml($this->getMethodTitle($_method)) ?></div><div> <?php echo $this->getMethodLabelAfterHtml($_method) ?></label> 

Заменить

 <?php if(($_method->getCode() == "cashondelivery") && !$this->checkmethodbypin($_method)){?> <dt><label style="color:red">COD (Cash on Delivary) not available on this pin code</label></dt> <?php }else{?> <dt> <?php if(!$oneMethod): ?> <input id="p_method_<?php echo $_code ?>" value="<?php echo $_code ?>" type="radio" name="payment[method]"title="<?php echo $this->htmlEscape($_method->getTitle()) ?>" onclick="payment.switchMethod('<?php echo $_code ?>')"<?phpif($this->getSelectedMethodCode()==$_code): ?> checked="checked"<?php endif; ?> class="radio" /> <?php else: ?> <span class="no-display"><input id="p_method_<?php echo $_code ?>" value="<?php echo $_code ?>" type="radio"name="payment[method]" checked="checked" class="radio" /></span> <?php $oneMethod = $_code; ?> <?php endif; ?> <label for="p_method_<?php echo $_code ?>"><?php echo $this->escapeHtml($this->getMethodTitle($_method)) ?> <?phpecho $this->getMethodLabelAfterHtml($_method) ?></label> </dt> <?php } ?> 

Откройте файл app \ design \ frontend \ base \ default \ template \ checkout \ onepage \ payment \ methods.phtml.

В этом файле вы можете получить адрес доставки от объекта quote, просто получить почтовые коды с адреса и внутри foreach ($methods as $_method): проверьте ваше состояние, если почтовый индекс и $_method->getCode(); затем вернитесь. Здесь вы можете получить код метода.

Я сделал следующее

в приложении \ code \ local \ Mage \ Payment \ Model \ Method \ Cashondelivery.php

Я добавил следующую функцию:

 public function getCODPincodes(){ $write = Mage::getSingleton('core/resource')->getConnection('core_read'); $query = "select pincode from `pincode`"; $results = $write->fetchAll($query); foreach($results as $result){ $postcodes[] = $result['pincode']; } return $postcodes; } 

и в приложении \ code \ local \ Mage \ Payment \ Block \ Form \ Container.php

Я добавил следующий код под protected function _canUseMethod($method){

после следующего блока

 if((!empty($minTotal) && ($total < $minTotal)) || (!empty($maxTotal) && ($total > $maxTotal))) { return false; } 

Добавить

 if($method->getCode() == "cashondelivery"){ $postcodes = Mage::getModel('payment/method_cashondelivery')->getCODPincodes(); $shippingPincode = $this->getQuote()->getShippingAddress()->getData('postcode'); if(!in_array($shippingPincode, $postcodes)){ return false; } } 

Заметка:

У меня есть все пинкоды в таблице под названием pincode.

Я разработаю небольшой модуль, поскольку это быстрое решение для моего требования

Все, что вам нужно – отредактировать файл /app/code/core/Mage/Payment/Model/Method/Cashondelivery.php

Откройте его и добавьте код ниже до самого конца класса (как раз перед последним «}» в файле):

 public function isAvailable($quote = null) { if ($quote) { // Here is the list of restricted Zip Codes $restrictedZips = array( '85001', '87965' ); $address = $quote->isVirtual() ? $quote->getBillingAddress() : $quote->getShippingAddress(); $customerZip = $address->getPostcode(); if (in_array($customerZip, $restrictedZips)) { return false; } } return parent::isAvailable($quote); }