Magento 2将新字段添加到Magento_User管理表单


11

我正在寻找一种添加/更新(默认情况下)Magento用户(模块用户)表单的好方法。可以通过以下路径在管理面板中访问表单:

系统>所有用户> [chosen_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作为UserEditMainTab;
使用\ 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,
        注册表$ registry,
        FormFactory $ formFactory,
        会话$ authSession,
        ListsInterface $ localeLists,
        数组$ data = []
    ){
        parent :: __ construct($ context,$ registry,$ formFactory,$ authSession,$ localeLists,$ data);
    }

    受保护的函数_prepareForm()
    {
        / ** @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 __ TEST')]);;

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

        $ baseFieldset-> addField(
            'user_image',
            '图片',
            [
                '名称'=>'用户图片',
                'label'=> __('User Image'),
                'id'=>'user_image',
                'title'=> __('User Image'),
                'required'=>否,
                'note'=>'允许图像类型:jpg,jpeg,png'
            ]
        );

        $ baseFieldset-> addField(
            '用户名',
            '文本',
            [
                '名称'=>'用户名',
                '标签'=> __('用户名'),
                'id'=>'用户名',
                '标题'=> __('用户名'),
                '必需'=> true
            ]
        );

        $ baseFieldset-> addField(
            '名字',
            '文本',
            [
                '名称'=>'名字',
                '标签'=> __('名字'),
                'id'=>'名字',
                '标题'=> __('名字'),
                '必需'=> true
            ]
        );

        $ baseFieldset-> addField(
            '姓',
            '文本',
            [
                '名称'=>'姓氏',
                '标签'=> __('姓氏'),
                'id'=>'姓氏',
                '标题'=> __('姓氏'),
                '必需'=> true
            ]
        );

        $ baseFieldset-> addField(
            '电子邮件',
            '文本',
            [
                '名称'=>'电子邮件',
                '标签'=> __('电子邮件'),
                'id'=>'customer_email',
                '标题'=> __('用户电子邮件'),
                'class'=>'required-entry validate-email',
                '必需'=> true
            ]
        );

        $ isNewObject = $ model-> isObjectNew();
        如果($ isNewObject){
            $ passwordLabel = __('Password');
        }其他{
            $ passwordLabel = __('新密码');
        }
        $ confirmationLabel = __('密码确认');
        $ this-> _ addPasswordFields($ baseFieldset,$ passwordLabel,$ confirmationLabel,$ isNewObject);

        $ baseFieldset-> addField(
            'interface_locale',
            '选择',
            [
                '名称'=>'interface_locale',
                '标签'=> __('接口语言环境'),
                'title'=> __('Interface Locale'),
                '值'=> $ this-> _ LocaleLists-> getTranslatedOptionLocales(),
                'class'=>'选择'
            ]
        );

        如果($ this-> _ authSession-> getUser()-> getId()!= $ model-> getUserId()){
            $ baseFieldset-> addField(
                '活跃',
                '选择',
                [
                    '名称'=>'is_active',
                    '标签'=> __('此帐户为'),
                    'id'=>'is_active',
                    '标题'=> __('帐户状态'),
                    '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(
            自我:: CURRENT_USER_PASSWORD_FIELD,
            '密码',
            [
                '名称'=> self :: CURRENT_USER_PASSWORD_FIELD,
                '标签'=> __('您的密码'),
                'id'=> self :: CURRENT_USER_PASSWORD_FIELD,
                '标题'=> __('您的密码'),
                'class'=>'输入文本验证当前密码必填项',
                '必需'=> true
            ]
        );

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

        $ this-> setForm($ form);

        返回parent :: _ 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()
    {
        parent :: _ prepareCollection();

        $ this-> addColumn(
            'user_image',
            [
                'header'=> __('User Image'),
                '宽度'=> 5,
                'align'=>'left',
                'sortable'=>是,
                '索引'=>'用户图片'
            ]
        );

        返回ExtendedGrid :: _ prepareCollection();
    }
}

如果您仔细看一下,现在您已经在尝试添加带有用户图像的字段。

不幸的是,我看不到管理员的任何变化。当然,所需的列是先前由InstallSchema脚本添加到“ admin_user ”表中的。

树状格式的目录内容:

模块名称
├──座
│├──目录
││└──产品
││└──RelatedPosts.php
│├──角色
││└──网格
││└──User.php
│└──用户
│└──编辑
│└──标签
│└──Main.php
├──composer.json
├──等
│├──di.xml
│└──module.xml
├──设置
    └──InstallSchema.php

我做错什么了?


上面的解决方案很好,但是没有在添加的字段上设置值。我们基本上是覆盖评论表单。在此先感谢..
伟大的印度大脑

Answers:


24

要添加图像字段,您可以尝试使用插件,并且始终尝试避免覆盖整个类。

供应商/模块/etc/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用户表单中新字段的值保存到admin_user表感兴趣。您是否解决了扩展/覆盖/module-user/Controller/Adminhtml/User/Save.php控制器的问题?
hallleron '18

@Sohel Rana,选定字段不会显示在哪里?或者我们如何在这里获取当前用户ID?
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();

为我工作。这是完整的代码。如下添加字段“ Accessible Store”。

<?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完成了现有的ID。

此外,我使用继承来检索网站模型,并从数据库中检索当前值以将其放入表单中(它也是从Magento网站类中复制的)。

前提条件是,需要在magento数据库的store_website表中添加“ URL”列。

这是工作结果(在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();
    }
}

以及Vendor / Store / etc / adminhtml目录中的di.xml文件(经过验证的答案中的最新内容):

<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

}

如果您愿意,我可以发布整个解决方案-但我必须对其进行修改,因为根据我公司的规范,我无法在公共论坛上显示该代码。因此,请让我知道您是否可以自己做。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.