表 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_region
的 default_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;
}