Magento 2 Thêm trường mới vào mẫu quản trị viên Magento_User


11

Tôi đang tìm kiếm một cách tiếp cận tốt với biểu mẫu thêm / cập nhật đã được chuẩn bị (theo mặc định) Magento User (người dùng mô-đun). Có thể truy cập biểu mẫu trong bảng quản trị theo đường dẫn này:

Hệ thống> Tất cả người dùng> [chọn_user]> tab chỉnh sửa chính của người dùng (Thông tin tài khoản)

Bây giờ tôi đang thử sử dụng di.xml trong mô-đun tùy chỉnh của mình, nơi tôi chỉ định các phụ thuộc: `

<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" />

`

Đây là nội dung mà tôi đã tạo cho lớp Main.php

// @codingStiteriasIgnoreFile

không gian tên Vendor_Name \ Module_Name \ Block \ User \ Edit \ Tab;

sử dụng \ Magento \ Người dùng \ Chặn \ Người dùng \ Chỉnh sửa \ Tab \ Chính là Người dùngEditMainTab;
sử dụng \ Magento \ Backend \ Block \ Template \ Context;
sử dụng \ Magento \ Framework \ Registry;
sử dụng \ Magento \ Framework \ Data \ FormFactory;
sử dụng \ Magento \ Backend \ Model \ Auth \ Phiên;
sử dụng \ Magento \ Framework \ Locale \ ListsInterface;

lớp Chính mở rộng UserEditMainTab
{
    chức năng công cộng __construct (
        Bối cảnh $ bối cảnh,
        Đăng ký $ đăng ký,
        FormFactory $ formFactory,
        Phiên $ authSession,
        ListsInterface $ localeLists,
        mảng $ data = []
    ) {
        cha mẹ :: __ xây dựng ($ bối cảnh, $ registry, $ formFactory, $ authSession, $ localeLists, $ data);
    }

    hàm được bảo vệ _prepareForm ()
    {
        / ** @var $ model \ Magento \ Người dùng \ Người mẫu \ Người dùng * /
        $ model = $ this -> _ coreRegistry-> registry ('allow_user');

        / ** @var \ Magento \ Framework \ Dữ liệu \ Biểu mẫu $ * /
        $ form = $ this -> _ formFactory-> create ();
        $ form-> setHtmlIdPrefix ('user_');

        $ baseFieldset = $ form-> addFieldset ('base_fieldset', ['Legend' => __ ('Thông tin tài khoản __ TEST')]);

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

        $ baseFieldset-> addField (
            'user_image',
            'hình ảnh',
            [
                'tên' => 'user_image',
                'nhãn' => __ ('Hình ảnh người dùng'),
                'id' => 'user_image',
                'tiêu đề' => __ ('Hình ảnh người dùng'),
                'bắt buộc' => sai,
                'ghi chú' => 'Cho phép loại hình ảnh: jpg, jpeg, png'
            ]
        );

        $ baseFieldset-> addField (
            'tên tài khoản',
            'bản văn',
            [
                'tên' => 'tên người dùng',
                'nhãn' => __ ('Tên người dùng'),
                'id' => 'tên người dùng',
                'tiêu đề' => __ ('Tên người dùng'),
                'bắt buộc' => đúng
            ]
        );

        $ baseFieldset-> addField (
            'tên đầu tiên',
            'bản văn',
            [
                'tên' => 'tên đầu tiên',
                'nhãn' => __ ('Tên'),
                'id' => 'tên đầu tiên',
                'tiêu đề' => __ ('Tên'),
                'bắt buộc' => đúng
            ]
        );

        $ baseFieldset-> addField (
            'họ'
            'bản văn',
            [
                'tên' => 'họ',
                'nhãn' => __ ('Họ'),
                'id' => 'họ',
                'tiêu đề' => __ ('Họ'),
                'bắt buộc' => đúng
            ]
        );

        $ baseFieldset-> addField (
            'e-mail',
            'bản văn',
            [
                'tên' => 'email',
                'nhãn' => __ ('Email'),
                'id' => 'customer_email',
                'tiêu đề' => __ ('Email người dùng'),
                'class' => 'email xác thực mục nhập bắt buộc',
                'bắt buộc' => đúng
            ]
        );

        $ isNewObject = $ model-> isObjectNew ();
        if ($ isNewObject) {
            $ passwordLabel = __ ('Mật khẩu');
        } khác {
            $ passwordLabel = __ ('Mật khẩu mới');
        }
        $ ConfirmLabel = __ ('Xác nhận mật khẩu');
        $ this -> _ addPasswordFields ($ baseFieldset, $ passwordLabel, $ ConfirmLabel, $ isNewObject);

        $ baseFieldset-> addField (
            'interface_locale',
            'lựa chọn',
            [
                'tên' => 'interface_locale',
                'nhãn' => __ ('Địa điểm giao diện'),
                'title' => __ ('Địa điểm giao diện'),
                'giá trị' => $ this -> _ LocaleLists-> getTranslatedOptionLocales (),
                'lớp' => 'chọn'
            ]
        );

        if ($ this -> _ authSession-> getUser () -> getId ()! = $ model-> getUserId ()) {
            $ baseFieldset-> addField (
                'đang hoạt động',
                'lựa chọn',
                [
                    'tên' => 'is_active',
                    'nhãn' => __ ('Tài khoản này là'),
                    'id' => 'is_active',
                    'tiêu đề' => __ ('Trạng thái tài khoản'),
                    'class' => 'input-select',
                    'tùy chọn' => ['1' => __ ('Hoạt động'), '0' => __ ('Không hoạt động')]
                ]
            );
        }

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

        $ currentUserVerifyingFieldset = $ form-> addFieldset (
            'current_user_verification_fieldset',
            ['Legend' => __ ('Xác minh danh tính người dùng hiện tại')]
        );
        $ currentUserVerifyingFieldset-> addField (
            tự :: CURRENT_USER_PASSWORD_FIELD,
            'mật khẩu',
            [
                'tên' => tự :: CURRENT_USER_PASSWORD_FIELD,
                'nhãn' => __ ('Mật khẩu của bạn'),
                'id' => tự :: CURRENT_USER_PASSWORD_FIELD,
                'title' => __ ('Mật khẩu của bạn'),
                'class' => 'nhập văn bản xác thực-hiện tại-mật khẩu bắt buộc nhập',
                'bắt buộc' => đúng
            ]
        );

        $ data = $ model-> getData ();
        bỏ đặt ($ data ['password']);
        bỏ đặt ($ data [self :: CURRENT_USER_PASSWORD_FIELD]);
        $ form-> setValues ​​($ data);

        $ this-> setForm ($ form);

        trả về cha mẹ :: _ readyForm ();
    }
}

và một số mã cho User.php

không gian tên Vendor_Name \ Module_Name \ Block \ Vai trò \ Lưới;

sử dụng \ Magento \ Người dùng \ Chặn \ Vai trò \ Lưới \ Người dùng làm Vai tròGridUser;
sử dụng \ Magento \ Backend \ Block \ Widget \ Grid \ Extended dưới dạng ExtendedGrid;

lớp Người dùng mở rộng RoleGridUser
{
    hàm được bảo vệ _prepareColumns ()
    {
        cha mẹ :: _ readyCollection ();

        $ this-> addColumn (
            'user_image',
            [
                'tiêu đề' => __ ('Hình ảnh người dùng'),
                'chiều rộng' => 5,
                'căn chỉnh' => 'trái',
                'sắp xếp' => đúng,
                'chỉ mục' => 'user_image'
            ]
        );

        trả về ExtendedGrid :: _ readyCollection ();
    }
}

Nếu bây giờ bạn nhìn kỹ hơn thì tôi đang cố thêm một trường bằng hình ảnh của người dùng.

Thật không may, tôi không thấy bất kỳ thay đổi nào trong mặt trận quản trị. Tất nhiên, cột cần thiết đã được thêm bởi tập lệnh InstallSchema trước đó vào bảng ' admin_user '.

Nội dung của các thư mục trong một định dạng giống như cây:

Module_ Tên
├── Chặn
Danh mục
│ └── Sản phẩm
│ └── Liên quanPosts.php
├── Vai trò
│ └── Lưới
User │ └── Người dùng.php
└── Người dùng
└── Chỉnh sửa
└── Tab
│ └── Main.php
├── composer.json
├── vv
│ ├── di.xml
Mô-đun
├── Cài đặt
    └── InstallSchema.php

Tôi đã làm gì sai?


Giải pháp trên là tuyệt vời nhưng các giá trị không được đặt trên các trường được thêm vào .. đó là bất cứ điều gì khác chúng ta cần phải làm trên cùng. Chúng tôi về cơ bản ghi đè lên mẫu Nhận xét. Cảm ơn trước ..
Bộ não vĩ đại của Ấn Độ

Câu trả lời:


24

Để thêm trường hình ảnh, bạn có thể thử sử dụng plugin và luôn cố gắng tránh ghi đè cả lớp.

Nhà cung cấp / Mô-đun / 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>

Nhà cung cấp / Mô-đun / Plugin / Chặn / adminhtml / Người dùng / Chỉnh sửa / 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();
    }
}

Xóa bộ nhớ cache.


Này Sohel, cảm ơn rất nhiều vì phản hồi của bạn! Dường như chính xác những gì tôi muốn đạt được :) Tôi sẽ cung cấp cho bạn thông tin phản hồi ngay khi tôi thử mã này tại địa phương. Nhân tiện, tôi thấy rằng bạn tạo ra bộ trường mới và tôi bắt đầu tự hỏi liệu có thể cập nhật cái đã có sẵn hay không, ví dụ 'base_fieldset', bạn nghĩ sao? Ngoài ra, tôi tò mò, cách tiếp cận plugin này có bao gồm các bộ điều khiển cập nhật không? Tôi cần cập nhật một số suy nghĩ trong tương lai tại đây: /module-user/Controller/Adminhtml/User/Save.php- lưu chuỗi với đường dẫn của hình ảnh trong bảng 'admin_user'. Xin lỗi về nhiều câu hỏi. đánh giá cao sự giúp đỡ của bạn! chúc mừng
Cướp

Ok, có thể sử dụng plugin cho bộ điều khiển, nhưng trong trường hợp của tôi là không đủ. Dù sao, đề nghị của bạn giúp tôi giải quyết một vấn đề. Cảm ơn bạn một lần nữa!
Cướp

Giải pháp trên là tuyệt vời nhưng các giá trị không được đặt trên các trường được thêm vào .. đó là bất cứ điều gì khác chúng ta cần phải làm trên cùng. Chúng tôi về cơ bản ghi đè lên mẫu Nhận xét. Cảm ơn trước ..
Bộ não vĩ đại của Ấn Độ

Tôi cũng sẽ quan tâm đến cách lưu giá trị của một trường mới trong biểu mẫu người dùng quản trị vào bảng admin_user. Bạn đã giải quyết nó mở rộng / ghi đè Bộ điều khiển /module-user/Controll/Adminhtml/User/Save.php chưa?
hallleron

@Sohel Rana, trường được chọn sẽ không hiển thị ở đâu? hoặc làm thế nào để chúng ta có thể lấy id người dùng hiện tại ở đây?
SagarPPanchal

2

sau khi một số nghiên cứu có một giải pháp cho việc này

thêm "giá trị" thuộc tính mới trong phương thức addField

với giá trị bạn cần. xem ví dụ:

        $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'
            ]
        );

Tôi hy vọng nó sẽ giúp một số bạn ..


2

Thay thế tuyên bố

return parent::_prepareForm();

Với cái này

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

đã làm cho tôi. Đây là mã hoàn chỉnh. Thêm trường "Cửa hàng có thể truy cập" như sau.

<?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();
    }

}

Và cảm ơn @Rob đã chia sẻ manh mối bắt đầu từ đâu.


2

Chỉ cần thêm một ví dụ hoạt động khác, tôi đã thành công trong việc ghi đè trang quản trị trang web. Tôi đã cố gắng thêm một trường URL vào trang chỉnh sửa trang web.

Tôi đã làm chính xác những gì nó đã nói trong câu trả lời được xác thực nhưng tôi đã không thêm một trường mới. Thay vào đó, tôi đã hoàn thành cái hiện có, sử dụng id được xác định trong lớp Trang web.

Ngoài ra, tôi đã sử dụng tính kế thừa để truy xuất mô hình trang web và truy xuất giá trị hiện tại từ cơ sở dữ liệu để đặt nó vào trong biểu mẫu (Nó cũng được sao chép từ lớp Trang web Magento).

Trong điều kiện tiên quyết, cần thêm cột 'url' trong bảng store_website của cơ sở dữ liệu magento.

Đây là kết quả làm việc (được thử nghiệm trong 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();
    }
}

Và tệp di.xml trong thư mục Vendor / Store / etc / adminhtml (không có gì mới ở đây từ câu trả lời được xác thực):

<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

Tôi chỉ thực hiện một thay đổi nhỏ trong giải pháp của bạn và nó đã có hiệu quả với tôi:

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

}

Nếu bạn muốn, tôi có thể đăng toàn bộ giải pháp - nhưng tôi phải sửa lại vì theo định mức công ty của tôi, tôi không thể hiển thị mã trên các diễn đàn công cộng. Vì vậy, chỉ cần cho tôi biết nếu bạn có thể tự làm điều đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.