Validation required for zip codes less than 6 digits
-
30-09-2020 - |
Question
we have custom module for entering zip codes in backend, only if those zip codes if we enter in shipping address, than it will display COD under payment method , otherwise it will hide COD.
Here problem is it is working only for 6 digits.
if we enter any below 6 digit zip codes in shipping address , its displaying COD. This is problem.
ex: 2,24, 246, 2468, 12345
but if we enter any 6 digit zip codes other than zipcodes which is present backend, its not displaying COD. This is fine.
ex: 123456, 333999, 666666
as validation is working fine for 6 digits we want for other digits also.
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;
}
}
}
}
}
config.xml
<?xml version="1.0"?>
<config>
<modules>
<Mfp_Cod>
<version>1.0.0</version>
</Mfp_Cod>
</modules>
<global>
<models>
<cod>
<class>Mfp_Cod_Model</class>
</cod>
</models>
<helpers>
<cod>
<class>Mfp_Cod_Helper</class>
</cod>
</helpers>
</global>
<frontend>
<events>
<payment_method_is_active>
<observers>
<paymentfilter_payment_method_is_active>
<type>singleton</type>
<class>Mfp_Cod_Model_Observer</class>
<method>getCashOnDelvery</method>
</paymentfilter_payment_method_is_active>
</observers>
</payment_method_is_active>
</events>
</frontend>
</config>
Solution
Try this code in 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');
$returnValue = false;
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(strlen($postcode) >= 6) {
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 = ($isExist)?true:false;
$result->isAvailable = $returnValue;
}
}
$result->isAvailable = $returnValue;
}
}
}
}
Licensed under: CC-BY-SA with attribution
Not affiliated with magento.stackexchange