Как я могу изменить поля формы для атрибутов адреса клиента в администраторе?
Вопрос
Я разрабатываю расширение Magento, которое добавляет несколько пользовательских атрибутов к адресу клиента. Моя цель - изменить поля ввода адреса в форме заказа администратора. Когда я меняю порядок сортировки атрибутов, расположение меняется, но только для пользовательских атрибутов. Т.е. я не могу разместить поле ввода для пользовательского атрибута перед полем ввода для атрибута системы.
Я прочитал исходный код в Mage_Adminhtml_Block_Sales_Order_Create_Form_Address
а также Mage_Customer_Model_Form
Но все еще не может понять, как это сделать.
Это вообще возможно? Если да, то как мне это достичь?
РедактироватьВ моем скрипте mysql4-install-0.1.0.php я использую:
$this->addAttribute('customer_address', 'carrier_office_name', array(
'type' => 'int',
'input' => 'text',
'label' => 'Carrier office name',
'global' => 1,
'visible' => 1,
'sort_order' => 247, // example
'required' => 0,
'user_defined' => 1,
'visible_on_front' => 1
));
Решение
Взгляните на код, найденный в Mage_Adminhtml_Block_Sales_Order_Create_Form_Address::_prepareForm
. Анкет После того, как это звонит _addAttributesToForm
Чтобы добавить все атрибуты, он выполняет дополнительную обработку на горстке атрибутов по умолчанию. Когда это произойдет, он удаляет их из формы, а затем добавляет их обратно после «^», что поставит их в верхнюю часть формы независимо от их первоначальной позиции.
Конечно, можно изменить позиционирование всех атрибутов в форме, но для этого вам нужно будет расширить блок, чтобы контролировать окончательное позиционирование элементов формы.
Другие советы
Если кто -то еще пытается достичь этого:
$someFieldName = $this->_form->getElement('some_field_name');
//Remove the element from its default position
$fieldset->removeField($someFieldName->getId());
//Add new field
$someNewField = $fieldset->addField($someFieldName->getId(),
'text',
$someFieldName->getData(),
**$this->_form->getElement('lastname')->getId()**);
Ключевая информация: $this->_form->getElement('lastname')->getId()
является элементом, после чего должно быть расположено пользовательское поле ввода.
Решение, которое я использовал, заключалось в том, чтобы определить мой пользовательский атрибут как атрибут системы. Единственное, что требуется для этого, - это установить параметр 'определяемые пользователем'С значением 0.
$this->addAttribute('customer_address', 'mobile', array(
'type' => 'varchar',
'input' => 'text',
'label' => 'Mobile',
'global' => 1,
'visible' => 1,
'required' => 0,
'user_defined' => 0,
'visible_on_front' => 1,
'position' => 130 ));
Не знаю, имеет ли значение разница между системой или пользователем атрибутом.
NB (Magento 1.9.2.1): мне пришлось использовать параметр «позиция» вместо «sort_order» для метода addattribute ()