Magento では、1 つ以上の Web サイトのすべてのストアをロードする方法がいくつかあります。Mage::app()->getStores(true)
aまたは aMage::app()->getWebsites()
を実行してから、結果のコレクション内のすべてのストアをウォークスルーすることができます。これはすでにここで回答されています。最近発見したのは、上記のメソッドのいずれかを呼び出す前にストアをロードすると、結果に影響を与えるということです。特にデフォルトストアに関して。例:
セットアップ: 3 つの店舗を持つ 1 つの Web サイト ( 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 のバグですか、それとも意図した動作ですか? また、ウェブサイトのストアをロードするより良い方法はありますか?