我们如何更改管理表单元素的位置(排序顺序)?
2 回答
TL;博士:
在定义字段时,您可以将插入符号指定^
为可选的第四个参数:
$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
类生成的属性的情况尤其重要。在此处了解更多信息。
检查“customer_eav_attribute”表中的“attribute_id”和“sort_order”字段。