{ Hello Magento 2 }

解决 Magento 2 应用问题,更注重深度挖掘。(ง •̀_•́)ง

0%

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

代码:

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

不同 locale 值的输出:

1
2
en_US
北京2
1
2
zh_CN
北京3

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

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

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

1
2
----北京3
----485

所以取 region name 是自动根据时区来输出的。但根据名称取 region ,region name 是根据 directory_country_regiondefault_name 来看下这部分实现的源代码: Mage_Directory_Model_Resource_Region 类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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;
}