Magento 2 Tambahkan bidang baru ke formulir admin Magento_User

11

Saya mencari pendekatan yang baik dengan add / update yang sudah disiapkan (secara default) formulir Magento Pengguna (modul-pengguna). Formulir dapat dihubungi di panel admin dengan jalur ini:

Sistem> Semua pengguna> [terpilih_ pengguna]> Tab edit utama pengguna (Informasi Akun)

Sekarang saya mencoba menggunakan di.xml dalam modul khusus saya tempat saya menentukan dependensi: `

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

`

Ini adalah konten yang telah saya buat untuk kelas Main.php

// @codingStandardsIgnoreFile

namespace Vendor_Name \ Module_Name \ Block \ User \ Edit \ Tab;

gunakan \ Magento \ Pengguna \ Blok \ Pengguna \ Edit \ Tab \ Main sebagai UserEditMainTab;
gunakan \ Magento \ Backend \ Block \ Template \ Context;
gunakan \ Magento \ Framework \ Registry;
gunakan \ Magento \ Framework \ Data \ FormFactory;
gunakan \ Magento \ Backend \ Model \ Auth \ Session;
gunakan \ Magento \ Framework \ Locale \ ListsInterface;

kelas Utama meluas UserEditMainTab
{
    fungsi publik __construct (
        Konteks $ konteks,
        Registri $ pendaftaran,
        FormFactory $ formFactory,
        Sesi $ authSession,
        DaftarInterface $ lokalDaftar,
        array $ data = []
    ) {
        parent :: __ construct ($ context, $ registry, $ formFactory, $ authSession, $ localeLists, $ data);
    }

    fungsi yang dilindungi _prepareForm ()
    {
        / ** @var $ model \ Magento \ Pengguna \ Model \ Pengguna * /
        $ 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' => __ ('Informasi Akun __ TEST')]);

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

        $ baseFieldset-> addField (
            'user_image',
            'gambar',
            [
                'name' => 'user_image',
                'label' => __ ('Gambar Pengguna'),
                'id' => 'user_image',
                'title' => __ ('Gambar Pengguna'),
                'wajib' => salah,
                'note' => 'Izinkan jenis gambar: jpg, jpeg, png'
            ]
        );

        $ baseFieldset-> addField (
            'nama pengguna',
            'teks',
            [
                'name' => 'username',
                'label' => __ ('Nama Pengguna'),
                'id' => 'nama pengguna',
                'title' => __ ('Nama Pengguna'),
                'wajib' => benar
            ]
        );

        $ baseFieldset-> addField (
            'nama depan',
            'teks',
            [
                'name' => 'firstname',
                'label' => __ ('Nama Depan'),
                'id' => 'firstname',
                'title' => __ ('Nama Depan'),
                'wajib' => benar
            ]
        );

        $ baseFieldset-> addField (
            'nama keluarga',
            'teks',
            [
                'name' => 'lastname',
                'label' => __ ('Nama Belakang'),
                'id' => 'nama belakang',
                'title' => __ ('Nama Belakang'),
                'wajib' => benar
            ]
        );

        $ baseFieldset-> addField (
            'surel',
            'teks',
            [
                'name' => 'email',
                'label' => __ ('Email'),
                'id' => 'customer_email',
                'title' => __ ('Email Pengguna'),
                'class' => 'wajib-entri validasi-email',
                'wajib' => benar
            ]
        );

        $ isNewObject = $ model-> isObjectNew ();
        if ($ isNewObject) {
            $ passwordLabel = __ ('Kata Sandi');
        } lain {
            $ passwordLabel = __ ('Kata Sandi Baru');
        }
        $ confirmLabel = __ ('Konfirmasi Kata Sandi');
        $ this -> _ addPasswordFields ($ baseFieldset, $ passwordLabel, $ confirmLabel, $ isNewObject);

        $ baseFieldset-> addField (
            'interface_locale',
            'Pilih',
            [
                'name' => 'interface_locale',
                'label' => __ ('Antarmuka Antarmuka'),
                'title' => __ ('Interface Interface'),
                'values' => $ this -> _ LocaleLists-> getTranslatedOptionLocales (),
                'class' => 'select'
            ]
        );

        if ($ this -> _ authSession-> getUser () -> getId ()! = $ model-> getUserId ()) {
            $ baseFieldset-> addField (
                'aktif',
                'Pilih',
                [
                    'name' => 'is_active',
                    'label' => __ ('Akun ini adalah'),
                    'id' => 'is_active',
                    'title' => __ ('Status Akun'),
                    'class' => 'input-select',
                    'options' => ['1' => __ ('Aktif'), '0' => __ ('Tidak Aktif')]
                ]
            );
        }

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

        $ currentUserVerificationFieldset = $ form-> addFieldset (
            'current_user_verification_fieldset',
            ['legend' => __ ('Verifikasi Identitas Pengguna Saat Ini')]
        );
        $ currentUserVerificationFieldset-> addField (
            self :: CURRENT_USER_PASSWORD_FIELD,
            'kata sandi',
            [
                'name' => self :: CURRENT_USER_PASSWORD_FIELD,
                'label' => __ ('Kata Sandi Anda'),
                'id' => self :: CURRENT_USER_PASSWORD_FIELD,
                'title' => __ ('Kata Sandi Anda'),
                'class' => 'input-teks validate-current-password required-entry',
                'wajib' => benar
            ]
        );

        $ data = $ model-> getData ();
        tidak disetel ($ data ['kata sandi']);
        tidak disetel ($ data [mandiri :: CURRENT_USER_PASSWORD_FIELD]);
        $ form-> setValues ​​($ data);

        $ this-> setForm ($ form);

        return parent :: _ prepForm ();
    }
}

dan beberapa kode untuk User.php

namespace Vendor_Name \ Module_Name \ Block \ Role \ Grid;

gunakan \ Magento \ User \ Block \ Role \ Grid \ User sebagai RoleGridUser;
gunakan \ Magento \ Backend \ Block \ Widget \ Grid \ Extended sebagai ExtendedGrid;

kelas Pengguna memperluas RoleGridUser
{
    fungsi terproteksi _prepareColumns ()
    {
        parent :: _ prepacollection ();

        $ this-> addColumn (
            'user_image',
            [
                'header' => __ ('Gambar Pengguna'),
                'width' => 5,
                'sejajarkan' => 'kiri',
                'sortable' => true,
                'index' => 'user_image'
            ]
        );

        return ExtendedGrid :: _ persiapanCollection ();
    }
}

Jika Anda melihat lebih dekat, Anda sekarang sudah mencoba menambahkan bidang dengan gambar pengguna.

Sayangnya, saya tidak melihat perubahan apa pun di depan admin. Tentu saja, kolom yang diperlukan ditambahkan oleh skrip InstallSchema sebelumnya ke tabel ' admin_user '.

Isi direktori dalam format seperti pohon:

Module_Name
├── Blokir
│ ├── Katalog
│ │ └── Produk
│ │ └── RelatedPosts.php
│ ├── Peran
│ │ └── Kotak
│ │ └── User.php
│ └── Pengguna
│ └── Edit
│ └── Tab
│ └── Main.php
├── composer.json
├── dll
│ ├── di.xml
│ └── module.xml
├── Pengaturan
    └── InstallSchema.php

Apa kesalahan yang telah aku perbuat?

rampok
sumber
Solusi di atas bagus tetapi nilainya tidak disetel pada bidang yang ditambahkan .. apakah ada hal lain yang perlu kita lakukan pada hal yang sama. Kami pada dasarnya mengganti formulir Ulasan. Terima kasih sebelumnya ..
Otak India Hebat

Jawaban:

24

Untuk menambahkan bidang gambar, Anda dapat mencoba menggunakan plugin dan selalu berusaha untuk tidak menimpa seluruh kelas.

Vendor / Module / 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>

Vendor / Modul / Plugin / Blok / Adminhtml / Pengguna / 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();
    }
}

Kosongkan cache.

Sohel Rana
sumber
Hai Sohel, terima kasih banyak atas tanggapan Anda! Tampaknya tepat apa yang ingin saya capai :) Saya akan memberi Anda umpan balik segera setelah saya mencoba kode ini secara lokal. Ngomong-ngomong, saya melihat bahwa Anda membuat fieldset baru dan saya mulai bertanya-tanya apakah mungkin untuk memperbarui yang sudah ada, misalnya 'base_fieldset', bagaimana menurut Anda? Saya juga penasaran, apakah pendekatan plugin ini juga mencakup pembaruan pengontrol? Saya perlu memperbarui beberapa pemikiran di masa depan di sini: /module-user/Controller/Adminhtml/User/Save.php- simpan string dengan jalur gambar di tabel 'admin_user'. Maaf tentang banyak pertanyaan. hargai bantuan Anda! Bersulang!
Rob
Ok, mungkin untuk menggunakan plugin untuk controller, tetapi dalam kasus saya itu tidak cukup. Bagaimanapun, saran Anda membantu saya untuk menyelesaikan masalah. Terima kasih sekali lagi!
Rob
Solusi di atas bagus tetapi nilainya tidak disetel pada bidang yang ditambahkan .. apakah ada hal lain yang perlu kita lakukan pada hal yang sama. Kami pada dasarnya mengganti formulir Ulasan. Terima kasih sebelumnya ..
Otak India Hebat
Saya juga akan tertarik pada cara menyimpan nilai bidang baru di formulir pengguna admin ke tabel admin_user. Apakah Anda mengatasinya dengan memperluas / menimpa /module-user/Controller/Adminhtml/User/Save.php Controller?
hallleron
@Sohel Rana, bidang yang dipilih tidak akan menunjukkan di mana? atau bagaimana cara mendapatkan id pengguna saat ini di sini?
SagarPPanchal
2

setelah beberapa penelitian mendapat solusi untuk ini

tambahkan "nilai" properti baru dalam metode addField

dengan nilai yang Anda butuhkan. lihat contohnya:

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

Saya harap ini akan membantu beberapa dari Anda ..

tal shulgin
sumber
2

Mengganti pernyataan

return parent::_prepareForm();

dengan ini

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

bekerja untukku. Ini kode lengkapnya. Menambahkan bidang "Toko yang Dapat Diakses" sebagai berikut.

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

}

Dan terima kasih @Rob untuk berbagi petunjuk mulai dari mana.

saiid
sumber
2

Hanya untuk menambahkan contoh kerja lain, saya telah berhasil menimpa halaman admin Situs Web. Saya mencoba menambahkan bidang URL ke halaman edit situs web.

Saya melakukan persis apa yang dikatakan dalam jawaban yang divalidasi tetapi saya tidak menambahkan bidang baru. Alih-alih, saya telah menyelesaikan yang sudah ada, menggunakan id yang didefinisikan di kelas Situs web.

Selain itu, saya menggunakan warisan untuk mengambil model situs web dan mengambil nilai saat ini dari database untuk memasukkannya ke dalam formulir (Ini juga disalin dari kelas Situs Web Magento).

Dalam prasyarat, diperlukan untuk menambahkan kolom 'url' di tabel store_website dari database magento.

Ini hasil kerjanya (diuji di 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();
    }
}

Dan file di.xml di direktori Vendor / Store / etc / adminhtml (tidak ada yang baru di sini dari jawaban yang divalidasi):

<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>
Anthony BONNIER
sumber
0

Saya baru saja melakukan perubahan kecil pada solusi Anda dan itu berhasil untuk saya:

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

}

Jika Anda mau, saya dapat memposting seluruh solusi - tetapi saya harus merevisinya karena sesuai norma perusahaan saya, saya tidak dapat menampilkan kode di forum publik. Jadi beri tahu saya jika Anda bisa melakukannya sendiri.

Abid Malik
sumber