Bir Adminhtml Forma bir özel form öğesi ekleme

3 Cevap php

lib/Varian klasörüne özel elemanı koymadan Magento Adminhtml forma için özel bir form öğesi eklemek için bir yolu var mı?

Ben aslında bir Varian_Data_Form_Element_ fabrikası kodunu izledik

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

Ben doğru okuyorsam görüntülerken Yani, ben bir EAV özniteliðin arayüzü (örneğin supertextfield gibi) belirli bir FieldType, döner ve sistem render / a Varien_Data_Form_Element_Supertextfield örneğini sağlamak Bu niteliğin düzenleme biçimidir.

Bu iyi ve iyi, ama ben lib/Varian klasör hiyerarşisinde benim özel form öğesi eklemek gerekiyor demektir. Modülü odaklı Magento nasıl göz önüne alındığında, bu yanlış yapıyor gibi görünüyor.

Ben bir custo autoloader veya lib sembolik etrafında jank olabilir farkındayım, ama varsa öğrenmeye öncelikle ilgileniyorum

  1. Özellikleri için özel form öğeleri eklemek için bir kanonik yolu

  2. Magento autoloader özelleştirmek için bir kanonik yolu.

3 Cevap

Kendi kendine yardım masası tekrar vurur. Magento yerel kod dalı (sadece Mage_ ad alanından) lib sınıfının dosyaları bırakın böyle bir şekilde yolları dahil kurar gibi görünüyor

app/code/local/Varien/etc

Autoloader lib / Varien sınıfı yüklemek için çalıştığında, ilk dizini kontrol edecektir. Varien hiç sizinki gibi aynı adı taşıyan bir veri öğesi oluşturur, bu yine de riske atar, fakat riskler gitmek gibi nispeten düşük olduğunu.

Bu eski bir yazı ama hala birisi için yararlı olabilir:

evet yapabilirsiniz.

The code below is located 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;',
        ));
    }
}

İşte özel elemanının kodu located in app/code/local/MyCompany/MyModule/Lib/Varien/Data/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;
    }
}

Sınıf Varien_Data_Form_Abstract bir yöntemi vardır addType() yeni eleman türlerini ve kendi sınıf adları ekleyebilirsiniz nerede. Bu işlevselliği yararlanmak için, Mage_Adminhtml_Block_Widget_Form, yerel kod havuzuna blok kopyalama ve yöntemi genişletebilirsiniz _getAdditionalElementTypes() yapabilirsiniz:

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

    return $types;
}

Sınıf Mage_Adminhtml_Block_Widget_Form tüm diğer form sınıflar için temel sınıf olarak, ne yazık ki sadece config bloğu yeniden çalışmaz.

EDIT: Eğer sadece tek bir formda özel öğe türlerini ihtiyacınız varsa özel sınıf geçersiz ve yöntemi geçersiz orada türünü ekleyebilirsiniz _getAdditionelElementTypes(). Bu yerel kod havuzuna bir importend magento sınıfını kopyalayarak daha temiz bir çözüm olacaktır.

EDIT2: niteliği frontend_input_renderer (örneğin MyModule / element_mytype) bir değer varsa o isimde bir blok yüklenir: Mage_Adminhtml_Block_Widget_Form::_setFieldset() başka bir olasılık var baktığımızda. Büyücü / Eav / Model / Varlık / Özellik / Önuç / Abstract.php hattı 160 Ayrıca bkz. Bu herhangi Magento sınıfları geçersiz kılma olmadan çalışması gerekir.