#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.