Magento 1 region, region name 和 locale

directory_country_region

region_id country_id code default_name
485 CN 110000 北京1

directory_country_region_name

local region_id name
en_US 485 北京2
zh_CN 485 北京3

代码:

echo Mage::app()->getLocale()->getLocaleCode();
echo '<br>';
$regionModel = Mage::getModel('directory/region')->load('485');
echo $region = $regionModel->getName();

不同 locale 值的输出:

en_US
北京2
zh_CN
北京3

那么按照这样的逻辑,如果我们按照 region name 来取 region id 的话会怎样呢?

$regionModel = Mage::getModel('directory/region')->loadByName('北京3', 'CN');
echo '<br>----';
echo $regionModel->getName();
echo '<br>----';
echo $regionModel->getId();

结果是没有输出,如果是这样的:

----北京3
----485

所以取 region name 是自动根据时区来输出的。但根据名称取 region ,region name 是根据 directory_country_regiondefault_name

来看下这部分实现的源代码:
Mage_Directory_Model_Resource_Region 类

public function loadByName(Mage_Directory_Model_Region $region, $regionName, $countryId)
{
    return $this->_loadByCountry($region, $countryId, (string)$regionName, 'default_name');
}


protected function _loadByCountry($object, $countryId, $value, $field)
{
    $adapter        = $this->_getReadAdapter();
    $locale         = Mage::app()->getLocale()->getLocaleCode();
    $joinCondition  = $adapter->quoteInto('rname.region_id = region.region_id AND rname.locale = ?', $locale);
    $select         = $adapter->select()
        ->from(array('region' => $this->getMainTable()))
        ->joinLeft(
            array('rname' => $this->_regionNameTable),
            $joinCondition,
            array('name'))
        ->where('region.country_id = ?', $countryId)
        ->where("region.{$field} = ?", $value);

    $data = $adapter->fetchRow($select);
    if ($data) {
        $object->setData($data);
    }

    $this->_afterLoad($object);

    return $this;
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注