1

I am trying to override a model file.

The file location is: core/Mage/Catalog/Model/Product/Type.php

I am trying to show only simple products when creating a new product but it is not working.

directory structure and files are given as below

local->Divum->Catalog->etc->config.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Divum_Catalog>
           <version>0.1.0</version>
        </Divum_Catalog>
        <global>
            <models>
            <catalog>
                    <rewrite>
                    <product_type>Divum_Catalog_Model_Product_Type</product_type>
                </rewrite>
                </catalog>
            </models>
        </global>
    </modules>
</config>

local->Divum->Catalog->Model->Product->Type.php

class Divum_Catalog_Model_Product_Type
{
const TYPE_SIMPLE       = 'simple';
const TYPE_BUNDLE       = 'bundle';
const TYPE_CONFIGURABLE = 'configurable';
const TYPE_GROUPED      = 'grouped';
const TYPE_VIRTUAL      = 'virtual';

const DEFAULT_TYPE      = 'simple';
const DEFAULT_TYPE_MODEL    = 'catalog/product_type_simple';
const DEFAULT_PRICE_MODEL   = 'catalog/product_type_price';
static protected $_types;
static protected $_compositeTypes;
static protected $_priceModels;
static protected $_typesPriority;
public static function factory($product, $singleton = false)
{
    $types = self::getTypes();
    $typeId = $product->getTypeId();

    if (!empty($types[$typeId]['model'])) {
        $typeModelName = $types[$typeId]['model'];
    } else {
        $typeModelName = self::DEFAULT_TYPE_MODEL;
        $typeId = self::DEFAULT_TYPE;
    }

    if ($singleton === true) {
        $typeModel = Mage::getSingleton($typeModelName);
    }
    else {
        $typeModel = Mage::getModel($typeModelName);
        $typeModel->setProduct($product);
    }
    $typeModel->setConfig($types[$typeId]);
    return $typeModel;
}
public static function priceFactory($productType)
{
    if (isset(self::$_priceModels[$productType])) {
        return self::$_priceModels[$productType];
    }

    $types = self::getTypes();

    if (!empty($types[$productType]['price_model'])) {
        $priceModelName = $types[$productType]['price_model'];
    } else {
        $priceModelName = self::DEFAULT_PRICE_MODEL;
    }

    self::$_priceModels[$productType] = Mage::getModel($priceModelName);
    return self::$_priceModels[$productType];
}
static public function getOptionArray()
{
    $options = array();
    foreach(self::getTypes() as $typeId=>$type) {
         if($typeId == 'simple'):
            $options[$typeId] = Mage::helper('catalog')->__($type['label']);
        endif;
    }

    return $options;
}
static public function getAllOption()
{
    $options = self::getOptionArray();
    array_unshift($options, array('value'=>'', 'label'=>''));
    return $options;
}
static public function getAllOptions()
{
    $res = array();
    $res[] = array('value'=>'', 'label'=>'');
    foreach (self::getOptionArray() as $index => $value) {
        $res[] = array(
           'value' => $index,
           'label' => $value
        );
    }
    return $res;
}
static public function getOptions()
{
    $res = array();
    foreach (self::getOptionArray() as $index => $value) {
        $res[] = array(
           'value' => $index,
           'label' => $value
        );
    }
    return $res;
}
static public function getOptionText($optionId)
{
    $options = self::getOptionArray();
    return isset($options[$optionId]) ? $options[$optionId] : null;
}
static public function getTypes()
{
    if (is_null(self::$_types)) {
        $productTypes = Mage::getConfig()->getNode('global/catalog/product/type')->asArray();
        foreach ($productTypes as $productKey => $productConfig) {
            $moduleName = 'catalog';
            if (isset($productConfig['@']['module'])) {
                $moduleName = $productConfig['@']['module'];
            }
            $translatedLabel = Mage::helper($moduleName)->__($productConfig['label']);
            $productTypes[$productKey]['label'] = $translatedLabel;
        }
        self::$_types = $productTypes;
    }

    return self::$_types;
}
static public function getCompositeTypes()
{
    if (is_null(self::$_compositeTypes)) {
        self::$_compositeTypes = array();
        $types = self::getTypes();
        foreach ($types as $typeId=>$typeInfo) {
            if (array_key_exists('composite', $typeInfo) && $typeInfo['composite']) {
                self::$_compositeTypes[] = $typeId;
            }
        }
    }
    return self::$_compositeTypes;
}
public static function getTypesByPriority()
{
    if (is_null(self::$_typesPriority)) {
        self::$_typesPriority = array();
        $a = array();
        $b = array();

        $types = self::getTypes();
        foreach ($types as $typeId => $typeInfo) {
            $priority = isset($typeInfo['index_priority']) ? abs(intval($typeInfo['index_priority'])) : 0;
            if (!empty($typeInfo['composite'])) {
                $b[$typeId] = $priority;
            } else {
                $a[$typeId] = $priority;
            }
        }

        asort($a, SORT_NUMERIC);
        asort($b, SORT_NUMERIC);

        foreach (array_keys($a) as $typeId) {
            self::$_typesPriority[$typeId] = $types[$typeId];
        }
        foreach (array_keys($b) as $typeId) {
            self::$_typesPriority[$typeId] = $types[$typeId];
        }
    }
    return self::$_typesPriority;
}
}

app->etc->modules->You_Module.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Divum_Pricing>
            <active>true</active>
            <codePool>local</codePool>
        </Divum_Pricing>
        <Divum_Adminhtml>
            <active>true</active>
            <codePool>local</codePool>
        </Divum_Adminhtml>
        <Divum_Catalog>
            <active>true</active>
            <codePool>local</codePool>
        </Divum_Catalog>
    </modules>
</config>

When I put the same code in the core file which is located in core/Mage/Catalog/Model/Product/Type.php, it is working but it is not working in the overridden file.

I think I made a mistake in the config file but I don't know what is the problem.

5
  • Did you set up the <depends><Mage_Catalog /></depends> in your module definition file? – Adi Sep 24 '15 at 10:29
  • No.. i don't know where to put... can you please help me.. in which file do i have to put this line ? – Arul James Sep 24 '15 at 10:31
  • app/etc/modules/You_Module.xml. If you don't have this file, your module is not registered to Magento, so it's completely ignored. – Adi Sep 24 '15 at 10:32
  • Yes i have this file ... and my module is appear in back end.. – Arul James Sep 24 '15 at 10:34
  • have you extends class Divum_Catalog_Model_Product_Type to Mage_Catalog_Model_Product_Type ?? – Chirag Nandaniya Sep 30 '15 at 17:31
1

Firstly your config.xml is badly formatted. You have the <global> node inside the <modules> node but it should be a sibling not a child of <modules>.

<?xml version="1.0"?>
<config>
    <modules>
        <Divum_Catalog>
            <version>0.1.0</version>
        </Divum_Catalog>
    </modules>
    <global>
        <models>
            <catalog>
                <rewrite>
                    <product_type>Divum_Catalog_Model_Product_Type</product_type>
                </rewrite>
            </catalog>
        </models>
    </global>
</config>

Secondly if you are going to do a rewrite of a class you should first extend the class you are rewriting.

class Divum_Catalog_Model_Product_Type extends Mage_Catalog_Model_Product_Type

Then in this class you simply need to have your changes and not the complete file as you have in your question.

0

Use this link http://inchoo.net/magento/overriding-magento-blocks-models-helpers-and-controllers/ it help you to understand how to override

1
  • Though this could answer help the person out links can die. Could you maybe include the important information for the question asked? – David Manners Sep 30 '15 at 16:45
0

This is one of the very rare cases in Magento where a class is not used with the factory methods like Mage::getModel().

Actually Mage_Catalog_Model_Product_Type only contains static methods, which makes it play in the same league as the Mage class itself and totally different from all other model classes.

Ergo, you cannot rewrite it.

What makes it really evil is that it might seem to work because in some places Magento instantiates the class with Mage::getSingleton('catalog/product_type') but in other cases it calls the methods statically.

For example:

  • In Mage_Catalog_Model_Resource_Prodcut_Flat_Indexer the static call is used:

    foreach (array_keys(Mage_Catalog_Model_Product_Type::getTypes()) as $typeId) {
    
  • In Mage_Adminhtml_Block_Catalog_Product_Grid the singleton is used:

    $this->addColumn('type',
        array(
            'header'=> Mage::helper('catalog')->__('Type'),
            'width' => '60px',
            'index' => 'type_id',
            'type'  => 'options',
            'options' => Mage::getSingleton('catalog/product_type')->getOptionArray(),
    ));
    

(in case you are wondering, calling static methods on an instance is totally allowed in PHP)

0

i have find the problem.

the problem is nothing but the "global" tag is inside the tag. all i need to do is just place the "global" tag outside the tag.

<?xml version="1.0"?>
<config>
    <modules>
        <Divum_Catalog>
            <version>0.1.0</version>
        </Divum_Catalog>
    </modules>
    <global>
        <models>
            <catalog>
                <rewrite>
                    <product_type>Divum_Catalog_Model_Product_Type</product_type>
                </rewrite>
            </catalog>
        </models>
    </global>
</config>

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.