管理フォーム要素の位置 (並べ替え順序) を変更するにはどうすればよいですか?
2 に答える
TL;DR:
^
フィールドを定義するときに、オプションの 4 番目の引数としてキャレットを指定できます。
$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;
}
コメントは、要素の順序付け方法を示しています。したがって、フィールドを配置するには、4 番目の引数$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;
}
...
}
何かおかしなことに気づくかもしれません。呼び出しの 4 番目の引数addField
はキャレット ( '^'
) です。これにより、要素がフォームの一番上に配置されます。これが、質問で求めているように見えます。
ちょっと待って!これが上記のコード ドキュメントと一致しないのはなぜですか?! まあ、それは開発中の一貫したコーディング規約の断絶のように見えます. addField
コードをたどると、メソッドにたどり着くことがわかりますVarien_Data_Form_Element_Collection::add
。ここに 2 番目の引数 が$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 を渡すと指定された要素の後に要素が配置されることがわかります。
更新: 既存のフィールドを処理する方法
既存のフィールドの順序を変更したい場合はどうしますか? 残念ながら、順序付けはフィールドの追加時に行われ、その後は便利に変更できません。しかし、私は仕事を成し遂げるために2つのアプローチを提供することができます.
方法 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」フィールドを確認してください。