Я использую метод оплаты наличными по доставке в magento 1.7.0.2.
Мне нужна эта опция оплаты только для определенных почтовых индексов / пин-кодов.
может ли кто-нибудь помочь?
в 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); }