magento给后台表单添加新的元素

最近的一个seo项目有一部分是和tag有关的,tag云里面的tag可以分批显示,可以控制在tag/product/list页面,tag云里面要显示哪些哪些tag是可以控制的,同时为了配合seo,tag/product/list页面还要显示当前tag的描述信息。

为了实现这个功能,我的思路是扩展mangento现有的tag功能,给tag新增两个字段

  • parent_id控制tag的层级关系
  • description tag描述

升级sql脚本

  • ALTER TABLE `tag` ADD `parent_id` int(10) unsigned DEFAULT NULL AFTER `tag_id`;
  • ALTER TABLE `tag_properties` ADD `description` text;

回到本文的重点,如何把这两个元素加到现有后台tag编辑的地方,能想到的方法是重写Mage_Adminhtml_Block_Tag_Edit_Form这个类的_prepareForm()方法,把所有的字段用addField()方法重新添加一遍。以前很多次扩展表单我都是这么写的。我觉得我就新加了两个字段,就要把所有字段全部写一遍太傻了,能不能寻找新的突破口,我的想法是获取原始的form,原始的fieldset,在fieldset里面添加新的field。


parent::_prepareForm();
$form = $this->getForm();
$fieldset = ?

$fieldset = ?,我幻想着$form->getFieldset('base_fieldset')方法,查了一下没有。于是我重新翻了下varien_data_form类,发现了getElement()方法,试了一下OK,一圈下来证明我的想法是可行的,这样可以得到原始的form和fieldset,所以上面代码的完整版为:


parent::_prepareForm();
$form = $this->getForm();
$form->getFieldset('base_fieldset');

得到原来的form和fieldset后,接下可以给fieldset添加新的field了。


$fieldset->addField('parent_id', 'select', array(
'label' => '父标签',
'title' => '父标签',
'name' => 'tag_parent_id',
'value' => $model->getParentId(),
'values' => Core::helper('tagext')->getTagOptionsArray(),
'after_element_html' => ' ' . Core::helper('adminhtml')->__('[GLOBAL]'),
),'name');

$fieldset->addField('description', 'editor', array(
    'label'     => '标签描述',
    'title'     => '标签描述',
    'name'      => 'tag_description',
    'style'     => 'width:100%;height:10em',
    'value'     => $model->getDescription(),
    'config'    => Core::getSingleton('cms/wysiwyg_config')->getConfig(),
    'after_element_html' => ' ' . Core::helper('tag')->__('[STORE VIEW]')
),'parent_id');

$this->setForm($form);
return $this;

addField()方法的最后一个参数表示加在哪一个field的后面

总结一下:

不像grid,grid里面新加column有现成的addColumnAfter()方法可以用,扩展form没有现成的方法,需要我们自己动手,找到原始的form和fieldset对象,然后用fieldset对象的addField()方法添加新的元素。原来的自己真的是too young too simple了,都是把旧的元素全部抄一遍,再写新添加的元素。。。

你可能感兴趣的:(magento给后台表单添加新的元素)