2010-01-03 4 views
13

Existe-t-il un moyen d'ajouter un élément de formulaire personnalisé à un formulaire Magento Adminhtml sans placer l'élément personnalisé dans le dossier lib/Varian? (Comme supertextfield)Ajout d'un élément de formulaire personnalisé à un formulaire Adminhtml

J'ai traqué le code qui est essentiellement un Ainsi, Varian_Data_Form_Element_ usine

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

si je lis correctement, je me assure que le frontend d'un attribut EAV retourne un fieldType spécifique, et le système va instancier/afficher un Varien_Data_Form_Element_Supertextfield lors de l'affichage du formulaire d'édition de cet attribut.

Cela va bien, mais cela signifie que j'ai besoin d'inclure mon élément de formulaire personnalisé dans la hiérarchie du dossier lib/Varian. Étant donné que Magento est orienté module, il semble que ce soit mal.

Je me rends compte que je pouvais jank autour d'un chargeur automatique de custo ou des liens symboliques dans le répertoire lib, mais je suis surtout intéressé à apprendre s'il y a

  1. Une façon canonique d'ajouter des éléments de formulaire personnalisés pour les attributs

  2. Une façon canonique de personnaliser l'autochargeur Magento.

Répondre

2

Le service d'assistance téléphonique est à nouveau actif. Il ressemble à Magento met en place comprennent des chemins de telle sorte que vous pouvez déposer des fichiers de classe de lib (et pas seulement de l'espace de noms Mage_) dans votre branche de code local

app/code/local/Varien/etc 

Lorsque le chargeur automatique tente de charger une lib/Varien class, il vérifiera d'abord votre répertoire. Cela vous met toujours en danger si Varien crée un élément de données portant le même nom que le vôtre, mais que les risques sont relativement faibles.

+1

ne fonctionne pas pour moi, je suis désolé de le dire. Le Autoload.php de Varien ne regarde dans son propre dossier que lorsqu'il est inclus (ligne 93). Peut-il être possible de définir par programme les propriétés "_collectClasses" ou "_isIncludePathDefined" du chargement automatique pour qu'il apparaisse dans les dossiers que je spécifie? – urig

3

La classe Varien_Data_Form_Abstract dispose d'une méthode addType() dans laquelle vous pouvez ajouter de nouveaux types d'éléments et leurs noms de classe respectifs. Pour exploiter cette fonctionnalité, vous pouvez copier le bloc Mage_Adminhtml_Block_Widget_Form à la piscine de code local et étendre la méthode _getAdditionalElementTypes():

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

    return $types; 
} 

Comme la classe Mage_Adminhtml_Block_Widget_Form est une classe de base pour toutes les autres classes de forme, malheureusement réécriture juste le bloc dans la config ne fonctionnera pas.

EDIT: Si vous avez besoin des types d'éléments personnalisés dans un seul formulaire, vous pouvez remplacer la classe spécifique et y ajouter le type en remplaçant la méthode _getAdditionelElementTypes(). Ce serait une solution plus propre que de copier une classe importante magento dans le pool de code local.

EDIT2: En regardant Mage_Adminhtml_Block_Widget_Form::_setFieldset(), il y a une autre possibilité: Si l'attribut a une valeur en frontend_input_renderer (par exemple mymodule/element_mytype) alors un bloc avec ce nom est chargé. Voir aussi Mage/Eav/Modèle/Entity/Attribute/Frontend/Abstract.php ligne 160. Cela devrait fonctionner sans surcharger les classes Magento.

+0

Suffit-il de surcharger _getAdditionalElementTypes() ou dois-je aussi appeler addType ('my_type', 'Namespace_MyModule_Block_Widget_Form_Element_MyType'); ? Dois-je appeler addType sur le formulaire ou sur un fieldset à l'intérieur? Tx! – urig

26

C'est un ancien poste, mais il peut encore être utile pour quelqu'un:

oui vous pouvez.

Le code ci-dessous se trouve dans: app/code/local/MyCompany/MyModule/Bloc/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;', 
     )); 
    } 
} 

Voici le code de votre élément personnalisé, qui est situé dans app/code/local/MyCompany/MyModule/Lib/Varien/données/Forme/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

Excellente solution! Je vous remercie! –

+0

Un ajout rapide à la partie 'addType' du formulaire: je conseille fortement d'utiliser la fabrique de classe Magento plutôt que d'utiliser des noms de classes réelles. Cela suit mieux les règles de codage Magento et permet la réécriture. Donc, au lieu de faire '$ fieldset-> addType ('type_name', 'My_Module_Block_Class_Name')', veuillez faire '$ fieldset-> addType ('type_name', Mage :: getConfig() -> getBlockClassName ('mon_module/nom_classe')) ' –

Questions connexes