Рекомендуется ли добавлять собственный файл в папку lib / Varien / Data / Form / Element

#magento

#magento

Вопрос:

Мне нужно создать модуль в Magento, в котором будет несколько таблиц базы данных. Одной из функций модуля является добавление нескольких изображений. Например, находясь на странице «Добавить новый элемент» или «Редактировать элемент» в admin, с левой стороны у меня есть вкладки, одна из них — «Изображения элементов«. При нажатии я хочу, чтобы содержимое этой вкладки было моим собственным. Покопавшись в коде, выяснилось, что способ отображения этого содержимого Magento использует один из классов Varien_Data_Form_Element для каждого элемента в полной форме. Я хочу добавить сюда свой собственный класс, который будет отображать элементы формы так, как я хочу. Это хорошая практика для этого, или есть какой-то другой, более элегантный способ добавления собственного содержимого в формы администратора? РЕДАКТИРОВАТЬ: я должен добавить, что ни один из существующих классов не помогает моей проблеме.

РЕДАКТИРОВАТЬ РЕШЕНИЕ: у меня есть контроллер в моем пользовательском модуле, который находится в Mypackage/Mymodule/controllers/Adminhtml/Item.php . В методе editAction(), который я использую для добавления и создания новых элементов, я создаю 2 блока, один для формы и один слева для вкладок:

$this->_addContent($this->getLayout()-> createBlock('item/adminhtml_edit'))
 ->_addLeft($this->getLayout()-> createBlock('item/adminhtml_edit_tabs'));
$this-> renderLayout();

Block/Adminhtml/Edit/Tabs.php блок создает 2 вкладки слева: общая информация и изображения элементов, каждая из которых отображает различный контент с правой стороны, используя классы блоков.

защищенная функция _beforeToHtml()
{
 $this->addTab('item_info', массив ( 
 'label' => Mage::helper('mymodule')->__('Информация об элементе'), 
 'content' => $this-> getLayout()->createBlock('item/adminhtml_edit_tab_form')-> toHtml(),
 ));

 $this->addTab('item_images', массив ( 
 'label' => Mage::helper('mymodule')->__('Изображения элементов'), 
 'active' => ( $this->GetRequest()->getParam('tab') == 'item_images') ? true : false, 
 'content' => $this-> getLayout()->createBlock('item/adminhtml_images')-> toHtml(),
 ));

 возвращает parent::_beforeToHtml(); 
}

Я хотел, чтобы вкладка item_images отображала мои собственные элементы формы и значения, а не элементы формы varien по умолчанию.

класс Mypackage_Mymodule_Block_Adminhtml_Images расширяет Mage_Core_Block_Template
{
 общедоступная функция __construct()
 { 
 parent::__construct();
 $this-> setTemplate('item/images.phtml'); // Это в дизайне adminhtml
 }


 общедоступная функция getPostId()
 { 
 верните $this-> GetRequest()->getParam('id');
 }

 общедоступная функция getExistingImages()
 { 
 верните Mage::getModel('mymodule/item')-> getImages($this->getPostId());
 }
}

Затем в шаблоне app / design /adminhtml/default/default/template/item/images.phtml вы можете использовать эти значения:

// Вы можете добавить сюда свои собственные поля пользовательской формы, и все они будут включены в форму 
foreach($this->getExistingImages() как $_img):
// Сделайте что-нибудь с каждым изображением 
endforeach;
// Вы можете добавить сюда свои собственные поля пользовательской формы, и все они будут включены в форму

Ответ №1:

Нет, это не так. Вы никогда не должны редактировать или добавлять в файлы, предоставленные поставщиком. Если вам абсолютно необходимо заменить файл класса, вы должны использовать локальный пул кода. Например, если вы хотели изменить поведение текстового поля,

 lib/Varien/Data/Form/Element/Text.php
  

Вы должны поместить файл в локальный пул кода или сообщество

 app/code/local/Varient/Data/Form/Element/Text.php
  

Однако выполнение заменяет класс, и вы несете ответственность за поддержание совместимости с будущими версиями. Это означает, что если Magento Inc. изменится lib/Varien/Data/Form/Element/Text.php , вам необходимо обновить свою версию, чтобы она была совместимой.

Основываясь на том, что вы сказали, я бы рассмотрел возможность создания перезаписи класса для класса Block, который отображает форму.

Комментарии:

1. Спасибо за ваш ответ. Я планировал добавить туда файл, но нашел лучшее и более простое решение. Я отредактирую свой вопрос, хотя я доволен вашим ответом, также не знал, что вы можете расширять классы Varien.