Magento 2 Переопределение пользовательского модуля - PullRequest
0 голосов
/ 01 марта 2019

Итак, в общем, я пытаюсь переопределить сторонний модуль, чтобы включить дополнительное раскрывающееся меню в пользовательском интерфейсе администратора

Вот файл стороннего производителя в Prince / Productattach / Block / Adminhtml / Productattach / Edit /Tab / Main.php

namespace Prince\Productattach\Block\Adminhtml\Productattach\Edit\Tab;

 /**
 *Class Main
 *@package Prince\Productattach\Block\Adminhtml\Productattach\Edit\Tab
 */

 class Main extends \Magento\Backend\Block\Widget\Form\Generic implements 
 \Magento\Backend\Block\Widget\Tab\TabInterface
    {
/**
 * @var \Magento\Store\Model\System\Store
 */
private  $systemStore;

/**
 * @var \Magento\Customer\Model\ResourceModel\Group\Collection
 */
private $customerCollection;

/**
 * Main constructor.
 * @param \Magento\Backend\Block\Template\Context $context
 * @param \Magento\Framework\Registry $registry
 * @param \Magento\Framework\Data\FormFactory $formFactory
 * @param \Magento\Store\Model\System\Store $systemStore
 * @param \Magento\Customer\Model\ResourceModel\Group\Collection $customerCollection
 * @param array $data
 */
public function __construct(
    \Magento\Backend\Block\Template\Context $context,
    \Magento\Framework\Registry $registry,
    \Magento\Framework\Data\FormFactory $formFactory,
    \Magento\Store\Model\System\Store $systemStore,
    \Magento\Customer\Model\ResourceModel\Group\Collection $customerCollection,
    array $data = []
) {
    $this->_systemStore = $systemStore;
    $this->_customerCollection = $customerCollection;
    parent::__construct($context, $registry, $formFactory, $data);
}

/**
 * Prepare form
 *
 * @return $this
 */
public function _prepareForm()
{

    $model = $this->_coreRegistry->registry('productattach');

    /*
     * Checking if user have permissions to save information
     */
    if ($this->_isAllowedAction('Prince_Productattach::save')) {
        $isElementDisabled = false;
    } else {
        $isElementDisabled = true;
    }

    /** @var \Magento\Framework\Data\Form $form */
    $form = $this->_formFactory->create();

    $form->setHtmlIdPrefix('productattach_main_');

    $fieldset = $form->addFieldset(
        'base_fieldset',
        ['legend' => __('Attachment Information')]
    );

    $customerGroup = $this->customerCollection->toOptionArray();

    if ($model->getId()) {
        $fieldset->addField('productattach_id', 'hidden', ['name' => 'productattach_id']);
    }

    $fieldset->addField(
        'name',
        'text',
        [
            'name' => 'name',
            'label' => __('Attachment Name'),
            'title' => __('Attachment Name'),
            'required' => true,
            'disabled' => $isElementDisabled
        ]
    );

    $fieldset->addField(
        'description',
        'textarea',
        [
            'name' => 'description',
            'label' => __('Description'),
            'title' => __('Description'),
            'disabled' => $isElementDisabled
        ]
    );

    $fieldset->addField(
        'files',
        'file',
        [
            'name' => 'file',
            'label' => __('File'),
            'title' => __('File'),
            'required' => false,
            'note' => 'File size must be less than 2 Mb.', // TODO: show ACCTUAL file-size
            'disabled' => $isElementDisabled
        ]
    );

    $fieldset->addType(
        'uploadedfile',
        \Prince\Productattach\Block\Adminhtml\Productattach\Renderer\FileIconAdmin::class
    );

    $fieldset->addField(
        'file',
        'uploadedfile',
        [
            'name'  => 'uploadedfile',
            'label' => __('Uploaded File'),
            'title' => __('Uploaded File'),

        ]
    );

    $fieldset->addField(
        'url',
        'text',
        [
            'name' => 'url',
            'label' => __('URL'),
            'title' => __('URL'),
            'required' => false,
            'disabled' => $isElementDisabled,
            'note' => 'Upload file or Enter url'
        ]
    );

    $fieldset->addField(
        'customer_group',
        'multiselect',
        [
            'name' => 'customer_group[]',
            'label' => __('Customer Group'),
            'title' => __('Customer Group'),
            'required' => true,
            'value' => [0,1,2,3], // todo: preselect ALL customer groups, not just 0-3
            'values' => $customerGroup,
            'disabled' => $isElementDisabled
        ]
    );

    $fieldset->addField(
        'store',
        'multiselect',
        [
            'name' => 'store[]',
            'label' => __('Store'),
            'title' => __('Store'),
            'required' => true,
            'value' => [0],
            'values' => $this->systemStore->getStoreValuesForForm(false, true),
            'disabled' => $isElementDisabled
        ]
    );

    $fieldset->addField(
        'active',
        'select',
        [
            'name' => 'active',
            'label' => __('Active'),
            'title' => __('Active'),
            'value' => 1,
            'options' => ['1' => __('Yes'), '0' => __('No')],
            'disabled' => $isElementDisabled
        ]
    );

    $this->_eventManager->dispatch('adminhtml_productattach_edit_tab_main_prepare_form', ['form' => $form]);

    if ($model->getId()) {
        $form->setValues($model->getData());
    }

    $this->setForm($form);

    return parent::_prepareForm();
}

/**
 * Prepare label for tab
 *
 * @return string
 */
public function getTabLabel()
{
    return __('Attachment Information');
}

/**
 * Prepare title for tab
 *
 * @return string
 */
public function getTabTitle()
{
    return __('Attachment Information');
}

/**
 * {@inheritdoc}
 */
public function canShowTab()
{
    return true;
}

/**
 * {@inheritdoc}
 */
public function isHidden()
{
    return false;
}

/**
 * Check permission for passed action
 *
 * @param string $resourceId
 * @return bool
 */
public function _isAllowedAction($resourceId)
{
    return $this->_authorization->isAllowed($resourceId);
}
}

У меня есть настройки модуля и мой di.xml, настроенный с обычным плюсом ниже, чтобы переопределить класс.

<preference for="Prince\Productattach\Block\Adminhtml\Productattach\Edit\Tab" type="Vendor\Filecategory\Block\Adminhtml\Productattach\Edit\Tab"/>

тогда и точная копиякласс с пространством имен и моим дополнительным полем, добавленным в Vendor / Filecategory / Block / Adminhtml / Productattach / Edit / Tab / Main.php

namespace Vendor\Filecategory\Block\Adminhtml\Productattach\Edit\Tab;

use \Prince\Productattach\Block\Adminhtml\Productattach\Edit\Tab\Main as Main;


 class MainExt extends Main
 {
/**
 * @var \Magento\Store\Model\System\Store
 */
private  $systemStore;

/**
 * @var \Magento\Customer\Model\ResourceModel\Group\Collection
 */
private $customerCollection;

/**
 * Main constructor.
 * @param \Magento\Backend\Block\Template\Context $context
 * @param \Magento\Framework\Registry $registry
 * @param \Magento\Framework\Data\FormFactory $formFactory
 * @param \Magento\Store\Model\System\Store $systemStore
 * @param \Magento\Customer\Model\ResourceModel\Group\Collection $customerCollection
 * @param array $data
 */
public function __construct(
    \Magento\Backend\Block\Template\Context $context,
    \Magento\Framework\Registry $registry,
    \Magento\Framework\Data\FormFactory $formFactory,
    \Magento\Store\Model\System\Store $systemStore,
    \Magento\Customer\Model\ResourceModel\Group\Collection $customerCollection,
    array $data = []
) {
    $this->systemStore = $systemStore;
    $this->customerCollection = $customerCollection;
    parent::__construct($context, $registry, $formFactory, $data, $systemStore);
}

/**
 * Prepare form
 *
 * @return $this
 */
public function _prepareForm()
{

    $model = $this->_coreRegistry->registry('productattach');

    /*
     * Checking if user have permissions to save information
     */
    if ($this->_isAllowedAction('Prince_Productattach::save')) {
        $isElementDisabled = false;
    } else {
        $isElementDisabled = true;
    }

    /** @var \Magento\Framework\Data\Form $form */
    $form = $this->_formFactory->create();

    $form->setHtmlIdPrefix('productattach_main_');

    $fieldset = $form->addFieldset(
        'base_fieldset',
        ['legend' => __('Attachment Information')]
    );

    $customerGroup = $this->customerCollection->toOptionArray();

    if ($model->getId()) {
        $fieldset->addField('productattach_id', 'hidden', ['name' => 'productattach_id']);
    }

    $fieldset->addField(
        'name',
        'text',
        [
            'name' => 'name',
            'label' => __('Attachment Name'),
            'title' => __('Attachment Name'),
            'required' => true,
            'disabled' => $isElementDisabled
        ]
    );

    $fieldset->addField(
        'Category',
        'select',
        [
            'name' => 'Category',
            'label' => __('Category'),
            'title' => __('Category'),
            'value' => 0,
            'options' => ['0' => __('Technical Specification'), '1' => __('Installation Instructions')],
        ]
    );

    $fieldset->addField(
        'description',
        'textarea',
        [
            'name' => 'description',
            'label' => __('Description'),
            'title' => __('Description'),
            'disabled' => $isElementDisabled
        ]
    );

    $fieldset->addField(
        'files',
        'file',
        [
            'name' => 'file',
            'label' => __('File'),
            'title' => __('File'),
            'required' => false,
            'note' => 'File size must be less than 2 Mb.', // TODO: show ACCTUAL file-size
            'disabled' => $isElementDisabled
        ]
    );

    $fieldset->addType(
        'uploadedfile',
        \Prince\Productattach\Block\Adminhtml\Productattach\Renderer\FileIconAdmin::class
    );

    $fieldset->addField(
        'file',
        'uploadedfile',
        [
            'name'  => 'uploadedfile',
            'label' => __('Uploaded File'),
            'title' => __('Uploaded File'),

        ]
    );

    $fieldset->addField(
        'url',
        'text',
        [
            'name' => 'url',
            'label' => __('URL'),
            'title' => __('URL'),
            'required' => false,
            'disabled' => $isElementDisabled,
            'note' => 'Upload file or Enter url'
        ]
    );

    $fieldset->addField(
        'customer_group',
        'multiselect',
        [
            'name' => 'customer_group[]',
            'label' => __('Customer Group'),
            'title' => __('Customer Group'),
            'required' => true,
            'value' => [0,1,2,3], // todo: preselect ALL customer groups, not just 0-3
            'values' => $customerGroup,
            'disabled' => $isElementDisabled
        ]
    );

    $fieldset->addField(
        'store',
        'multiselect',
        [
            'name' => 'store[]',
            'label' => __('Store'),
            'title' => __('Store'),
            'required' => true,
            'value' => [0],
            'values' => $this->systemStore->getStoreValuesForForm(false, true),
            'disabled' => $isElementDisabled
        ]
    );

    $fieldset->addField(
        'active',
        'select',
        [
            'name' => 'active',
            'label' => __('Active'),
            'title' => __('Active'),
            'value' => 1,
            'options' => ['1' => __('Yes'), '0' => __('No')],
            'disabled' => $isElementDisabled
        ]
    );

    $this->_eventManager->dispatch('adminhtml_productattach_edit_tab_main_prepare_form', ['form' => $form]);

    if ($model->getId()) {
        $form->setValues($model->getData());
    }

    $this->setForm($form);

    return parent::_prepareForm();
}

/**
 * Prepare label for tab
 *
 * @return string
 */
public function getTabLabel()
{
    return __('Attachment Information');
}

/**
 * Prepare title for tab
 *
 * @return string
 */
public function getTabTitle()
{
    return __('Attachment Information');
}

/**
 * {@inheritdoc}
 */
public function canShowTab()
{
    return true;
}

/**
 * {@inheritdoc}
 */
public function isHidden()
{
    return false;
}

/**
 * Check permission for passed action
 *
 * @param string $resourceId
 * @return bool
 */
public function _isAllowedAction($resourceId)
{
    return $this->_authorization->isAllowed($resourceId);
}
}

Однако я получаю сообщение об ошибке

Incompatible argument type: Required type: \Magento\Store\Model\System\Store. Actual type: array; 

Iпробовал очистить кеш и переиндексировать, но не повезло.Пожалуйста, может кто-нибудь сказать мне, что я здесь делаю не так?Также с удовольствием выслушаю любые альтернативные способы завершить одно и то же.

Заранее спасибо.

1 Ответ

0 голосов
/ 04 марта 2019

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

https://magento.stackexchange.com/questions/174209/magento-2-add-new-field-to-magento-user-admin-form

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...