将额外选项卡添加到类别编辑器
-
16-10-2019 - |
题
我正在尝试将一个额外的选项卡添加到类别编辑页面的顶部。默认情况下是:一般信息,显示设置,自定义设计和类别产品。
因此,我创建了一个新的模块,该模块重写生成选项卡的块。这是来自 config.xml:
<blocks>
<adminhtml>
<rewrite>
<catalog_category_tabs>
MyNamespace_MyModule_Block_Catalog_Category_Tabs
</catalog_category_tabs>
</rewrite>
</adminhtml>
</blocks>
这是我的块覆盖默认的洋金:
class MyNamespace_MyModule_Block_Catalog_Category_Tabs extends Mage_Adminhtml_Block_Catalog_Category_Tabs
{
protected function _prepareLayout()
{
$categoryAttributes = $this->getCategory()->getAttributes();
if (!$this->getCategory()->getId()) {
foreach ($categoryAttributes as $attribute) {
$default = $attribute->getDefaultValue();
if ($default != '') {
$this->getCategory()->setData($attribute->getAttributeCode(), $default);
}
}
}
$attributeSetId = $this->getCategory()->getDefaultAttributeSetId();
/** @var $groupCollection Mage_Eav_Model_Resource_Entity_Attribute_Group_Collection */
$groupCollection = Mage::getResourceModel('eav/entity_attribute_group_collection')
->setAttributeSetFilter($attributeSetId)
->setSortOrder()
->load();
$defaultGroupId = 0;
foreach ($groupCollection as $group) {
/* @var $group Mage_Eav_Model_Entity_Attribute_Group */
if ($defaultGroupId == 0 or $group->getIsDefault()) {
$defaultGroupId = $group->getId();
}
}
foreach ($groupCollection as $group) {
/* @var $group Mage_Eav_Model_Entity_Attribute_Group */
$attributes = array();
foreach ($categoryAttributes as $attribute) {
/* @var $attribute Mage_Eav_Model_Entity_Attribute */
if ($attribute->isInGroup($attributeSetId, $group->getId())) {
$attributes[] = $attribute;
}
}
// do not add grops without attributes
if (!$attributes) {
continue;
}
$active = $defaultGroupId == $group->getId();
$block = $this->getLayout()->createBlock($this->getAttributeTabBlock(), '')
->setGroup($group)
->setAttributes($attributes)
->setAddHiddenFields($active)
->toHtml();
$this->addTab('group_' . $group->getId(), array(
'label' => Mage::helper('catalog')->__($group->getAttributeGroupName()),
'content' => $block,
'active' => $active
));
}
$this->addTab('products', array(
'label' => Mage::helper('catalog')->__('Category Products'),
'content' => $this->getLayout()->createBlock(
'adminhtml/catalog_category_tab_product',
'category.product.grid'
)->toHtml(),
));
// dispatch event add custom tabs
Mage::dispatchEvent('adminhtml_catalog_category_tabs', array(
'tabs' => $this
));
$this->addTab('myextratab', array(
'label' => Mage::helper('catalog')->__('My Extra Tab'),
'content' => 'Here is the contents for my extra tab'
));
return parent::_prepareLayout();
}
}
注意额外的标签代码:
$this->addTab('myextratab', array(
'label' => Mage::helper('catalog')->__('My Extra Tab'),
'content' => 'Here is the contents for my extra tab'
));
但是,屏幕的右侧只是空白。类别树仍然保留,但是单击类别给出了Firebug中的JavaScript错误: ReferenceError: category_info_tabsJsTabs is not defined
更新:阅读 这个重复的问题和Aswer 因此,看来我已经完成了所有事情。我缺少一些布局代码吗?
任何帮助都得到了极大的赞赏。
解决方案
如果您只是组织新属性组,请创建一个设置脚本:
$installer = Mage::getResourceModel('catalog/setup','catalog_setup');
$installer->startSetup();
//Categories typically only have one attribute set, this will retrieve its ID
$setId = Mage::getSingleton('eav/config')->getEntityType('catalog_category')->getDefaultAttributeSetId();
//Add group to entity & set
$installer->addAttributeGroup('catalog_category',$setId, 'My Extra Tab');
$installer->endSetup();
如果您还添加一个或多个属性,只需在 group
属性和组的配置值将自动添加:
$installer = Mage::getResourceModel('catalog/setup','catalog_setup');
$installer->startSetup();
//Add group to entity & all attribute sets
$installer->addAttribute(
'catalog_category',
'new_attribute',
array(
'label' => 'New Attribute',
'group' => 'My Extra Tab' //will be created if necessary
)
);
$installer->endSetup();
如果您只是尝试添加一些通用内容,请通过 adminhtml_catalog_category_tabs
事件 - 正如另一个答案中指出的 - 将是必经之路。
其他提示
因此,您的代码问题非常简单。
XML畸形,应如下以下外观 <catalog_category_tabs>
和 MyNamespace_MyModule_Block_Catalog_Category_Tabs
在没有额外空白的同一条线上:
<blocks>
<adminhtml>
<rewrite>
<catalog_category_tabs>MyNamespace_MyModule_Block_Catalog_Category_Tabs</catalog_category_tabs>
</rewrite>
</adminhtml>
</blocks>
进行此更改后,您的代码将起作用,但是有关您的代码还有其他一些评论。
点1
您的代码将尝试做的是调用您的块 _prepareLayout
然后致电父:: _ prepareLayout()在这种情况下是 Mage_Adminhtml_Block_Catalog_Category_Tabs
. 。您能做的就是如下更新块。 注意:这将首先添加您的新标签,这可能不是想法。
protected function _prepareLayout()
{
$this->addTab('myextratab', array(
'label' => Mage::helper('catalog')->__('My Extra Tab'),
'content' => 'Here is the contents for my extra tab'
));
return parent::_prepareLayout();
}
点2
有一个非常适合您想做的事的活动。您可以听这次活动 adminhtml_catalog_category_tabs
然后在您的观察者中做类似的事情。
$tabs = $observer->getTabs();
$tabs->addTab('myextratab', array(
'label' => Mage::helper('catalog')->__('My Extra Tab'),
'content' => 'Here is the contents for my extra tab'
));
如果其他任何代码重写此块,这将为您提供帮助