Добавление пользовательского элемента формы к форме Adminhtml

Есть ли способ добавить пользовательский элемент формы к форме 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, но я, прежде всего, интересуюсь изучением, если существует

  1. Канонический способ добавить пользовательские элементы формы для атрибутов

  2. Канонический способ настроить автопогрузчик Magento.

14
задан Alan Storm 3 January 2010 в 01:29
поделиться

3 ответа

Служба самопомощи снова наносит удар. Похоже, что Magento настраивает include пути таким образом, что вы можете выкинуть файлы классов из lib (а не только из пространства имён Mage_) в локальной ветке кода

app/code/local/Varien/etc

Когда автозагрузчик пытается загрузить класс lib/Varien, он сначала проверит вашу директорию. Это все равно подвергает вас риску, если Varien когда-либо создаст элемент данных с таким же именем, как и у вас, но с учетом риска это относительно низкое значение.

2
ответ дан 1 December 2019 в 08:52
поделиться

В классе 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.

3
ответ дан 1 December 2019 в 08:52
поделиться

Это старый пост, но он все же может быть кому-то полезен:

да, можно.

Приведенный ниже код находится в: 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;
    }
}
26
ответ дан 1 December 2019 в 08:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: