2010-01-03 5 views
13

C'è un modo per aggiungere un modulo modulo personalizzato a un modulo Magento Adminhtml senza posizionare l'elemento personalizzato nella cartella lib/Varian?Aggiunta di un elemento modulo personalizzato a un modulo Adminhtml

ho rintracciato il codice che è essenzialmente una fabbrica 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; 
} 

Quindi, se sto leggendo correttamente, mi assicuro che frontend di un attributo EAV restituisce un fieldType specifica, (come ad esempio supertextfield) e il sistema eseguirà un'istanza/renderizza un Varien_Data_Form_Element_Supertextfield durante la visualizzazione del modulo di modifica di questo attributo.

Questo va bene, ma significa che è necessario includere il mio elemento modulo personalizzato nella gerarchia di cartelle lib/Varian. Dato che Magento è orientato ai moduli, sembra che stia sbagliando.

mi rendo conto che potevo Jank in giro con un caricatore automatico Custo o link simbolici nella cartella lib, ma sono soprattutto interessati ad imparare se c'è

  1. Un modo canonico per aggiungere elementi di modulo personalizzato per gli attributi

  2. Un modo canonico per personalizzare il caricatore automatico Magento.

risposta

2

L'help desk di auto colpisce ancora. Sembra che Magento imposta includere i percorsi in modo tale che si può cadere file di classe da lib (non solo dallo spazio dei nomi Mage_) nel ramo numero locale di

app/code/local/Varien/etc 

Quando il caricatore automatico tenta di caricare un lib/Varien classe, controllerà prima la tua directory. Questo ti mette ancora a rischio se Varien crea mai un elemento dati con lo stesso nome del tuo, ma a causa dei rischi è relativamente basso.

+1

non funziona per me mi dispiace dirlo. Il Variolo's Autoload.php appare solo nella sua cartella quando include (riga 93). Potrebbe essere possibile impostare le proprietà "_collectClasses" o "_isIncludePathDefined" del caricamento automatico a livello di codice per farlo apparire nelle cartelle che ho specificato? – urig

3

La classe Varien_Data_Form_Abstract ha un metodo addType() in cui è possibile aggiungere nuovi tipi di elementi e i rispettivi nomi di classe. Per sfruttare questa funzionalità è possibile copiare il blocco Mage_Adminhtml_Block_Widget_Form alla piscina prefisso locale ed estendere il metodo _getAdditionalElementTypes():

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

    return $types; 
} 

Come la classe Mage_Adminhtml_Block_Widget_Form è una classe base per tutte le altre classi dei form, purtroppo basta riscrivere il blocco nel la configurazione non funzionerà.

MODIFICA: se sono necessari i tipi di elementi personalizzati in un unico modulo, è possibile sovrascrivere la classe specifica e aggiungere il tipo in tale posizione sovrascrivendo il metodo _getAdditionelElementTypes(). Questa sarebbe una soluzione più pulita rispetto alla copia di una classe magenta importend nel pool di codice locale.

EDIT2: guardando Mage_Adminhtml_Block_Widget_Form::_setFieldset() c'è un'altra possibilità: se l'attributo ha un valore in frontend_input_renderer (ad esempio mymodule/element_mytype), viene caricato un blocco con quel nome. Vedi anche Mage/Eav/Model/Entity/Attribute/Frontend/Abstract.php line 160. Questo dovrebbe funzionare senza sovrascrivere le classi Magento.

+0

È sufficiente sovrascrivere _getAdditionalElementTypes() o devo anche chiamare addType ('my_type', 'Namespace_MyModule_Block_Widget_Form_Element_MyType'); ? Devo chiamare addType sul modulo o su un fieldset al suo interno? Tx! – urig

26

Questo è un vecchio post, ma ancora può essere utile per qualcuno:

sì, è possibile.

Il codice qui sotto è situata in: app/code/local/MyCompany/MyModule/blocchi/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;', 
     )); 
    } 
} 

Ecco il codice del vostro elemento personalizzato, che è trova in app/codice/local/MyCompany/MyModule/lib/Varien/dati/Form/Elemento/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

Ottima soluzione! Grazie! –

+0

Una rapida aggiunta alla parte 'addType' del modulo: raccomando vivamente di usare la classe di produzione Magento piuttosto che usare nomi di classi reali. Questo segue meglio le regole di codifica di Magento e consente la riscrittura. Quindi, invece di fare '$ fieldset-> addType ('type_name', 'My_Module_Block_Class_Name')', si prega di fare '$ fieldset-> addType ('type_name', Mage :: getConfig() -> getBlockClassName ('my_module/class_name')) ' –