2010-01-03 104 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屬性的前端返回一個特定的字段類型,(如supertextfield)當顯示該屬性的編輯表單時,系統將實例化/呈現Varien_Data_Form_Element_Supertextfield

這很好,但它意味着我需要將我的自定義表單元素包含在lib/Varian文件夾層次結構中。鑑於面向模塊的Magento是如何的,這似乎是做錯了。

我知道我可以用的lib一個丘斯托自動加載磁帶機或符號鏈接JANK身邊,但我主要是興趣,如果有

  1. 添加的屬性自定義表單元素一個規範的方法

  2. 自定義Magento自動加載器的規範方法。

回答

2

自助服務檯再次發生罷工。它看起來像Magento的設置包括在您的本地代碼分支

app/code/local/Varien/etc 

當自動加載嘗試加載一個lib /瓦瑞恩以這樣的方式,你可以從lib中拖放類文件(不只是從Mage_命名空間)路徑類,它會先檢查你的目錄。如果Varien創建了與您的名稱相同的數據元素,這仍然會使您處於風險之中,但風險相對較低。

+1

不爲我工作,我很抱歉地說。包含(第93行)時,Varien的Autoload.php僅在其自己的文件夾中查找。可能有可能以編程方式設置自動加載的「_collectClasses」或「_isIncludePathDefined」屬性,以使其在我指定的文件夾中查找? – urig 2011-03-29 10:49:52

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是所有其他形式的類的基類,可惜只是重寫的塊配置將不起作用。

編輯:如果你只需要一種形式的自定義元素類型,你可以覆蓋特定的類,並通過覆蓋方法_getAdditionelElementTypes()來添加類型。這將比將import和magento類複製到本地代碼池更清潔。

編輯2:看看Mage_Adminhtml_Block_Widget_Form::_setFieldset()還有另一種可能性:如果該屬性的值爲frontend_input_renderer(例如mymodule/element_mytype),則加載具有該名稱的塊。另請參見Mage/Eav/Model/Entity/Attribute/Frontend/Abstract.php第160行。這應該不會覆蓋任何Magento類。

+0

是否足以覆蓋_getAdditionalElementTypes()或我是否還需要調用addType('my_type','Namespace_MyModule_Block_Widget_Form_Element_MyType'); ?我在表單上還是在字段集上調用addType? TX! – urig 2011-03-29 20:25:14

26

這是一箇舊的帖子,但它仍然可以用於某人:

是的,你可以。

下面的代碼位於: 應用程序/代碼/本地/ MyCompany的/ MyModule的/座/ 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目錄/瓦瑞恩/數據/表格/元/ 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

偉大的解決方案!謝謝! – 2012-08-07 13:36:53

+0

快速添加到表單的addType部分:我強烈建議使用Magento類工廠,而不要使用真實的類名。這更好地遵循Magento編碼規則並允許重寫。因此,不要執行'$ fieldset-> addType('type_name','My_Module_Block_Class_Name')',請執行'$ fieldset-> addType('type_name',Mage :: getConfig() - > getBlockClassName('my_module/class_name' ))' – 2015-10-02 15:02:32

相關問題