2010-01-03 13 views
13

Gibt es eine Möglichkeit, ein benutzerdefiniertes Formularelement zu einem Magento-Adminhtml-Formular hinzuzufügen, ohne das benutzerdefinierte Element in den Ordner lib/Varian zu platzieren?Hinzufügen eines benutzerdefinierten Formularelements zu einem Adminhtml-Formular

Ich habe den Code aufgespürt, die eine Varian_Data_Form_Element_ Fabrik

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; 
} 

So im Wesentlichen ist, wenn ich das richtig zu lesen bin ich sicher, dass ein EAV-Attribut des Frontend einen bestimmten Feldtyp zurückgibt, (wie supertextfield) und das System wird eine Varien_Data_Form_Element_Supertextfield instanziieren/rendern, wenn das Bearbeitungsformular dieses Attributs angezeigt wird.

Das ist gut und gut, aber es bedeutet, dass ich mein benutzerdefiniertes Formularelement in die Ordnerhierarchie lib/Varian aufnehmen muss. Angesichts der Tatsache, wie modulorientiert Magento ist, scheint es, als ob es falsch läuft.

Ich weiß, ich kann jank um mit einem custo Autoloader oder Symlinks im lib, aber ich bin in erster Linie daran interessiert, zu lernen, wenn es

  1. ist kanonische Weise benutzerdefinierte Formelemente für Attribute

  2. hinzufügen
  3. Eine kanonische Möglichkeit, den Magento Autoloader anzupassen.

Antwort

2

Selbsthilfe Desk schlägt wieder. Es sieht aus wie Magento einrichtet sind Pfade in einer Weise, dass Sie Klassendateien aus lib fallen kann (nicht nur aus dem Mage_ Namespace) in Ihrem lokalen Code Zweig

app/code/local/Varien/etc 

Wenn der Autoloader eine lib/Varien zu laden versucht Klasse, wird es zuerst Ihr Verzeichnis überprüfen. Dies bringt Sie immer noch in Gefahr, wenn Varien jemals ein Datenelement mit dem gleichen Namen erstellt wie Sie, aber wenn die Risiken ausgehen, ist es relativ niedrig.

+1

Hat nicht funktioniert für mich ich bin zu sagen, sorry. Die Autoload.php von Varien sieht nur in einem eigenen Ordner aus (Zeile 93). Ist es möglich, die Eigenschaften "_collectClasses" oder "_isIncludePathDefined" des Autoloads programmgesteuert so festzulegen, dass sie in den von mir angegebenen Ordnern aussehen? – urig

3

Die Klasse Varien_Data_Form_Abstract hat eine Methode addType(), in der Sie neue Elementtypen und ihre jeweiligen Klassennamen hinzufügen können. Um diese Funktionalität ausnutzen können Sie den Block Mage_Adminhtml_Block_Widget_Form auf den lokalen Code Pool kopieren und erweitern die Methode _getAdditionalElementTypes():

protected function _getAdditionalElementTypes() 
{ 
    $types = array(
     'my_type' => 'Namespace_MyModule_Block_Widget_Form_Element_MyType', 
    ); 

    return $types; 
} 

Als Klasse Mage_Adminhtml_Block_Widget_Form ist eine Basisklasse für alle anderen Formularklassen leider Umschreiben nur um den Block in der Die Konfiguration funktioniert nicht.

EDIT: Wenn Sie die benutzerdefinierten Elementtypen in nur einem Formular benötigen, können Sie die spezifische Klasse überschreiben und den Typ dort durch Überschreiben der Methode _getAdditionelElementTypes() hinzufügen. Dies wäre eine sauberere Lösung als das Kopieren einer Import-Magento-Klasse in den lokalen Code-Pool.

EDIT2: Betrachten Mage_Adminhtml_Block_Widget_Form::_setFieldset() gibt es eine andere Möglichkeit: Wenn das Attribut einen Wert in frontend_input_renderer hat (z.B. mymodule/element_mytype) dann ein Block mit diesem Namen geladen ist. Siehe auch Mage/Eav/Modell/Entität/Attribut/Frontend/Abstract.php Zeile 160. Dies sollte funktionieren, ohne Magento-Klassen zu überschreiben.

+0

Ist es genug, _getAdditionalElementTypes() zu überschreiben oder muss ich auch addType aufrufen ('my_type', 'Namespace_MyModule_Block_Widget_Form_Element_MyType'); ? Benenne ich addType auf dem Formular oder auf einem Feldsatz darin? Tx! – urig

26

Dies ist eine alte Post, aber es kann immer noch sehr nützlich sein für jemanden:

ja Sie können.

Der folgende Code befindet sich in: 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;', 
     )); 
    } 
} 

Hier ist der Code des benutzerdefinierten Element ist, das in app gelegen ist/Code/local/MyCompany/MyModule/Lib/Varien/Daten/Form/Element/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

Große Lösung! Vielen Dank! –

+0

Eine schnelle Ergänzung zum 'addType'-Teil des Formulars: Ich rate dringend zur Verwendung der Magento-Klassenfactory anstatt echte Klassennamen zu verwenden. Dies folgt besser den Kodierungsregeln von Magento und erlaubt das Neuschreiben. Anstatt '$ fieldset-> addType ('type_name', 'My_Module_Block_Class_Name')' zu verwenden, führen Sie bitte '$ fieldset-> addType ('type_name', Mage :: getConfig() -> getBlockClassName ('mein_Modul/Klassenname')) ' –

Verwandte Themen