To get an treelikeĀ drop-down option field forĀ all existing categories in the system you have yo add an own source model:
<?php
/**
*
* Magento
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* It is available through the world-wide-web at this URL:
* http://opensource.org/licenses/osl-3.0.php
*
*
* @category Sheldon
* @package Sheldon_Package
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
* @author Marcel Lange (info@ask-sheldon.com)
*
* Sourcemodel for productcategoryselection in module configuration
*/
class Sheldon_Package_Model_Adminhtml_Source_Product_Category {
/**
* Systemconfiguration - Category select
* @return array
*/
public function toOptionArray($bAddEmpty = true)
{
$oCategoryCollection = Mage::getResourceModel('catalog/category_collection');
$oCategoryCollection->addAttributeToSelect('name')
->addAttributeToSelect('is_active')
->addAttributeToSelect('parent_id')
->setStoreId($iStoreId)
->addFieldToFilter('parent_id', array('gt' => 0))
->addFieldToFilter('is_active', 1)
->addFieldToFilter('level', array('gteq' => 1)) //Don't display root categories
->addAttributeToSelect('position', 'ASC');
$aOptions = array();
if ($bAddEmpty) {
$aOptions[] = array(
'label' => Mage::helper('adminhtml')->__('-- Please Select a Category --'),
'value' => ''
);
}
foreach ($oCategoryCollection as $oCategory) {
$sLabel = " {$oCategory->getName()} (ID: {$oCategory->getId()})";
/*
Let's draw som '-' before the name depending on the
category depth (two '-' for each level)
Result in a select option:
Category
-- CategoryA
---- CategoryB
------ CategoryC
-- CategoryD
---- CategoryE
*/
$iPadWidth = ($oCategory->getLevel() - 1) * 2 + strlen($sLabel);
$sLabel = str_pad($sLabel, $iPadWidth, '-', STR_PAD_LEFT); //pad the '-' to the left side
$aOptions[] = array(
'label' => $sLabel,
'value' => $oCategory->getId()
);
}
return $aOptions;
}
}
Now you can just use this source model in your modules system configuration file to generate a category selection:
<fields>
<categories>
<label>Sale Categories</label>
<frontend_type>multiselect</frontend_type>
<source_model>sheldon_package/adminhtml_source_product_category</source_model>
<sort_order>10</sort_order>
<comment><![CDATA[Select categories]]></comment>
<show_in_default>1</show_in_default>
<validate>validate-one-required</validate>
</categories>
</fields>
For more information about system.xml field definitions have a look at the blogpostĀ System configuration fields.
