Есть ли способ добавить пользовательский элемент формы к форме Magento Adminhtml, не помещая пользовательский элемент в lib/Varian
папка?
Я разыскал код, который это по существу a Varian_Data_Form_Element_
фабрика
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;
}
Так, если я читаю это правильно, я удостоверяюсь, что frontend атрибута EAV возвращает определенный тип поля, (такой как supertextfield
) и система инстанцирует/представит a Varien_Data_Form_Element_Supertextfield
при отображении формы редактирования этого атрибута.
Это хорошо и хорошо, но это означает, что я должен включать свой пользовательский элемент формы в lib/Varian
иерархия папок. Учитывая то, как ориентировался модуль, Magento, кажется, что это делает его неправильно.
Я понимаю, что мог jank вокруг с custo автопогрузчиком или символьными ссылками в lib, но я, прежде всего, интересуюсь изучением, если существует
Канонический способ добавить пользовательские элементы формы для атрибутов
Канонический способ настроить автопогрузчик Magento.
Служба самопомощи снова наносит удар. Похоже, что Magento настраивает include пути таким образом, что вы можете выкинуть файлы классов из lib (а не только из пространства имён Mage_) в локальной ветке кода
app/code/local/Varien/etc
Когда автозагрузчик пытается загрузить класс lib/Varien, он сначала проверит вашу директорию. Это все равно подвергает вас риску, если Varien когда-либо создаст элемент данных с таким же именем, как и у вас, но с учетом риска это относительно низкое значение.
В классе Varien_Data_Form_Abstract
имеется метод addType()
, в который можно добавлять новые типы элементов и их соответствующие имена классов. Для использования этой функциональности можно скопировать блок Mage_Adminhtml_Block_Widget_Form
в локальный пул кодов и расширить метод _getAdditionalElementTypes()
:
protected function _getAdditionalElementTypes()
{
$types = array(
'my_type' => 'Namespace_MyModule_Block_Widget_Form_Element_MyType',
);
return $types;
}
Так как класс Mage_Adminhtml_Block_Widget_Form
является базовым классом для всех остальных классов формы, то, к сожалению, просто переписывание блока в конфигурационном файле не сработает.
EDIT: Если вам нужны пользовательские типы элементов только в одной форме, то вы можете переопределить конкретный класс и добавить туда тип, переопределив метод _getAdditionelElementTypes()
. Это было бы более чистым решением, чем копирование класса importend magento в локальный пул кода.
EDIT2: Глядя на Mage_Adminhtml_Block_Widget_Form::_setFieldset()
есть еще одна возможность: Если атрибут имеет значение в frontend_input_renderer
(например, mymodule/element_mytype), то загружается блок с таким именем. См. также строку 160 Mage/Eav/Model/Entity/Attribute/Frontend/Abstract.php. Это должно работать без переопределения классов Magento.
Это старый пост, но он все же может быть кому-то полезен:
да, можно.
Приведенный ниже код находится в: app / code / local / MyCompany / MyModule / Block / MyForm.php
class MyCompany_MyModule_Block_MyForm extends Mage_Adminhtml_Block_Widget_Form
{
protected function _prepareForm()
{
$form = new Varien_Data_Form(array(
'id' => 'edit_form',
'action' => $this->getUrl('*/*/save'),
'method' => 'post'
));
$fieldset = $form->addFieldset('my_fieldset', array('legend' => 'Your fieldset title')));
//Here is what is interesting us
//We add a new type, our type, to the fieldset
//We call it extended_label
$fieldset->addType('extended_label','MyCompany_MyModule_Lib_Varien_Data_Form_Element_ExtendedLabel');
$fieldset->addField('mycustom_element', 'extended_label', array(
'label' => 'My Custom Element Label',
'name' => 'mycustom_element',
'required' => false,
'value' => $this->getLastEventLabel($lastEvent),
'bold' => true,
'label_style' => 'font-weight: bold;color:red;',
));
}
}
Вот код вашего настраиваемого элемента, который расположен в app / code / local / MyCompany / MyModule / Lib / Varien / Data / Форма / Элемент / ExtendedLabel.php :
class MyCompany_MyModule_Lib_Varien_Data_Form_Element_ExtendedLabel extends Varien_Data_Form_Element_Abstract
{
public function __construct($attributes=array())
{
parent::__construct($attributes);
$this->setType('label');
}
public function getElementHtml()
{
$html = $this->getBold() ? '<strong>' : '';
$html.= $this->getEscapedValue();
$html.= $this->getBold() ? '</strong>' : '';
$html.= $this->getAfterElementHtml();
return $html;
}
public function getLabelHtml($idSuffix = ''){
if (!is_null($this->getLabel())) {
$html = '<label for="'.$this->getHtmlId() . $idSuffix . '" style="'.$this->getLabelStyle().'">'.$this->getLabel()
. ( $this->getRequired() ? ' <span class="required">*</span>' : '' ).'</label>'."\n";
}
else {
$html = '';
}
return $html;
}
}