2010-01-03 44 views
13

Có cách nào để thêm phần tử biểu mẫu tùy chỉnh vào biểu mẫu Magento Adminhtml mà không đặt phần tử tùy chỉnh trong thư mục lib/Varian không?Thêm phần tử biểu mẫu tùy chỉnh vào biểu mẫu Adminhtml

Tôi đã theo dõi xuống mã đó là bản chất là một nhà máy 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; 
} 

Vì vậy, nếu tôi đang đọc này một cách chính xác, tôi đảm bảo rằng lối vào một EAV thuộc tính trả về một fieldType cụ thể, (ví dụ như supertextfield) và hệ thống sẽ khởi tạo/hiển thị Varien_Data_Form_Element_Supertextfield khi hiển thị biểu mẫu chỉnh sửa của thuộc tính này.

Điều này là tốt và tốt, nhưng điều đó có nghĩa là tôi cần phải bao gồm phần tử biểu mẫu tùy chỉnh của mình trong phân cấp thư mục lib/Varian. Với cách Magento định hướng mô-đun, có vẻ như điều này đang làm sai.

Tôi nhận ra tôi có thể JANK xung quanh với một autoloader Custo hoặc liên kết tượng trưng trong lib, nhưng tôi chủ yếu quan tâm đến việc học tập nếu có

  1. Một cách kinh điển để thêm các yếu tố hình thức tùy chỉnh cho các thuộc tính

  2. Một cách kinh điển để tùy chỉnh trình nạp tự động Magento.

Trả lời

2

Cảnh báo tự động giúp bàn một lần nữa. Dường như Magento thiết lập bao gồm đường dẫn trong một cách mà bạn có thể thả các file lớp từ lib (không chỉ từ namespace Mage_) trong chi nhánh mã địa phương của bạn

app/code/local/Varien/etc 

Khi autoloader cố gắng tải một lib/Varien lớp, nó sẽ kiểm tra thư mục của bạn trước. Điều này vẫn đặt bạn vào nguy cơ nếu Varien bao giờ tạo ra một phần tử dữ liệu có cùng tên với tên của bạn, nhưng rủi ro là nó tương đối thấp.

+1

không làm việc cho tôi, tôi xin lỗi để nói. Autoload.php của Varien chỉ tìm trong thư mục riêng của nó khi đưa vào (dòng 93). Có thể đặt các thuộc tính "_collectClasses" hoặc "_isIncludePathDefined" của tự động tải theo chương trình để làm cho nó trông trong các thư mục mà tôi chỉ định không? – urig

3

Lớp Varien_Data_Form_Abstract có phương thức addType() nơi bạn có thể thêm các loại phần tử mới và tên lớp tương ứng của chúng. Để khai thác tính năng này, bạn có thể sao chép khối Mage_Adminhtml_Block_Widget_Form đến hồ bơi mã địa phương và mở rộng các phương pháp _getAdditionalElementTypes():

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

    return $types; 
} 

Như lớp Mage_Adminhtml_Block_Widget_Form là một lớp cơ sở cho tất cả các lớp hình thức khác, không may chỉ viết lại khối trong config sẽ không hoạt động.

EDIT: Nếu bạn cần các loại phần tử tùy chỉnh chỉ trong một biểu mẫu, bạn có thể ghi đè lên lớp cụ thể và thêm loại đó bằng cách ghi đè phương thức _getAdditionelElementTypes(). Đây sẽ là một giải pháp sạch hơn là sao chép một lớp Magento nhập khẩu vào nhóm mã cục bộ.

EDIT2: Nhìn vào Mage_Adminhtml_Block_Widget_Form::_setFieldset() có một khả năng khác: Nếu thuộc tính có giá trị trong frontend_input_renderer (ví dụ: mymodule/element_mytype) thì một khối có tên đó được tải. Xem thêm Mage/Eav/Model/Entity/Attribute/Frontend/Abstract.php dòng 160. Điều này sẽ hoạt động mà không cần ghi đè bất kỳ lớp Magento nào.

+0

Có đủ để ghi đè _getAdditionalElementTypes() hoặc tôi cũng cần phải gọi addType ('my_type', 'Namespace_MyModule_Block_Widget_Form_Element_MyType'); ? Tôi có gọi addType trên biểu mẫu hoặc trên một fieldset bên trong nó không? Tx! – urig

26

Đây là một bài đăng cũ nhưng nó vẫn có thể hữu ích cho một người nào đó:

có bạn có thể.

Mã dưới đây tọa lạc tại: app/code/local/MyCompany/MyModule/Khối/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;', 
     )); 
    } 
} 

Đây là mã của nguyên tố tùy chỉnh của bạn, đó là nằm trong app/mã/local/MyCompany/MyModule/Lib/Varien/Data/Form/Yếu tố/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

Giải pháp tuyệt vời! Cảm ơn bạn! –

+0

Một bổ sung nhanh vào phần 'addType' của biểu mẫu: Tôi khuyên bạn nên sử dụng nhà máy lớp Magento thay vì sử dụng tên lớp thực. Điều này tốt hơn sau các quy tắc mã hóa Magento và cho phép viết lại. Vì vậy, thay vì làm '$ fieldset-> addType ('type_name', 'My_Module_Block_Class_Name')', hãy làm '$ fieldset-> addType ('type_name', Mage :: getConfig() -> getBlockClassName ('my_module/class_name')) ' –

Các vấn đề liên quan