как добавить еще один атрибут для выбора, который является пользовательским атрибутом в списке продуктов
У меня есть пользовательский атрибут, добавленный в мой каталог. это поле выбора
При перечислении каталога я хочу показать его отфильтрованным по этому атрибуту.
В моем mage/adminhtml/block/catalog/product/grid.php
у меня есть _preparecollection
функция
Я пытаюсь добавить свой дополнительный фильтр в _preparecolletion
из моего пользовательского модуля.
Как это сделать
protected function _prepareCollection()
{
$store = $this->_getStore();
$collection = Mage::getModel('catalog/product')->getCollection()
->addAttributeToSelect('sku')
->addAttributeToSelect('name')
->addAttributeToSelect('attribute_set_id')
->addAttributeToSelect('type_id')
->addFieldToFilter('my_custom_field');// i want to add this filter from my custom module
// so that i don't need to touch my core files.
Возможно ли это?
3 answers
В приложении/коде/локальном/Компании/модуле/и т. Д. Введите это в свой config.xml
<config>
<global>
<blocks>
<adminhtml>
<rewrite>
<catalog_product_grid>Company_Module_Block_Adminhtml_Catalog_Product_Grid</catalog_product_grid>
</rewrite>
</adminhtml>
</blocks>
</global>
В app/code/local/Company/Module/Block/Adminhtml/Catalog/Product/Grid.php
class Company_Module_Block_Adminhtml_Catalog_Product_Grid extends Mage_Adminhtml_Block_Catalog_Product_Grid
{
protected function _prepareCollection()
{
parent::_prepareCollection();
$this->getCollection()->addFieldToFilter('field', 'value');
return $this;
}
}
Я предполагаю, что вы хотите добавить новый фильтруемый столбец в сетку продуктов, это действительно неясно из вашего вопроса. Как я уже сказал, в этом случае перезапись не требуется, но поскольку вы хотите использовать перезапись, вот как вы можете это сделать.
Во-первых, перепишите сетку продуктов в своем модуле. Допустим, ваш модуль называется Company_Module. В разделе app/code/local/Company/Module/etc
введите это в свой config.xml
<config>
<global>
<blocks>
<adminhtml>
<rewrite>
<catalog_product_grid>Company_Module_Block_Adminhtml_Catalog_Product_Grid</catalog_product_grid>
</rewrite>
</adminhtml>
</blocks>
</global>
</config>
Это говорит Magento о том, что вы хотите переписать блок сетки. Для этого примера я буду использовать Magento пример данных для CE 1.6+- атрибут color
, в котором используются параметры, как в вашем случае. Вам нужно переопределить 2 метода, _prepareCollection
и _prepareColumns
.
В app/code/local/Company/Module/Block/Adminhtml/Catalog/Product/Grid.php
class Company_Module_Block_Adminhtml_Catalog_Product_Grid extends Mage_Adminhtml_Block_Catalog_Product_Grid
{
protected function _prepareCollection()
{
parent::_prepareCollection();
$this->getCollection()->addAttributeToSelect('color');
return $this;
}
protected function _prepareColumns()
{
$options = Mage::getSingleton('eav/config')
->getAttribute(Mage_Catalog_Model_Product::ENTITY, 'color')
->getSource()
->getAllOptions(false, true);
$optionsArray = array();
foreach ($options as $option) {
$optionsArray[$option['value']] = $option['label'];
}
$this->addColumnAfter('color', array(
'header' => Mage::helper('catalog')->__('Color'),
'width' => '100px',
'type' => 'options',
'options' => $optionsArray,
'index' => 'color',
), 'status');
parent::_prepareColumns();
return $this;
}
}
Делая это, вы получаете дополнительный столбец, который можно фильтровать. Надеюсь, я правильно понял ваш вопрос.
Я уже делал нечто подобное в модуле, используя наблюдателя событий. Тогда я провел некоторое исследование и не смог найти "лучшего" решения для этого. Вот модуль, на случай, если вы захотите взглянуть на него: https://github.com/mzentrale/Mzentrale_ProductThumb
В принципе, я определил наблюдателя adminhtml, который слушает catalog_product_collection_load_before
, и он загружает атрибут только для заданных дескрипторов (adminhtml_catalog_product_index
и adminhtml_catalog_product_grid
). Затем я добавил дополнительный столбец, используя XML-формат макета.