如何将magento中的默认COD限制为仅限某些邮政编码?

时间:2013-05-08 11:42:37

标签: php magento module magento-1.7 payment

我在magento 1.7.0.2中使用货到付款方式。

我只需要针对特定​​邮政编码/密码进行此付款选项。

任何人都可以帮忙吗?

5 个答案:

答案 0 :(得分:2)

URL1- How to restrict default COD in magento to certain zip codes only?

第1步
转到文件

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

596 xml节点下添加代码

下的行号<cashondelivery translate="label">
<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;
 }

STEP-3
转到文件
app\code\core\Mage\Payment\Block\Form\Container.php

关闭代码前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

在第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 } ?>

答案 1 :(得分:1)

打开你的app \ design \ frontend \ base \ default \ template \ checkout \ onepage \ payment \ methods.phtml文件。

在此文件中,您可以从报价对象获取报价送货地址,只需从地址和foreach ($methods as $_method):内获取邮政编码,如果邮政编码和$_method->getCode();匹配则返回。 你可以在这里获得方法代码。

答案 2 :(得分:1)

在COD中你有一个功能

public function isAvailable($quote = null)

在最后一行return $checkResult->isAvailable;

之前

您发出if条件if($checkResult->isAvailable)来电

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

并在此函数中应用逻辑从报价对象获取帐单邮寄地址邮政编码,并检查允许的zipcodes列表和设置标记。

注意:修改此内容时不要修改核心代码,请使用重写或覆盖Magento的概念。

答案 3 :(得分:0)

我做了以下

在 应用\代码\本地\法师\付款\模型\方法\ 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;
}

并在app \ 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的表中有所有的pincodes。

     

我将在此开发一个小模块,因为这是我的要求的快速解决方法

答案 4 :(得分:0)

您只需编辑文件/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);
}