как создать такой блок в админке

[10 ноября 2016 г.]    Российская сборка Magento 2.49.12
Magento 2: модули и услуги
#1 stuff
  • Группа: Пользователь
  • Сообщений: 27
  • Регистрация: 06.06.2011

18.10.2012 19:15

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

Прикрепленные изображения

  • Прикрепленное изображение: THE GOOD WILL OUT | SNEAKER SHOP KÖLN color : Manage Attributes : Attributes : Catalog : THE GOOD WILL OUT | SNEAKER SHOP KÖLN Magento Admin 2012-10-18 19-11-15.png


#2 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8884
  • Регистрация: 20.02.2010

18.10.2012 19:53

Начать надо с просмотра исходного кода данного блока.

#3 stuff
  • Группа: Пользователь
  • Сообщений: 27
  • Регистрация: 06.06.2011

18.10.2012 20:02

да, я посмотрел phtml-файл, в котором находится код этого блока. но меня больше интересует структура блоков и контроллеров. нужно описать Grid или что-то в этом роде?

#4 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8884
  • Регистрация: 20.02.2010

18.10.2012 20:04

Ну вот посмотрите исходный код контроллера.

#5 stuff
  • Группа: Пользователь
  • Сообщений: 27
  • Регистрация: 06.06.2011

18.10.2012 20:19

у этого модуля много лишнего кода для меня из которого трудно вырвать нужный кусок. поэтому я и обратился за помощью к вам на форум. на сколько я понимаю там этот блок зависим от других. т.е в индексе есть обычная таблица (Grid?) с кнопочками сохранениия, добавления, удаления и т.е. щелкая по записи в этой таблице я попадаю на страницу ее редактирования. где в одном их табов находится этот блок. можно, допусти, в блоке вызвать phtml с кодом этого блока, но тогда нет кнопок сохранения и остальных из стандартного списка

#6 Сергей Остапчик
  • Группа: Пользователь
  • Сообщений: 6
  • Регистрация: 29.11.2011

23.10.2012 11:56

Процесс создания можно поделить на 3 этапа:
1. В нужной табе на нашей странице в админке мы добавляем поле и назначаем ему renderer (т.е. блок отвечающий за вывод)
Пример:
$renderer = new  MM_Mymodule_Block_Adminhtml_Renderer();
$fieldset->addField('type', 'text', array('name' => 'type'))->setRenderer($renderer);

где MM это наш неймспейс, Mymodule - имя модуля. А сам файл должен лежать по пути app/code/(local или community)/MM/Mymodule/Block/Adminhtml/Renderer.php
2. В блоке пишем нечто такое:
class MM_Mymodule_Block_Adminhtml_Renderer extends Mage_Adminhtml_Block_Template
        implements Varien_Data_Form_Element_Renderer_Interface {
    protected $_element;
    protected $_object;

    protected function _construct()
    {
        $this->setTemplate('mm_mymodule/fields.phtml'); // указываем темплейт в котором будут наши поля и яваскрипт
    }

    public function getObject() {
        if(!$this->_object) {
            if(!$this->_object= Mage::registry('object_data')){
                $this->_object= Mage::getModel('mymodule/modelname');
            }
        }
        return $this->_object;
    }
    public function getElement()
    {
        return $this->_element;
    }

    public function render(Varien_Data_Form_Element_Abstract $element)
    {
        $this->_element = $element;
        return $this->toHtml();

    }
}


3. Темплейт
Должен располагаться в adminhtml
<?php $objects = $this->getObject()->getTypes();?> // подбираем значения из объекта
<div id="objects_container">
<?php if( !$objects ): ?>
<?php else: ?>
    <div class="entry-edit-head">
    <h4 class="icon-head head-edit-form fieldset-legend"><?php echo Mage::helper('mymodule')->__('Assigned objects') ?></h4>
    </div>
    <?php foreach($objects->getItems() as $_item): ?> //поочередно выводим сохраненные значения
        <div class="fieldset fieldset-wide" id="mymodule_object_fieldset_<?php echo $_item->getId() ?>">
        <table cellspacing="0" class="form-list">
            <tr>
                <td class="label"><label for="object_<?php echo $_item->getId() ?>"><?php echo Mage::helper('mymodule')->__('objects Title:') ?> <span class="required">*</span></label></td>
                <td class="value"><input type="text" id="object_<?php echo $_item->getId() ?>" name="objects[<?php echo $_item->getId() ?>][title]" value="<?php echo $this->escapeHtml($_item->getObjectTitle()) ?>" class="input-text required-entry" /></td>
            </tr>
            <tr>
                <td class="label"><label for="object_value_<?php echo $_item->getId() ?>"><?php echo Mage::helper('mymodule')->__('value Count:') ?> <span class="required">*</span></label></td>
                <td class="value"><input type="text" id="object_value_<?php echo $_item->getId() ?>" name="objects[<?php echo $_item->getId() ?>][value]" value="<?php echo $_item->getValue() ?>" class="input-text required-entry validate-not-negative-number" />
                    <p class="a-left" style="margin:7px 0 0;"><button type="button" class="btn-button delete" onclick="objects.del(this)">Delete</button></p>
                </td>
             </tr>
        </table>
        <input type="hidden" id="id_mymodule_object_fieldset_<?php echo $_item->getId() ?>" value="<?php echo $_item->getId() ?>" />
        </div>
    <?php endforeach; ?>
<?php endif; ?>
</div>
<p class="a-right" style="margin:7px 0 0;"><button type="button" class="btn-button add" onclick="objects.add(this)">Add new</button></p>

<script type="text/javascript">
//<![CDATA[
    var lastId = 0;
    var objects = function() {
        return {
            del : function(obj) { //метод для удаления
                if( confirm('<?php echo Mage::helper('mymodule')->__('Are you sure you want to delete it?') ?>') ) {
                    fieldSet = obj.up('div.fieldset');
                    if( $('id_' + fieldSet.id) ) {
                        var itemId = $('id_' + fieldSet.id).value;
                        var newElement = document.createElement('input');
                        newElement.type = 'hidden';
                        newElement.value = itemId;
                        newElement.name = 'deleteobject[]';
                        $('objects_container').appendChild(newElement);
                    }
                    fieldSet.remove();
                }
            },

            add : function(obj) { //метод для добавления
                var newElement = document.createElement('div');
                newElement.innerHTML = this.getTemplate();
                $('objects_container').appendChild(newElement);
            },
///темплейт для добавления
            getTemplate : function() {
                var id = this.createId();
                return  '<div class="fieldset fieldset-wide" id="mymodule_object_fieldset_' + id + '">'
                       +'<table cellspacing="0" class="form-list">'
                       +'<tr>'
                       +    '<td class="label"><label for="object_' + id + '"><?php echo Mage::helper('mymodule')->__('objects Title:') ?> <span class="required">*</span></label><\/td>'
                       +    '<td class="value"><input type="text" id="object_' + id + '" name="objects[' + id + '][title]" value="" class="input-text required-entry" /><\/td>'
                       +'<\/tr>'
                       +'<tr>'
                       +    '<td class="label"><label for="object_value_' + id + '"><?php echo Mage::helper('mymodule')->__('objects Value:') ?> <span class="required">*</span></label><\/td>'
                       +    '<td class="value"><input type="text" id="object_value_' + id + '" name="objects[' + id + '][value]" value="0" class="input-text required-entry validate-not-negative-number" />'
                       +        '<p class="a-left" style="margin:7px 0 0;"><button type="button" class="btn-button delete" onclick="objects.del(this)">Delete</button></p>'
                       +'<\/td>'
                       +'<\/tr>'
                       +'<\/table>'
                       +'<input type="hidden" id="id_mymodule_object_fieldset_' + id + '" value="' + id + '" />'
                       +'<\/div>';
            },

            createId : function () {
                return --lastId;
            }
        }
    }();
//]]>
</script>

Код примерный и может не работать, но надеюсь смысл понятен

Поделиться темой: