Magento 2 Додайте нове поле до форми адміністратора Magento_User


11

Я шукаю гарний підхід із додаванням / оновленням вже підготовленої (за замовчуванням) форми Magento 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 \ Користувач \ Блок \ Користувач \ Редагувати \ Вкладку \ Main як UserEditMainTab;
використовувати \ Magento \ Backend \ Block \ Template \ Context;
використовувати \ Magento \ Framework \ Реєстр;
використовувати \ Magento \ Framework \ Дані \ FormFactory;
використовувати \ Magento \ Backend \ Модель \ Auth \ Session;
використовувати \ Magento \ Framework \ Locale \ ListsInterface;

клас Main розширює UserEditMainTab
{
    публічна функція __construct (
        Контекст $ контексту,
        Реєстр $ реєстру,
        FormFactory $ formFactory,
        Сесія $ authСесія,
        СпискиІнтерфейс $ localeLists,
        масив $ data = []
    ) {
        батьківська конструкція :: __ ($ контекст, $ реєстр, $ формаFactory, $ authSession, $ localeLists, $ data);
    }

    захищена функція _prepareForm ()
    {
        / ** @var $ модель \ Magento \ Користувач \ Модель \ Користувач * /
        $ model = $ this -> _ coreRegistry-> register ('permissions_user');

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

        $ baseFieldset = $ form-> addFieldset ('base_fieldset', ['legend' => __ ('Інформація про рахунок __ TEST')]);

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

        $ baseFieldset-> addField (
            'user_image',
            "зображення",
            [
                'name' => 'user_image',
                'label' => __ ('Зображення користувача'),
                'id' => 'user_image',
                'title' => __ ('Зображення користувача'),
                'потрібно' => помилково,
                'note' => 'Дозволити тип зображення: jpg, jpeg, png'
            ]
        );

        $ baseFieldset-> addField (
            "ім'я користувача",
            "текст",
            [
                'ім'я' => 'ім'я користувача',
                'label' => __ ('Ім'я користувача'),
                'id' => 'ім'я користувача',
                'title' => __ ('Ім'я користувача'),
                'обов'язково' => вірно
            ]
        );

        $ baseFieldset-> addField (
            'ім'я',
            "текст",
            [
                'ім'я' => 'ім'я',
                'label' => __ ('Ім'я'),
                'id' => 'ім'я',
                'title' => __ ('Ім'я'),
                'обов'язково' => вірно
            ]
        );

        $ baseFieldset-> addField (
            'прізвище',
            "текст",
            [
                'ім'я' => 'прізвище',
                'label' => __ ('Прізвище'),
                'id' => 'прізвище',
                'title' => __ ('Прізвище'),
                'обов'язково' => вірно
            ]
        );

        $ baseFieldset-> addField (
            "електронна пошта",
            "текст",
            [
                'name' => 'email',
                'label' => __ ('Електронна пошта'),
                'id' => 'customer_email',
                'title' => __ ('Електронна адреса користувача'),
                'class' => 'обов'язковий запис для підтвердження електронної пошти',
                'обов'язково' => вірно
            ]
        );

        $ isNewObject = $ model-> isObjectNew ();
        if ($ isNewObject) {
            $ passwordLabel = __ ('Пароль');
        } else {
            $ passwordLabel = __ ("Новий пароль");
        }
        $ proofLabel = __ ('Підтвердження пароля');
        $ this -> _ addPasswordFields ($ baseFieldset, $ passwordLabel, $ підтвердженняLabel, $ 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' => __ ('неактивний')]
                ]
            );
        }

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

        $ currentUserVerificationFieldset = $ form-> addFieldset (
            'current_user_verification_fieldset',
            ['legend' => __ ('Поточна перевірка ідентичності користувача')]
        );
        $ currentUserVerificationFieldset-> addField (
            self :: CURRENT_USER_PASSWORD_FIELD,
            "пароль",
            [
                'name' => self :: CURRENT_USER_PASSWORD_FIELD,
                'label' => __ ("Ваш пароль"),
                'id' => self :: CURRENT_USER_PASSWORD_FIELD,
                'title' => __ ('Ваш пароль'),
                'class' => 'введення тексту, необхідний для введення тексту-поточного пароля',
                'обов'язково' => вірно
            ]
        );

        $ data = $ model-> getData ();
        unset ($ data ['пароль'));
        unset ($ data [self :: CURRENT_USER_PASSWORD_FIELD]);
        $ form-> setValues ​​($ дані);

        $ this-> setForm ($ форма);

        повернення батьків :: _ readyForm ();
    }
}

і деякий код для User.php

простір імен Vendor_Name \ Module_Name \ Block \ Role \ Grid;

використовувати \ Magento \ Користувач \ Блок \ Роль \ Grid \ Користувач як RoleGridUser;
використовувати \ Magento \ Backend \ Block \ Widget \ Grid \ Extended як ExtendedGrid;

Користувач класу розширює RoleGridUser
{
    захищена функція _prepareColumns ()
    {
        батьківська: _ підготовкаCollection ();

        $ this-> addColumn (
            'user_image',
            [
                'header' => __ ('Зображення користувача'),
                'ширина' => 5,
                'align' => 'зліва',
                'sortable' => правда,
                'index' => 'user_image'
            ]
        );

        повернути ExtendedGrid :: _ PrepaCollection ();
    }
}

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

На жаль, я не бачу змін у фронті адміністратора. Звичайно, потрібний стовпець був доданий сценарієм InstallSchema раніше до таблиці ' admin_user '.

Зміст каталогів у деревоподібному форматі:

Ім'я модуля
├── Блок
│ ├── Каталог
│ │ └── Товар
│ │ └── RelatedPosts.php
│ ├── Роль
│ │ └── Сітка
│ │ └── User.php
│ └── Користувач
│ └── Редагувати
│ └── табл
│ └── Main.php
├── composer.json
├── тощо
│ ├── di.xml
│ └── module.xml
├── Налаштування
    └── InstallSchema.php

Що я зробив не так?


Наведене вище рішення є чудовим, але значення не встановлюються на доданих полях. Є ще щось, що нам потрібно зробити на тому ж самому. Ми в основному змінюємо форму Відгуки. Дякую заздалегідь ..
Great Indian Brain

Відповіді:


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>

Постачальник / Модуль / Плагін / Блок / Adminhtml / Користувач / Редагувати / Вкладка / 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?
галлерон

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

2

після деяких досліджень отримав рішення для цього

додати нову властивість "value" у методі 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 до сторінки редагування веб-сайту.

Я зробив саме те, що сказано у підтвердженій відповіді, але я не додав новий набір полів. Натомість я доповнив існуючий, використовуючи його id, визначений у класі веб-сайтів.

Крім того, я використав спадщину для отримання моделі веб-сайту та отримання поточного значення з бази даних, щоб помістити його всередину форми (також скопійовано з класу веб-сайту 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.