2014-02-07 2 views
2

Я пытаюсь получить все магазины в магазине Magento. По всем магазинам я имею в виду все магазины со всех сайтов. Я написал этот код, и он работает, но меня немного беспокоит сложность вложенного цикла foreach. Пожалуйста, взгляните на него и посоветуйте мне, если вы думаете, что я могу сделать что-то другое.Сделайте эту вложенную петлю Magento лучше

public function getAllStoresCustom(){ 

    $all_stores = array(); 

     foreach (Mage::app()->getWebsites() as $website) { 
      foreach ($website->getGroups() as $group) { 
       $all_stores [] = $group->getStores();  
      } 
     } 

    return $all_stores; 
} 

Я только нашел эти функции в Magento, так что я думаю, что я должен был использовать те, и это казалось единственной комбинация, которая работала.

спасибо

ответ

3

Попробуйте это:

$allStores = Mage::getModel('core/store')->getCollection(); 

Затем цикл через $allStores при необходимости

foreach ($allStores as $store) { 
    //do something with $store 
} 

Примечание: Вы получите магазин с идентификатором 0. Это вид магазина администратора. Если вы хотите, чтобы все магазины без зрения магазина администратора используйте:

$allStores = Mage::getModel('core/store')->getCollection()->setWithoutDefaultFilter() 
+0

Спасибо, что сделал работу, и устранены мои петли! Я полагаю, что эта «коллекция» связана с моделью Magento EAV? Мне, вероятно, придется прочитать статьи Алана Сторма об этом. – user3284189

+0

Объекты 'stores' не являются EAV. коллекция в основном представляет собой список объектов. – Marius

1

foreach() является невероятно эффективной функцией PHP, так что вы можете держать пари, что он не собирается быть ваш спад. Если вы хотите что-то оптимизировать, загляните в код для функций getStores() и getGroups(), потому что они вызывают внутри итераций, тогда как getWebsites() вызывается только один раз.

Если вы хотите получить больше рекомендаций, пожалуйста, не стесняйтесь обновлять свой вопрос с помощью содержимого этих функций.

Вы также можете попробовать https://codereview.stackexchange.com/ для более опытных мнений тем более, что у вас нет какого-либо конкретного программирования выпуск/ошибка =)

+0

каждый цикл может быть проблемой, если его использовать без необходимости в большом наборе данных;). Но в этом случае похоже, что это не будет проблемой, хотя может быть более прямая функция Mage – cypherabe

+0

@cypherabe, вы абсолютно правы, но без дополнительного контекста от OP мы все просто гадаем =) – MonkeyZeus

+0

Хорошо, я был думая о вложенных петлях foreach в целом. Как оказалось, @Marius предложил лучшую функцию Magento, которая полностью исключала петли. Но существуют ли какие-то общие правила, которые помогают избежать вложенных циклов? Спасибо – user3284189

Смежные вопросы