我们如何更改admin表单元素的位置(排序顺序)?
答案 0 :(得分:3)
<强> TL; DR:强>
在定义字段时,您可以指定插入符^
作为可选的第四个参数:
$fieldset->addField('my_element','text',array(
'name' => 'my_element',
'label' => Mage::helper('customer')->__('My Element')
),'^');
更多信息
请参阅Varien_Data_Form_Abstract::addField
:
/**
* Add child element
*
* if $after parameter is false - then element adds to end of collection
* if $after parameter is null - then element adds to befin of collection
* if $after parameter is string - then element adds after of the element with some id
*
* @param string $elementId
* @param string $type
* @param array $config
* @param mixed $after
* @return Varien_Data_Form_Element_Abstract
*/
public function addField($elementId, $type, $config, $after=false)
{
if (isset($this->_types[$type])) {
$className = $this->_types[$type];
}
else {
$className = 'Varien_Data_Form_Element_'.ucfirst(strtolower($type));
}
$element = new $className($config);
$element->setId($elementId);
if ($element->getRequired()) {
$element->addClass('required-entry');
}
$this->addElement($element, $after);
return $element;
}
评论告诉您如何订购元素。因此,要定位您的字段,请指定$after
的第四个参数somefield
,或者您想要放置的字段的ID。
当您在自己的班级中扩展客户帐户表单时,这非常有用。这是一个将新表单元素放在表单中第一个表单元素上的示例:
class Yourcompany_Adminhtml_Block_Customer_Edit_Tab_Account extends Mage_Adminhtml_Block_Customer_Edit_Tab_Account {
...
public function initForm() {
parent::initForm();
$form=$this->getForm();
$fieldset=$form->getElement('base_fieldset');
$fieldset->addField('my_element','text',array(
'name' => 'my_element',
'label' => Mage::helper('customer')->__('My Element')
),'^');
return $this;
}
...
}
您可能会注意到一些奇怪的事情。 addField
调用的第四个参数是插入符号('^'
)。这会将元素放在表单的最顶部,这就是您在问题中看到的内容。
但是等等!为什么这不符合上面显示的代码文档?!嗯,在开发过程中看起来像是一致的编码约定。如果您按照代码操作,您会发现addField
可以使用Varien_Data_Form_Element_Collection::add
方法。在这里,我们看到第二个参数$after
,在评论中注明:
/**
* Add element to collection
*
* @todo get it straight with $after
* @param Varien_Data_Form_Element_Abstract $element
* @param boolean|'^'|string $after
* @return Varien_Data_Form_Element_Abstract
*/
public function add(Varien_Data_Form_Element_Abstract $element, $after=false)
在这里,我们发现false
将元素附加到字段集,^
字符前置元素,传入元素ID会将元素放在指定的元素之后。
更新:如何处理现有字段
如果您想重新订购现有字段该怎么办?不幸的是,在添加字段时进行排序,之后不能方便地进行更改。但我可以提供两种方法来完成工作。
方法1:通过删除和添加重新排序
$fieldset->removeField('core_element');
$fieldset->addField('core_element','text',array(
'name' => 'core_element',
'label' => Mage::helper('customer')->__('Core Element')
),'^');
这是一个简单的解决方案,但需要您手动重新定义该字段。在某些情况下,这很容易。在其他人,不是这样。对于这些情况,请参阅下一步。
方法2:通过克隆重新排序
$element=clone $form->getElement('core_element');
$fieldset->removeField('core_element');
$fieldset->addElement($element,'^');
我认为这是最好的解决方案,因为它保留了最初编写的元素定义。对于属性的部分由frontend_input_renderer
类生成的属性,这一点尤其重要。详细了解here。
答案 1 :(得分:1)
检查'attribute_id'和&amp; 'customer_eav_attribute'表中的'sort_order'字段。