我们如何更改magento中的admin表单元素位置?

时间:2013-05-10 09:35:14

标签: magento

enter image description here

我们如何更改admin表单元素的位置(排序顺序)?

2 个答案:

答案 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'字段。