2010-01-03 4 views
13

Есть ли способ добавить пользовательский элемент формы в форму Magento Adminhtml без размещения пользовательского элемента в папке lib/Varian?Добавление пользовательского элемента формы в форму Adminhtml

Я разыскал код, который по существу 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; 
} 

Итак, если я правильно читать это, я могу гарантировать, что интерфейс атрибут EAV возвращает определенный FieldType, (например, supertextfield) и при создании формы редактирования этого атрибута система будет создавать/визуализировать Varien_Data_Form_Element_Supertextfield.

Это хорошо и хорошо, но это означает, что мне нужно включить свой пользовательский элемент формы в иерархию папок lib/Varian. Учитывая, насколько модульным является Magento, кажется, что это делает это неправильно.

Я понимаю, что я мог Jank вокруг с Custo автозагрузчиком или симлинками в Lib, но я в первую очередь заинтересован в обучении, если есть

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

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

ответ

2

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

app/code/local/Varien/etc 

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

+1

не работает для меня, я к сожалению. Autoload.php Varien смотрит только в свою собственную папку при включении (строка 93). Можно ли программно настроить свойства «_collectClasses» или «_InIncludePathDefined» для автозагрузки, чтобы он выглядел в папках, которые я указываю? – urig

3

Класс 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 является базовым классом для всех других классов форм, к сожалению, просто переписав блок в config не будет работать.

EDIT: Если вам нужны специальные типы элементов только в одной форме, вы можете переопределить конкретный класс и добавить туда тип, переопределив метод _getAdditionelElementTypes(). Это было бы более чистым решением, чем копирование импортируемого magento-класса в локальный пул кодов.

EDIT2: Глядя на Mage_Adminhtml_Block_Widget_Form::_setFieldset() есть еще одна возможность: Если атрибут имеет значение в frontend_input_renderer (например, MyModule/element_mytype), то кадр с этим именем загружается. См. Также Mage/Eav/Model/Entity/Attribute/Frontend/Abstract.php line 160. Это должно работать без переопределения любых классов Magento.

+0

Достаточно ли переопределить _getAdditionalElementTypes() или мне также нужно вызвать addType ('my_type', 'Namespace_MyModule_Block_Widget_Form_Element_MyType'); ? Я вызываю addType в форме или в поле внутри? Tx! – urig

26

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

да вы можете.

ниже код находится в: приложения/код/​​местные/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;', 
     )); 
    } 
} 

Вот код пользовательского элемента, который находится в приложении/код/​​местные/MyCompany/MyModule/Lib/Varien/Данные/Форма/Элемент/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; 
    } 
} 
+0

Отличное решение! Спасибо! –

+0

Быстрое дополнение к части 'addType' формы: я настоятельно рекомендую использовать фабрику классов Magento вместо использования настоящих имен классов. Это лучше следует правилам кодирования Magento и позволяет переписывать. Итак, вместо выполнения '$ fieldset-> addType ('type_name', 'My_Module_Block_Class_Name')', пожалуйста, сделайте '$ fieldset-> addType ('type_name', Mage :: getConfig() -> getBlockClassName ('my_module/class_name')) ' –

Смежные вопросы