Magento 2 Добавить новое поле в форму администратора Magento_User


11

Я ищу хороший подход с добавлением / обновлением уже подготовленной (по умолчанию) формы пользователя (модуля-пользователя) Magento. Форма доступна в админ панели по этому пути:

Система> Все пользователи> [selected_user]> Основная вкладка редактирования пользователя (Информация об учетной записи)

Теперь я пытаюсь использовать di.xml в моем пользовательском модуле, где я указываю зависимости: `

<preference for="Magento\User\Block\User\Edit\Tab\Main" type="Vendor_Name\Module_Name\Block\User\Edit\Tab\Main" />
<preference for="Magento\User\Block\Role\Grid\User" type="Vendor_Name\Module_Name\Block\Role\Grid\User" />

`

Это контент, который я уже сделал для класса Main.php

// @codingStandardsIgnoreFile

пространство имен Vendor_Name \ Module_Name \ Block \ User \ Edit \ Tab;

используйте \ Magento \ User \ Block \ User \ Edit \ Tab \ Main as UserEditMainTab;
use \ Magento \ Backend \ Block \ Template \ Context;
использовать \ Magento \ Framework \ Registry;
использовать \ Magento \ Framework \ Data \ FormFactory;
использовать \ Magento \ Backend \ Model \ Auth \ Session;
использовать \ Magento \ Framework \ Locale \ ListsInterface;

Класс Main расширяет UserEditMainTab
{
    публичная функция __construct (
        Context $ context,
        Registry $ Registry,
        FormFactory $ formFactory,
        Сессия $ authSession,
        ListsInterface $ localeLists,
        массив $ data = []
    ) {
        конструкция parent :: __ ($ context, $ registry, $ formFactory, $ authSession, $ localeLists, $ data);
    }

    защищенная функция _prepareForm ()
    {
        / ** @var $ model \ Magento \ Пользователь \ Модель \ Пользователь * /
        $ model = $ this -> _ coreRegistry-> registry ('permissions_user');

        / ** @var \ Magento \ Framework \ Data \ Form $ form * /
        $ form = $ this -> _ formFactory-> create ();
        $ Форма-> setHtmlIdPrefix ( 'user_');

        $ baseFieldset = $ form-> addFieldset ('base_fieldset', ['legend' => __ ('Account Information __ TEST')]);

        if ($ model-> getUserId ()) {
            $ baseFieldset-> addField ('user_id', 'hidden', ['name' => 'user_id']);
        } еще {
            if (! $ model-> hasData ('is_active')) {
                $ Модели-> setIsActive (1);
            }
        }

        $ BaseFieldset-> AddField (
            'User_image',
            'образ',
            [
                'name' => 'user_image',
                'label' => __ ('User Image'),
                'id' => 'user_image',
                'title' => __ ('User Image'),
                'required' => false,
                'note' => 'Разрешить тип изображения: jpg, jpeg, png'
            ]
        );

        $ BaseFieldset-> AddField (
            «Имя пользователя»,
            'текст',
            [
                'name' => 'username',
                'label' => __ ('Имя пользователя'),
                'id' => 'username',
                'title' => __ ('Имя пользователя'),
                'required' => true
            ]
        );

        $ BaseFieldset-> AddField (
            'Имя',
            'текст',
            [
                'name' => 'firstname',
                'label' => __ ('Имя'),
                'id' => 'firstname',
                'title' => __ ('Имя'),
                'required' => true
            ]
        );

        $ BaseFieldset-> AddField (
            'фамилия',
            'текст',
            [
                'name' => 'фамилия',
                'label' => __ ('Фамилия'),
                'id' => 'фамилия',
                'title' => __ ('Фамилия'),
                'required' => true
            ]
        );

        $ BaseFieldset-> AddField (
            'электронное письмо',
            'текст',
            [
                'name' => 'email',
                'label' => __ ('Email'),
                'id' => 'customer_email',
                'title' => __ ('Email пользователя'),
                'class' => 'required-entry validate-email',
                'required' => true
            ]
        );

        $ isNewObject = $ model-> isObjectNew ();
        if ($ isNewObject) {
            $ passwordLabel = __ ('Пароль');
        } еще {
            $ passwordLabel = __ ('Новый пароль');
        }
        $ translationLabel = __ («Подтверждение пароля»);
        $ this -> _ addPasswordFields ($ baseFieldset, $ passwordLabel, $ translationLabel, $ isNewObject);

        $ BaseFieldset-> AddField (
            'Interface_locale',
            'Выбрать',
            [
                'name' => 'interface_locale',
                'label' => __ ('Язык интерфейса'),
                'title' => __ ('Язык интерфейса'),
                'values' => $ this -> _ LocaleLists-> getTranslatedOptionLocales (),
                'class' => 'select'
            ]
        );

        if ($ this -> _ authSession-> getUser () -> getId ()! = $ model-> getUserId ()) {
            $ BaseFieldset-> AddField (
                'Is_active',
                'Выбрать',
                [
                    'name' => 'is_active',
                    'label' => __ ('Это аккаунт'),
                    'id' => 'is_active',
                    'title' => __ ('Статус аккаунта'),
                    'class' => 'input-select',
                    'options' => ['1' => __ ('Active'), '0' => __ ('Inactive')]
                ]
            );
        }

        $ baseFieldset-> addField ('user_roles', 'hidden', ['name' => 'user_roles', 'id' => '_user_roles']);

        $ currentUserVerificationFieldset = $ form-> addFieldset (
            'Current_user_verification_fieldset',
            ['legend' => __ ('Проверка подлинности текущего пользователя')]
        );
        $ CurrentUserVerificationFieldset-> AddField (
            самостоятельно :: CURRENT_USER_PASSWORD_FIELD,
            'пароль',
            [
                'name' => self :: CURRENT_USER_PASSWORD_FIELD,
                'label' => __ ('Ваш пароль'),
                'id' => self :: CURRENT_USER_PASSWORD_FIELD,
                'title' => __ ('Ваш пароль'),
                'class' => 'input-text validate-current-password required-entry',
                'required' => true
            ]
        );

        $ data = $ model-> getData ();
        снята с охраны ($ данных [ 'пароль']);
        снята с охраны ($ данных [само :: CURRENT_USER_PASSWORD_FIELD]);
        $ Форма-> setValues ​​($ данных);

        $ This-> Setform ($ форма);

        вернуть родителя :: _ prepareForm ();
    }
}

и немного кода для User.php

пространство имен Vendor_Name \ Module_Name \ Block \ Role \ Grid;

используйте \ Magento \ User \ Block \ Role \ Grid \ User в качестве RoleGridUser;
используйте \ Magento \ Backend \ Block \ Widget \ Grid \ Extended как ExtendedGrid;

Класс User расширяет RoleGridUser
{
    защищенная функция _prepareColumns ()
    {
        Родитель :: _ prepareCollection ();

        $ This-> addColumn (
            'User_image',
            [
                'header' => __ ('User Image'),
                'ширина' => 5,
                'align' => 'left',
                'сортируемый' => правда,
                'index' => 'user_image'
            ]
        );

        return ExtendedGrid :: _ prepareCollection ();
    }
}

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

К сожалению, я не вижу никаких изменений в администрировании. Конечно, необходимый столбец был добавлен скриптом InstallSchema ранее в таблицу ' admin_user '.

Содержимое каталогов в древовидном формате:

mODULE_NAME
Block── Блок
│ ├── Каталог
│ │ └── Продукт
│ │ └── RelatedPosts.php
│ ├── Роль
│ │ └── Сетка
│ │ └── User.php
│ └── Пользователь
Edit └── Править
Tab └── Вкладка
│ └── Main.php
Comp── composer.json
Etc── и т. Д.
│ ├── di.xml
│ └── module.xml
Setup── Настройка
    Install── InstallSchema.php

Что я сделал не так?


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

Ответы:


24

Для добавления поля изображения вы можете попробовать использовать плагин и всегда стараться избегать перезаписи всего класса.

Производитель / модуль / и т.д. / adminhtml / di.xml


<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\User\Block\User\Edit\Tab\Main">
        <plugin name="sr_stackexchange_user_form" type="Vendor\Module\Plugin\Block\Adminhtml\User\Edit\Tab\Main" sortOrder="1"/>
    </type>
</config>

Производитель / модуль / плагин / Block / Adminhtml / User / Edit / Tab / main.php


namespace Vendor\Module\Plugin\Block\Adminhtml\User\Edit\Tab;

class Main
{
    /**
     * Get form HTML
     *
     * @return string
     */
    public function aroundGetFormHtml(
        \Magento\User\Block\User\Edit\Tab\Main $subject,
        \Closure $proceed
    )
    {
        $form = $subject->getForm();
        if (is_object($form)) {
            $fieldset = $form->addFieldset('admin_user_image', ['legend' => __('User Image')]);
            $fieldset->addField(
                'user_image',
                'image',
                [
                    'name' => 'user_image',
                    'label' => __('Image'),
                    'id' => 'user_image',
                    'title' => __('Image'),
                    'required' => false,
                    'note' => 'Allow image type: jpg, jpeg, png'
                ]
            );

            $subject->setForm($form);
        }

        return $proceed();
    }
}

Очистить кэш.


Привет, Сохель, большое спасибо за ваш ответ! Кажется, это именно то, чего я хочу достичь :) Я дам вам отзыв, как только я попробую этот код локально. Кстати, я видел, что вы создаете новый набор полей, и я начинаю задумываться, возможно ли обновить уже существующее, например, base_fieldset, как вы думаете? Кроме того, мне любопытно, этот плагин-подход также охватывает обновление контроллеров? Мне нужно обновить некоторые мысли в будущем здесь: /module-user/Controller/Adminhtml/User/Save.php- сохранить строку с путем изображения в таблице 'admin_user'. Извините за многие вопросы. ценю твою помощь! ура!
Роб

Хорошо, возможно использовать плагин для контроллера, но в моем случае этого было недостаточно. В любом случае, ваши предложения помогут мне решить проблему. Спасибо еще раз!
Роб

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

Мне также было бы интересно узнать, как сохранить значение нового поля в форме пользователя-администратора в таблице admin_user. Вы решили это, расширяя / переопределяя /module-user/Controller/Adminhtml/User/Save.php Controller?
Hallleron

@ Sohel Rana, выбранное поле не покажет где? или как мы можем получить текущий идентификатор пользователя здесь?
SagarPPanchal

2

после некоторых исследований получили решение для этого

добавить новое свойство "значение" в методе addField

со значением, которое вам нужно. посмотрите пример:

        $fieldset->addField(
            'user_image',
            'image',
            [
                'name' => 'user_image',
                'label' => __('Image'),
                'id' => 'user_image',
                'title' => __('Image'),
                'value' => $value_that_you_need,
                'required' => false,
                'note' => 'Allow image type: jpg, jpeg, png'
            ]
        );

Я надеюсь, что это поможет некоторым из вас ..


2

Замена заявления

return parent::_prepareForm();

с этим

return \Magento\Backend\Block\Widget\Form\Generic::_prepareForm();

работал на меня. Вот полный код. Добавляем поле «Доступный магазин» следующим образом.

<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */

// @codingStandardsIgnoreFile

namespace [vendor]\[module]\Block\User\Edit\Tab;

use Magento\Framework\App\ObjectManager;
use Magento\Framework\Locale\OptionInterface;

/**
 * Cms page edit form main tab
 *
 * @SuppressWarnings(PHPMD.DepthOfInheritance)
 */
class Main extends \Magento\User\Block\User\Edit\Tab\Main
{

    /**
     * @param \Magento\Backend\Block\Template\Context $context
     * @param \Magento\Framework\Registry $registry
     * @param \Magento\Framework\Data\FormFactory $formFactory
     * @param \Magento\Backend\Model\Auth\Session $authSession
     * @param \Magento\Framework\Locale\ListsInterface $localeLists
     * @param array $data
     * @param OptionInterface $deployedLocales Operates with deployed locales.
     */

    public function __construct(
        \Magento\Backend\Block\Template\Context $context,
        \Magento\Framework\Registry $registry,
        \Magento\Framework\Data\FormFactory $formFactory,
        \Magento\Backend\Model\Auth\Session $authSession,
        \Magento\Framework\Locale\ListsInterface $localeLists,
        array $data = [],
        OptionInterface $deployedLocales = null
    ) {
        $this->deployedLocales = $deployedLocales
            ?: ObjectManager::getInstance()->get(OptionInterface::class);
        parent::__construct($context, $registry, $formFactory, $authSession, $localeLists, $data, $this->deployedLocales);
    }

    /**
     * Prepare form fields
     *
     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
     * @return \Magento\Backend\Block\Widget\Form
     */
    protected function _prepareForm()
    {
        //die('test');
        /** @var $model \Magento\User\Model\User */
        $model = $this->_coreRegistry->registry('permissions_user');

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

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

        if ($model->getUserId()) {
            $baseFieldset->addField('user_id', 'hidden', ['name' => 'user_id']);
        } else {
            if (!$model->hasData('is_active')) {
                $model->setIsActive(1);
            }
        }

        $baseFieldset->addField(
            'username',
            'text',
            [
                'name' => 'username',
                'label' => __('User Name'),
                'id' => 'username',
                'title' => __('User Name'),
                'required' => true
            ]
        );

        $baseFieldset->addField(
            'firstname',
            'text',
            [
                'name' => 'firstname',
                'label' => __('First Name'),
                'id' => 'firstname',
                'title' => __('First Name'),
                'required' => true
            ]
        );

        $baseFieldset->addField(
            'lastname',
            'text',
            [
                'name' => 'lastname',
                'label' => __('Last Name'),
                'id' => 'lastname',
                'title' => __('Last Name'),
                'required' => true
            ]
        );

        // Adding new field for Scope Access
        $baseFieldset->addField(
            'accessible_store',
            'select',
            [
                'name' => 'accessible_store',
                'label' => __('Accessible Store'),
                'id' => 'accessible_store',
                'title' => __('Accessible Store'),
                'class' => 'input-select',
                'options' => ['3' => __('Global Store'), 
                              '1' => __('Malaysia Pavillion'), 
                              '2' => __('Thailand Pavilion')],
                'required' => true
            ]
        );

        $baseFieldset->addField(
            'email',
            'text',
            [
                'name' => 'email',
                'label' => __('Email'),
                'id' => 'customer_email',
                'title' => __('User Email'),
                'class' => 'required-entry validate-email',
                'required' => true
            ]
        );

        $isNewObject = $model->isObjectNew();
        if ($isNewObject) {
            $passwordLabel = __('Password');
        } else {
            $passwordLabel = __('New Password');
        }
        $confirmationLabel = __('Password Confirmation');
        $this->_addPasswordFields($baseFieldset, $passwordLabel, $confirmationLabel, $isNewObject);

        $baseFieldset->addField(
            'interface_locale',
            'select',
            [
                'name' => 'interface_locale',
                'label' => __('Interface Locale'),
                'title' => __('Interface Locale'),
                'values' => $this->deployedLocales->getOptionLocales(),
                'class' => 'select'
            ]
        );

        if ($this->_authSession->getUser()->getId() != $model->getUserId()) {
            $baseFieldset->addField(
                'is_active',
                'select',
                [
                    'name' => 'is_active',
                    'label' => __('This account is'),
                    'id' => 'is_active',
                    'title' => __('Account Status'),
                    'class' => 'input-select',
                    'options' => ['1' => __('Active'), '0' => __('Inactive')]
                ]
            );
        }

        $baseFieldset->addField('user_roles', 'hidden', ['name' => 'user_roles', 'id' => '_user_roles']);

        $currentUserVerificationFieldset = $form->addFieldset(
            'current_user_verification_fieldset',
            ['legend' => __('Current User Identity Verification')]
        );
        $currentUserVerificationFieldset->addField(
            self::CURRENT_USER_PASSWORD_FIELD,
            'password',
            [
                'name' => self::CURRENT_USER_PASSWORD_FIELD,
                'label' => __('Your Password'),
                'id' => self::CURRENT_USER_PASSWORD_FIELD,
                'title' => __('Your Password'),
                'class' => 'input-text validate-current-password required-entry',
                'required' => true
            ]
        );

        $data = $model->getData();
        unset($data['password']);
        unset($data[self::CURRENT_USER_PASSWORD_FIELD]);
        $form->setValues($data);

        $this->setForm($form);

        //return parent::_prepareForm();
        return \Magento\Backend\Block\Widget\Form\Generic::_prepareForm();
    }

}

И спасибо @Rob за то, что поделились подсказкой, с чего начать.


2

Просто чтобы добавить еще один рабочий пример, мне удалось переписать страницу администрирования веб-сайта. Я пытался добавить поле URL на страницу редактирования сайта.

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

Кроме того, я использовал наследование для извлечения модели веб-сайта и извлечения текущего значения из базы данных, чтобы поместить его в форму (оно также скопировано из класса веб-сайта Magento).

Предварительно необходимо добавить столбец url в таблицу store_website базы данных magento.

Вот рабочий результат (протестирован в Magento 2.1):

<?php

namespace Vendor\Store\Plugin\Block\System\Store\Edit\Form;

class Website extends \Magento\Backend\Block\System\Store\Edit\Form\Website
{
    /**
     * Get form HTML
     *
     * @return string
     */
    public function aroundGetFormHtml(
        \Magento\Backend\Block\System\Store\Edit\Form\Website $subject,
        \Closure $proceed
    )
    {
        $form = $subject->getForm();
        if (is_object($form)) {

            // From \Magento\Backend\Block\System\Store\Edit\Form\Website :
            $websiteModel = $this->_coreRegistry->registry('store_data');
            $postData = $this->_coreRegistry->registry('store_post_data');
            if ($postData) {
                $websiteModel->setData($postData['website']);
            }

            // Fieldset name from \Magento\Backend\Block\System\Store\Edit\Form\Website
            $fieldset = $form->getElement('website_fieldset');
            $fieldset->addField(
                'website_url',
                'text',
                [
                    'name' => 'website[url]', // From \Magento\Backend\Block\System\Store\Edit\Form\Website
                    'label' => __('Website URL'),
                    'value' => $websiteModel->getData('url'),
                    'title' => __('Website URL'),
                    'required' => false
                ]
            );

            $subject->setForm($form);
        }

        return $proceed();
    }
}

И файл di.xml в каталоге Vendor / Store / etc / adminhtml (здесь нет ничего нового из проверенного ответа):

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\Backend\Block\System\Store\Edit\Form\Website">
        <plugin name="admin_website_plugin" type="Vendor\Store\Plugin\Block\System\Store\Edit\Form\Website" sortOrder="1"/>
    </type>
</config>

0

Я просто внес небольшое изменение в ваше решение, и оно сработало для меня:

class Main extends \Magento\Backend\Block\Widget\Form\Generic
{
//Copied All the code in --- Magento\User\Block\User\Edit\Tab\Main
//added my own field in _prepareForm function

}

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.