Magento非常灵活,因此有很多方法可以达到预期的效果.唯一的问题是确定最佳方法,即找到最可靠和有效的方法.
这里可以提出两种方法.选择取决于所需功能的技术细节,这些细节未在初始问题中说明:
>自定义选项卡将仅包含用于输入数据的基本字段
对于产品
>自定义选项卡将包含高级字段,和/或javascript,和/或其他自定义HTML
标记
让我们看看两种情况的解决方案.
#1.该选项卡仅包含用于输入产品数据的基本字段
在这种情况下,使用Magento的属性机制就足够了.它允许为产品创建属性(字段),仅将其应用于某些产品类型,并将字段分成组(选项卡).
这就是脚本的样子.
< module_dir> /sql/install-1.0.0.0.php
/* @var $installer Mage_Catalog_Model_Resource_Setup */
$installer = $this;
// Add attribute
$allowedProductTypes = array(
Mage_Catalog_Model_Product_Type_Grouped::TYPE_CODE,
Mage_Downloadable_Model_Product_Type::TYPE_DOWNLOADABLE,
);
$installer->addAttribute(Mage_Catalog_Model_Product::ENTITY, 'attribute_for_tab', array(
'label' => 'Attribute For Tab',
'apply_to' => implode(',', $allowedProductTypes),
'type' => 'varchar',
'input' => 'text',
'default' => '',
'global' => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_GLOBAL,
'user_defined' => true,
'visible' => true,
'required' => false,
'searchable' => false,
'filterable' => false,
'comparable' => false,
'visible_on_front' => false,
'unique' => false,
'is_configurable' => false
));
// Add group
$installer->addAttributeGroup(Mage_Catalog_Model_Product::ENTITY, 'Default', 'My Attribute Tab');
// Add attribute to set and group
$installer->addAttributeToSet(Mage_Catalog_Model_Product::ENTITY, 'Default', 'My Attribute Tab', 'attribute_for_tab');
#2.自定义选项卡将包含高级字段和/或javascript,和/或其他自定义HTML标记
在这种情况下,应将选项卡创建为通常的Magento块.并通过布局注入Tabs渲染器.
自定义标签块< module_dir> /Block/Adminhtml/Catalog/Product/Edit/Tab/Custom.php
class Zerkella_CustomTab_Block_Adminhtml_Catalog_Product_Edit_Tab_Custom
extends Mage_Adminhtml_Block_Widget implements Mage_Adminhtml_Block_Widget_Tab_Interface
{
/**
* Class constructor
*
*/
public function __construct()
{
parent::__construct();
$this->setTemplate('zerkella_customtab/catalog/product/edit/tab/custom.phtml');
}
/**
* Get tab label
*
* @return string
*/
public function getTabLabel()
{
return Mage::helper('zerkella_customtab')->__('My Custom Tab');
}
/**
* Get tab title
*
* @return string
*/
public function getTabTitle()
{
return Mage::helper('zerkella_customtab')->__('My Custom Tab');
}
/**
* Check if tab can be displayed
*
* @return boolean
*/
public function canShowTab()
{
$allowedProductTypes = array(
Mage_Catalog_Model_Product_Type_Grouped::TYPE_CODE,
Mage_Downloadable_Model_Product_Type::TYPE_DOWNLOADABLE,
);
$productType = $this->_getProduct()->getTypeId();
return in_array($productType, $allowedProductTypes);
}
/**
* Retrieve product
*
* @return Mage_Catalog_Model_Product
*/
protected function _getProduct()
{
return Mage::registry('current_product');
}
/**
* Check if tab is hidden
*
* @return boolean
*/
public function isHidden()
{
return false;
}
}
布局文件app / design / adminhtml / default / default / layout / zerkella_customtab.xml:
my_custom_tab
zerkella_customtab/adminhtml_catalog_product_edit_tab_custom
my_custom_tab
zerkella_customtab/adminhtml_catalog_product_edit_tab_custom
注意:如果具有自定义选项卡的产品类型是固定的,那么您可以将它们静态地放在布局文件中,而不是在块的canShowTab()方法中动态检查它们.
下面是这样一个示例案例的布局文件,当固定了自定义选项卡的产品类型并且仅包含可下载时,app / design / adminhtml / default / default / layout / zerkella_customtab.xml:
my_custom_tab
zerkella_customtab/adminhtml_catalog_product_edit_tab_custom
其余的很简单 – 您放入zerkella_customtab / catalog / product / edit / tab / custom.phtml的所有内容都将在选项卡中呈现.
另外,我不建议使用类重写来实现任务.上述方法涵盖了开发人员的所有需求.利用重写是没有意义的.虽然重写是一个强大的功能,允许在Magento中做任何事情,但它有两个限制:
>一个类只能由一个模块重写
>如果您的系统中有重写的类,那么将需要更多的工作
将Magento升级到更新版本
所提出的方法遵循在Magento中自定义产品选项卡的自然方式,因此最好选择其中一个.
祝你的商店好运:)