改善这个问题: Is it good practice to add own file in lib/Varien/Data/Form/Element folder
接受的答案显示了如何扩展Varien表单元素,但是如果要将其打包到自定义模块中,这将不起作用。
在模块中扩展Varien表单元素的正确方法是什么?我希望一个简单的XML设置?
更新:
感谢Vinai的回复。虽然这确实有效,但我希望以某种方式扩展表单元素。我的扩展程序使用基本文件表单元素,允许管理员将文件上载到类别。所以,我不是自己直接将表单元素添加到fieldset中。
我想可以在后端检查我的类别块上的文件输入:Mage_Adminhtml_Block_Catalog_Category_Tab_Attributes
,然后将表单元素更改为'file'到'mycompany_file' - 但这看起来像解决方法。
有更简单的方法吗?再次感谢Vinai。
答案 0 :(得分:11)
在Varien_Data_Form
实例上,您可以指定自定义元素类型,如下所示:
$fieldset->addType('custom', 'Your_Module_Model_Form_Element_Custom');
然后,添加你的元素
$fieldset->addField('the_name', 'custom', $optionsArray);
如果您使用的是没有字段集的表单,您也可以在Varien_Data_Form
实例上执行相同操作。
编辑:由于问题中有新的其他详细信息,请展开答案。
在班级Mage_Adminhtml_Block_Widget_Form::_setFieldset()
中,有以下代码:
$rendererClass = $attribute->getFrontend()->getInputRendererClass();
if (!empty($rendererClass)) {
$fieldType = $inputType . '_' . $attribute->getAttributeCode();
$fieldset->addType($fieldType, $rendererClass);
}
因此,属性上的属性frontend_input_renderer
可用于指定自定义元素类
此属性可以在表catalog_eav_attribute
中找到,幸运的是,它没有为任何类别图像属性设置。
鉴于此,有几种方法可以应用customizaton。
一种选择是使用升级脚本简单地在表中设置元素类
另一个是使用eav_entity_attribute_load_after
事件的观察者,并且如果entity_type_id和输入类型匹配,则动态设置输入渲染器。
所以它更多涉及到Magento中的常规类重写,但它很有可能。
答案 1 :(得分:1)
您不一定需要在lib / Varien /目录中有一个文件才能扩展它。如果需要向该集合添加元素,则应该能够扩展app / code / local模块中的一个元素。您引用的问题的答案似乎也表明情况就是这样。我将创建自定义字段,扩展其最高级别的功能集(即lib / Varien / Data / Form / Element / File.php)。
如果要覆盖Mage_Adminhtml_Block_Catalog_Category_Tab_Attributes
块,则应在模块中扩展该块,然后引用新块。为了兼容性,您可能希望使用事件观察器而不是XML重写来扩展块。