0

在 Magento 中,有几种方法可以加载一个或多个网站的所有商店。您可以执行 aMage::app()->getStores(true)或 aMage::app()->getWebsites()然后遍历结果集合中的所有商店。这已经在这里得到了回答。我最近发现的是,在调用上述方法之一之前加载商店会影响结果。特别是关于默认商店。例子:

设置:1 个网站和 3 个商店(english, french, german, 而german默认商店)

Mage::app()->getStore()->load(0); // load admin store (or any other)
foreach (Mage::app()->getStores(true) as $store) {
    echo "\n" . $store->getId() . " - " . $store->getCode();
} 
result is: 
0 - admin
1 - english
3 - french

Mage::app()->getStore()->load(2); // load german store (default)
foreach (Mage::app()->getStores(true) as $store) {
    echo "\n" . $store->getId() . " - " . $store->getCode();
} 
result is: 
0 - admin
1 - english
3 - french
2 - german

当我浏览网站以获取其商店时,甚至会发生更奇怪的事情。默认存储的值被当前加载的存储的值替换:

Mage::app()->getStore()->load(0); // load admin store
foreach (Mage::app()->getWebsites() as $website) {
    foreach ($website->getStores() as $store) {
        echo "\n".$store->getId() . ' - ' . $store->getCode();
    }
}
result: 
1 - english
3 - french
0 - admin

in case of Mage::app()->getStore()->load(1) the result is:
1 - english
3 - french
1 - english

我可以让所有商店独立于当前加载的商店的网站的唯一正确方法是这样的:

Mage::app()->getStore()->load($anyStoreId); // load any store
/** @var $websites Mage_Core_Model_Resource_Website_Collection */
$websites = Mage::getResourceModel('core/website_collection');
foreach ($websites as $website) {
    foreach ($website->getStores() as $store) {
        echo "\n".$store->getId() . ' - ' . $store->getCode();
    }
}
result is always:
1 - english
3 - french
2 - german

这些结果的原因是什么?这是 Magento 中的错误还是这种行为是有意的?有没有更好的方法来加载网站的商店?

4

1 回答 1

1

看看方法Mage_Core_Model_App::getStore()
它接受一个名为的参数,$id但如果该参数为 null,则返回当前存储:

if (!isset($id) || ''===$id || $id === true) {
     $id = $this->_currentStore;
}

现在...调用->load()模型,修改当前对象。因此,当您调用Mage::app()->getStore()->load(0)它时,它具有以下效果:

  1. 您检索当前商店
  2. 您加载 id 为 0 的商店(管理员)
  3. 由于对象是通过引用传递的,因此您最终会在Mage_Core_Model_App::_currentStore管理存储中。

由于Mage_Core_Model_App在脚本的其余部分被实例化为单例,因此您将拥有管理存储作为当前存储。

此外,在同一方法的末尾有以下几行:

$this->_stores[$store->getStoreId()] = $store;
$this->_stores[$store->getCode()] = $store;

这会将结果缓存getStore在成员变量中,因此您不必再次加载它。并_stores在调用时使用getStores()
结论。: 调用Mage::getStore()->load()会对你的脚本造成很大的伤害。在前端页面上调用它可能会导致访问一些管理方法(虽然不是控制器或操作)。遍历商店和网站您的Mage::getResourceModel()方法。

于 2013-10-11T15:09:42.753 回答