Magento Custom Source Model

Magento uses source models as a means of gathering data from either the database or from files, and displaying the data against a specific field. We can also add a Magento custom source model using a custom module. Examples of existing source models in Magento include the following.

  • catalog/product_status – used for the Status attribute in the eav_attribute table
  • adminhtml/system_config_source_country – used for displaying countries configured in system.xml in the Mage_Shipping module.

Within the catalog/product_status model, we can see that the Enabled and Disabled options are defined here.

<?php
class Mage_Catalog_Model_Product_Status extends Mage_Core_Model_Abstract
{
....
static public function getOptionArray()
{
    return array(
        self::STATUS_ENABLED    => Mage::helper('catalog')->__('Enabled'),
        self::STATUS_DISABLED   => Mage::helper('catalog')->__('Disabled')
    );
}

And within the adminhtml/system_config_source_country model, the countries are obtained from the directory/country_collection resource model.

<?php
class Mage_Adminhtml_Model_System_Config_Source_Country
{
    protected $_options;

    public function toOptionArray($isMultiselect=false)
    {
        if (!$this->_options) {
            $this->_options = Mage::getResourceModel('directory/country_collection')->loadData()->toOptionArray(false);
        }

        $options = $this->_options;
        if(!$isMultiselect){
            array_unshift($options, array('value'=>'', 'label'=> Mage::helper('adminhtml')->__('--Please Select--')));
        }

        return $options;
    }
}

So if we wanted to create our very own source model, we would need to create a simple module that contained a source model.

To start with, add the module’s activation file.

<?xml version="1.0"?>
<config>
    <modules>
        <Custom_Sourcemodel>
            <codePool>local</codePool>
            <active>true</active>
        </Custom_Sourcemodel>
    </modules>
</config>

Then declare the model path in the module’s config.xml file.

<?xml version="1.0"?>
<config>
    <global>
        <models>
            <sourcemodel>
                <class>Custom_Sourcemodel_Model</class>
            </sourcemodel>
        </models>
    </global>
</config>

Note that the naming conventions for source models that are involved in the System -> Configuration area are as follows: adminhtml_system_config_source_[model].

If we follow this convention, and have a simple Colour.php model that will return three colours.

<?php
class Custom_Sourcemodel_Model_Adminhtml_System_Config_Source_Colour extends Mage_Eav_Model_Entity_Attribute_Source_Abstract {

    public function getAllOptions()
    {
        $colours = array(
            array('value' => 'red', 'label' => 'Red'),
            array('value' => 'blue', 'label' => 'Blue'),
            array('value' => 'green', 'label' => 'Green'),
        );

        return $colours;
    }
}

Note that source models should extend the Mage_Eav_Model_Entity_Attribute_Source_Abstract class.

Now that we have this in place, we can add the source model to a field within system.xml, and populate its source model to be the following.

<source_mode>sourcemodel/adminhtml_system_config_source_colour</source_model>

Note: This article is based on Magento Community/Open Source version 1.9.