update zip codes through backend
-
10-12-2020 - |
Frage
we are using a module that allow me to restrict only some zip codes for default "cash on delivery" payment method.
module observer.php
<?php
class Mfp_Cod_Model_Observer {
public function getCashOnDelvery(Varien_Event_Observer $observer) {
$event = $observer->getEvent();
$method = $event->getMethodInstance();
$result = $event->getResult();
$isModuleEnable = Mage::getStoreConfig('cod/cod/enable');
if($isModuleEnable) {
if($method->getCode() == 'cashondelivery' ){
$quote = Mage::getSingleton('checkout/cart')->getQuote();
$add = $quote->getShippingAddress();
$postcode = $add->getData('postcode');
$comparisonMode = Mage::getStoreConfig('cod/cod/mode');
$zipCodes = Mage::getStoreConfig('cod/cod/zipcode');
$isExist = false;
if(trim($zipCodes) == '') {
$result->isAvailable = true;
} else {
if(strpos($zipCodes, $postcode) !== false) {
$isExist = true;
}
if($isExist != true) {
$zipCodesArray = explode(',', nl2br($zipCodes));
if(count($elementLineArray) > 1) {
foreach($zipCodesArray as $codzipLine) {
$elementLineArray = explode('-', $codzipLine);
if(count($elementLineArray) == 2 && ( $postcode >= $elementLineArray[0] && $postcode <= $elementLineArray[1] )) {
$isExist = true;
break;
} else if($postcode == $codzipLine) {
$isExist = true;
break;
}
}
}
}
$returnValue = '';
$returnValue = ($isExist)?true:false;
$result->isAvailable = $returnValue;
}
}
}
}
}
we are using custom COD payment method, what changes we need to done so that it should work for custom COD.
custom paymentmethod.php
app/code/local/Exam/Mpcashondelivery/Model/Paymentmethod.php
<?php
class Exam_Mpcashondelivery_Model_PaymentMethod extends Mage_Payment_Model_Method_Abstract
{
/**
* Payment Method features
* @var bool
*/
protected $_code = 'mpcashondelivery';
/**
* Cash On Delivery payment block paths
*
* @var string
*/
protected $_formBlockType = 'mpcashondelivery/form';
protected $_paymentMethod = 'mpcashondelivery';
protected $_isGateway = false;
protected $_canAuthorize = true;
protected $_isInitializeNeeded = true;
protected $_canCapture = false;
protected $_canCapturePartial = false;
protected $_canRefund = false;
protected $_canVoid = true;
protected $_canUseInternal = true;
protected $_canUseCheckout = true;
protected $_canUseForMultishipping = true;
public function initialize($paymentAction, $stateObject) {
$data = Mage::app()->getRequest()->getPost();
if(isset($data['payment']['mpcod_captcha_code'])){
$mpcod_captcha_code = $data['payment']['mpcod_captcha_code'];
if(empty($_SESSION['captcha_code']) || strcasecmp($_SESSION['captcha_code'], $mpcod_captcha_code) != 0){
Mage::throwException(Mage::helper('payment')->__('Invalid Captcha'));
}else{
return $msg=1;
}
}
}
/**
* Check whether payment method can be used
*
* TODO: payment method instance is not supposed to know about quote
*
* @param Mage_Sales_Model_Quote|null $quote
*
* @return bool
*/
public function isAvailable($quote = null)
{
if($quote){
$restrictedZips = array(
'110001'
,'560044'
);
$address = $quote->isVirtual() ? $quote->getBillingAddress() : $quote->getShippingAddress();
$customerZip = $address->getPostcode();
if (!in_array($customerZip, $restrictedZips)) {
return false;
}
}
if($quote && $quote->getBaseGrandTotal()<Mage::getStoreConfig('payment/mpcashondelivery/max_order_total') && $quote->getBaseGrandTotal()>Mage::getStoreConfig('payment/mpcashondelivery/max_order_total')) {
return false;
}
$specificcountry = explode(",",Mage::getStoreConfig('payment/mpcashondelivery/specificcountry'));
if(Mage::getStoreConfig('payment/mpcashondelivery/allowspecific')!=0 ){
if(!in_array($quote->getBillingAddress()->getCountry(),$specificcountry)){
return false;
}
}
$cod_charges = Mage::getModel('mpcashondelivery/pricerules')->getAppliedPriceRules();
if($cod_charges['error']){
return false;
}
return parent::isAvailable($quote);
}
}
Edit
we uploaded these 3 pin codes in backend : 110001,110002,1234
when i tried : var_dump($zipCodes); die();
i got this result : string(19) "110001,110002,1234,"
Lösung
You need to add your custom shipping method code to the if statement like this:
if (
$method->getCode() == 'cashondelivery' || // the default shipping method method code
$method->getCode() == 'mpcashondelivery' // Or the custom CoD method code
) { ... }
Complete code of the observer.php
:
<?php
class Mfp_Cod_Model_Observer {
public function getCashOnDelvery(Varien_Event_Observer $observer) {
$event = $observer->getEvent();
$method = $event->getMethodInstance();
$result = $event->getResult();
$isModuleEnable = Mage::getStoreConfig('cod/cod/enable');
if($isModuleEnable) {
// CHANGES HERE
if($method->getCode() == 'cashondelivery' || $method->getCode() == 'mpcashondelivery'){
$quote = Mage::getSingleton('checkout/cart')->getQuote();
$add = $quote->getShippingAddress();
$postcode = $add->getData('postcode');
$comparisonMode = Mage::getStoreConfig('cod/cod/mode');
$zipCodes = Mage::getStoreConfig('cod/cod/zipcode');
$isExist = false;
if(trim($zipCodes) == '') {
$result->isAvailable = true;
} else {
if(strpos($zipCodes, $postcode) !== false) {
$isExist = true;
}
if($isExist != true) {
$zipCodesArray = explode(',', nl2br($zipCodes));
if(count($elementLineArray) > 1) {
foreach($zipCodesArray as $codzipLine) {
$elementLineArray = explode('-', $codzipLine);
if(count($elementLineArray) == 2 && ( $postcode >= $elementLineArray[0] && $postcode <= $elementLineArray[1] )) {
$isExist = true;
break;
} else if($postcode == $codzipLine) {
$isExist = true;
break;
}
}
}
}
$returnValue = '';
$returnValue = ($isExist)?true:false;
$result->isAvailable = $returnValue;
}
}
}
}
}
UPDATE Try this:
<?php
class Mfp_Cod_Model_Observer {
public function getCashOnDelvery(Varien_Event_Observer $observer) {
$event = $observer->getEvent();
$method = $event->getMethodInstance();
$result = $event->getResult();
$isModuleEnable = Mage::getStoreConfig('cod/cod/enable');
if($isModuleEnable) {
// CHANGES HERE
if($method->getCode() == 'cashondelivery' || $method->getCode() == 'mpcashondelivery') {
$quote = Mage::getSingleton('checkout/cart')->getQuote();
$add = $quote->getShippingAddress();
$postcode = $add->getData('postcode');
$zipCodes = Mage::getStoreConfig('cod/cod/zipcode');
if(trim($zipCodes) == '' || strpos($zipCodes, $postcode) === false) {
$result->isAvailable = false; // CHANGES
} else {
$result->isAvailable = true; // CHANGES
}
}
}
}
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange