28

How can I get a list of store groups under a website in Magento and then a list of stores from that store group?

BenMorel
  • 34,448
  • 50
  • 182
  • 322
Blazo
  • 697
  • 3
  • 9
  • 15

2 Answers2

82

Try this to get the objects directly

Mage::app()->getWebsites(); < in file > app/code/core/Mage/Core/Model/App.php:920 
Mage::app()->getStores(); < in file > app/code/core/Mage/Core/Model/App.php:834

iterate over to get the needed scope of one specific website or store

foreach (Mage::app()->getWebsites() as $website) {
    foreach ($website->getGroups() as $group) {
        $stores = $group->getStores();
        foreach ($stores as $store) {
            //$store is a store object
        }
    }
}

For the future if you have similar questions here's how i discovered those answers within 60 seconds. First i grep for method names or similar method names with space before method name to see where the methods are defined

grep ' getStores' app/code -rsn 
grep ' getWebsites' app/code -rsn 

Second step is grep for usage samples to see how they are meant to use by core developers. For that i add >methodName to grep and this gives me list of files where this method is called and this will give us place to look for examples:

grep '>getWebsites' app/code -rsn
Anton S
  • 12,750
  • 2
  • 35
  • 37
  • vote it up and accept it for others to future reference if it solved your issue – Anton S May 03 '11 at 10:31
  • Yes it solved my problem. Thanks again, and how to vote up, says I need 15 reputation to vote – Blazo May 03 '11 at 10:38
  • answer some questions to get the necessary reputation , go a head and read the faq of this site – Anton S May 03 '11 at 10:48
  • 1
    Might be useful to also use within the loop: $group->getName(); and $store->getName(); – Ricard Mar 03 '14 at 09:29
  • Is there an issue if I call getStore on website object itself instead of iterating groups. (Related to iterate for loop code) ? I saw stores as part of website its self ? – ted Sep 22 '15 at 08:13
12

Anton's answer, while correct, may be re-inventing the wheel just a bit. There is already a facility in the Magento Core to retrieve this sort of data.

You can retrieve a list of all websites, and their "children" using this: Mage::getSingleton('adminhtml/system_store')->getStoresStructure() You can also pass an array of websiteIds, storeIds, or storeGroupIds to the function, to filter the list:

public function getStoresStructure($isAll = false, $storeIds = array(), $groupIds = array(), $websiteIds = array())

Example output:

Array
(
    [1] => Array
        (
            [value] => 1
            [label] => Main Website
            [children] => Array
                (
                    [1] => Array
                        (
                            [value] => 1
                            [label] => Madison Island
                            [children] => Array
                                (
                                    [1] => Array
                                        (
                                            [value] => 1
                                            [label] => English
                                        )

                                    [2] => Array
                                        (
                                            [value] => 2
                                            [label] => French
                                        )

                                    [3] => Array
                                        (
                                            [value] => 3
                                            [label] => German
                                        )

                                )

                        )

                )

        )

)

There is a similar one used to populate the "Store Scope" dropdowns and multi-selects all across the admin section.

Mage::getSingleton('adminhtml/system_store')->getStoreValuesForForm(false, true)

Array
(
    [0] => Array
        (
            [label] => All Store Views
            [value] => 0
        )

    [1] => Array
        (
            [label] => Main Website
            [value] => Array
                (
                )

        )

    [2] => Array
        (
            [label] =>     Madison Island
            [value] => Array
                (
                    [0] => Array
                        (
                            [label] =>     English
                            [value] => 1
                        )

                    [1] => Array
                        (
                            [label] =>     French
                            [value] => 2
                        )

                    [2] => Array
                        (
                            [label] =>     German
                            [value] => 3
                        )

                )

        )

)

To discover this, I located a multi-select on the Admin that has the data I wanted, then I turned on template hints to find out which block class was responsible for rendering it: Mage_Adminhtml_Block_Cms_Page_Edit_Form. Knowing this, I found the class in the codebase,(app/code/core/Mage/Adminhtml/Block/Cms/Block/Edit/Form.php) and located the part that creates the input by searching for its label ("Store View"). This showed me how the input's values were being provided:

$field =$fieldset->addField('store_id', 'multiselect', array(
    'name'      => 'stores[]',
    'label'     => Mage::helper('cms')->__('Store View'),
    'title'     => Mage::helper('cms')->__('Store View'),
    'required'  => true,
    'values'    => Mage::getSingleton('adminhtml/system_store')->getStoreValuesForForm(false, true),
));

The Mage::getSingleton('adminhtml/system_store') points to the class Mage_Adminhtml_Model_System_Store, where I found a variety of similar methods that can also be useful. Have a look for yourself.

Eric Seastrand
  • 2,473
  • 1
  • 29
  • 36
  • 'values' => Mage::getSingleton('adminhtml/system_store')->getStoreValuesForForm(false, true), worked a treat!! – BENN1TH Aug 25 '15 at 10:28