Magento 2 Magento_User yönetici formuna yeni alan ekle


11

Ekleme / güncelleme (varsayılan olarak) Magento Kullanıcı (modül-kullanıcı) formu zaten hazırlanmış iyi bir yaklaşım arıyorum. Forma şu yoldan yönetici panelinde ulaşılabilir:

Sistem> Tüm kullanıcılar> [seçilen_kullanıcı]> Kullanıcının ana düzenleme sekmesi (Hesap Bilgileri)

Şimdi bağımlılıkları belirlediğim özel modülümde di.xml kullanmaya çalışıyorum: `

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

'

Bu, Main.php sınıfı için daha önce yaptığım içerik

// @codingStandardsIgnoreFile

ad alanı Satıcı_Adı \ Modül_Adı \ Engelle \ Kullanıcı \ Düzenle \ Sekme;

UserEditMainTab olarak \ Magento \ User \ Block \ User \ Edit \ Tab \ Main kullanın;
\ Magento \ Backend \ Block \ Template \ Context;
\ Magento \ Framework \ Registry kullanın;
\ Magento \ Framework \ Data \ FormFactory kullanın;
\ Magento \ Backend \ Model \ Auth \ Session kullanın;
\ Magento \ Framework \ Locale \ ListsInterface kullanın;

sınıf Main, UserEditMainTab öğesini genişletir
{
    kamu işlevi __construct (
        Bağlam $ bağlam,
        Registry $ kayıt defteri,
        FormFactory $ formFactory,
        Oturum $ authSession,
        ListelerInterface $ localeLists,
        dizi $ verileri = []
    ) {
        parent :: __ construct ($ içerik, $ kayıt defteri, $ formFactory, $ authSession, $ localeLists, $ data);
    }

    korumalı işlev _prepareForm ()
    {
        / ** @var $ model \ Magento \ Kullanıcı \ Model \ Kullanıcı * /
        $ model = $ this -> _ coreRegistry-> kayıt defteri ('permissions_user');

        / ** @var \ Magento \ Framework \ Veri \ Form $ formu * /
        $ form = $ this -> _ formFactory-> create ();
        $ Form-> setHtmlIdPrefix ( 'Kullanıcı_');

        $ baseFieldset = $ form-> addFieldset ('base_fieldset', ['gösterge' => __ ('Hesap Bilgileri __ TEST')]);

        if ($ model-> getUserId ()) {
            $ baseFieldset-> addField ('kullanıcı_kimliği', 'gizli', ['ad' => 'kullanıcı_kimliği']);
        } Başka {
            if (! $ model-> hasData ('is_active')) {
                $ Modeli-> setIsActive (1);
            }
        }

        $ BaseFieldset-> AddField (
            'User_image',
            'İmage',
            [
                'name' => 'user_image',
                'label' => __ ('Kullanıcı Resmi'),
                'id' => 'kullanıcı_görüntüsü',
                'title' => __ ('Kullanıcı Resmi'),
                'zorunlu' => yanlış,
                'note' => 'Görüntü türüne izin ver: jpg, jpeg, png'
            ]
        );

        $ BaseFieldset-> AddField (
            'Kullanıcı adı',
            'Metin',
            [
                'name' => 'kullanıcı adı',
                'label' => __ ('Kullanıcı Adı'),
                'id' => 'kullanıcı adı',
                'title' => __ ('Kullanıcı Adı'),
                'required' => true
            ]
        );

        $ BaseFieldset-> AddField (
            'İsim',
            'Metin',
            [
                'name' => 'ad',
                'label' => __ ('Ad'),
                'id' => 'ad',
                'title' => __ ('Ad'),
                'required' => true
            ]
        );

        $ BaseFieldset-> AddField (
            'Soyadı',
            'Metin',
            [
                'name' => 'soyadı',
                'label' => __ ('Soyadı'),
                'id' => 'soyadı',
                'title' => __ ('Soyadı'),
                'required' => true
            ]
        );

        $ BaseFieldset-> AddField (
            'Email',
            'Metin',
            [
                'name' => 'e-posta',
                'label' => __ ('E-posta'),
                'id' => 'customer_email',
                'title' => __ ('Kullanıcı E-postası'),
                'class' => 'zorunlu giriş validate-email',
                'required' => true
            ]
        );

        $ isNewObject = $ model-> isObjectNew ();
        if ($ isNewObject) {
            $ passwordLabel = __ ('Şifre');
        } Başka {
            $ passwordLabel = __ ('Yeni Şifre');
        }
        $ confirmationLabel = __ ('Şifre Onayı');
        $ this -> _ addPasswordFields ($ baseFieldset, $ passwordLabel, $ confirmationLabel, $ isNewObject);

        $ BaseFieldset-> AddField (
            'İnterface_locale',
            'Seçeneğini',
            [
                'name' => 'interface_locale',
                'label' => __ ('Arayüz Yerel Ayarı'),
                'title' => __ ('Arayüz Yerel Ayarı'),
                'değerleri' => $ this -> _ LocaleLists-> getTranslatedOptionLocales (),
                'class' => 'select'
            ]
        );

        if ($ this -> _ authSession-> getUser () -> getId ()! = $ model-> getUserId ()) {
            $ BaseFieldset-> AddField (
                'aktif',
                'Seçeneğini',
                [
                    'name' => 'is_active',
                    'label' => __ ('Bu hesap'),
                    'id' => 'is_active',
                    'title' => __ ('Hesap Durumu'),
                    'class' => 'input-select',
                    'options' => ['1' => __ ('Etkin'), '0' => __ ('Etkin değil')]
                ]
            );
        }

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

        $ currentUserVerificationFieldset = $ form-> addFieldset (
            'Current_user_verification_fieldset',
            ['legend' => __ ('Mevcut Kullanıcı Kimliği Doğrulaması')]
        );
        $ CurrentUserVerificationFieldset-> AddField (
            öz :: CURRENT_USER_PASSWORD_FIELD,
            'parola',
            [
                'name' => self :: CURRENT_USER_PASSWORD_FIELD,
                'label' => __ ('Parolanız'),
                'id' => self :: CURRENT_USER_PASSWORD_FIELD,
                'title' => __ ('Parolanız'),
                'class' => 'giriş-metin validate-current-password required-entry',
                'required' => true
            ]
        );

        $ data = $ model-> getData ();
        sertleşmemiş ($ verileri [ 'şifre']);
        unset ($ veri [öz :: CURRENT_USER_PASSWORD_FIELD]);
        $ Form-> setValues ​​($ data);

        $ This-> setForm ($ formu);

        dönüş üst öğesi :: _ preparForm ();
    }
}

ve User.php için bazı kodlar

ad alanı Satıcı_Adı \ Modül_Adı \ Engelle \ Rol \ Izgara;

\ Magento \ Kullanıcı \ Engelle \ Rol \ Izgara \ Kullanıcı'yı RoleGridUser olarak kullanın;
\ Magento \ Backend \ Block \ Widget \ Grid \ ExtendedGrid olarak Genişletilmiş;

sınıfı Kullanıcı RoleGridUser'ı genişletir
{
    korumalı işlev _prepareColumns ()
    {
        üst :: _ prepareCollection ();

        $ This-> addColumn (
            'User_image',
            [
                'header' => __ ('Kullanıcı Resmi'),
                'genişlik' => 5,
                'align' => 'left',
                'sıralanabilir' => doğru,
                'index' => 'user_image'
            ]
        );

        dönüş ExtendedGrid :: _ preparCollection ();
    }
}

Daha yakından bakarsanız, şimdi kullanıcının resmiyle bir alan eklemeye çalışıyorum.

Ne yazık ki, yönetici cephesinde herhangi bir değişiklik görmüyorum. Elbette, gerekli sütun InstallSchema betiği tarafından daha önce ' admin_user ' tablosuna eklenmiştir .

Ağaç biçimindeki dizinlerin içeriği:

Modül Adı
├── Engelle
├── ├── Katalog
└── │ └── Ürün
P │ └── RelatedPosts.php
├── ├── Rolü
│ │ └── Izgara
. │ └── User.php
└── └── Kullanıcı
└── └── Düzenle
└── └── Sekmesi
. └── Main.php
├── composer.json
├── vb.
│ ├── di.xml
│ └── module.xml
├── Kurulum
    └── InstallSchema.php

Neyi yanlış yaptım?


Yukarıdaki çözüm harika ama değerler eklenmiş alanlarda ayarlanmadı .. aynı şeyleri yapmamız gereken başka bir şey var mı? Temel olarak Yorumlar formunu geçersiz kılıyoruz. Şimdiden teşekkürler ..
Büyük Hint Beyin

Yanıtlar:


24

Görüntü alanı eklemek için eklentiyi kullanmayı deneyebilir ve her zaman tüm sınıfın üzerine yazmayı önleyebilirsiniz.

Satıcı / Modül / 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>

Satıcı / Modül / Eklenti / Blok / Adminhtml / Kullanıcı / Düzenleme / 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();
    }
}

Önbelleği temizle.


Hey Sohel, cevabınız için çok teşekkürler! Tam olarak ne elde etmek istiyorum gibi görünüyor :) Bu kodu yerel olarak denediğiniz anda size geri bildirim vereceğim. Bu arada, yeni alan kümesi oluşturduğunuzu gördüm ve zaten var olanı güncellemenin mümkün olup olmadığını merak etmeye başladım, örneğin 'base_fieldset', ne düşünüyorsun? Ayrıca, merak ediyorum, bu eklenti yaklaşımı denetleyicileri de güncelliyor mu? Gelecekte bazı düşüncelerini burada güncellemek gerekir: /module-user/Controller/Adminhtml/User/Save.php- 'admin_user' tablodaki görüntü yolu ile dize kaydedin. Birçok soru için özür dilerim. yardımınıza minnettar olurum! şerefe!
Rob

Tamam, bir kontrolör için eklenti kullanmak mümkündür, ancak benim durumumda bu yeterli değildi. Her neyse, önerileriniz bir sorunu çözmeme yardımcı oluyor. Tekrar teşekkürler!
Rob

Yukarıdaki çözüm harika ama değerler eklenmiş alanlarda ayarlanmadı .. aynı şeyleri yapmamız gereken başka bir şey var mı? Temel olarak Yorumlar formunu geçersiz kılıyoruz. Şimdiden teşekkürler ..
Büyük Hint Beyin

Ayrıca yönetici kullanıcı formunda yeni bir alanın değerini admin_user tablosuna nasıl kaydedeceğinizi de merak ediyorum. /Module-user/Controller/Adminhtml/User/Save.php Denetleyicisini genişleterek / geçersiz kılmayı çözdünüz mü?
hallleron

@Sohel Rana, seçilen alan nerede gösterilmeyecek? veya mevcut kullanıcı kimliğini nasıl alabiliriz?
SagarPPanchal

2

bazı araştırmalar bunun için bir çözüm bulduktan sonra

addField yönteminde yeni özellik "değer" ekle

ihtiyacınız olan değerle. örneğe bakın:

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

Umarım bazılarına yardımcı olur ..


2

İfadenin değiştirilmesi

return parent::_prepareForm();

Bununla

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

benim için çalıştı. İşte tam kod. "Erişilebilir Mağaza" alanını aşağıdaki gibi ekleme.

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

}

Ve nereden başlayacağınıza dair ipucunu paylaştığınız için @Rob'a teşekkür ederiz.


2

Başka bir çalışan örnek eklemek için, Web sitesi yönetici sayfasının üzerine yazmayı başardım. Web sitesi düzenleme sayfasına bir URL alanı eklemeye çalışıyordum.

Doğrulanmış cevapta söylediklerini aynen yaptım ama yeni bir alan kümesi eklemedim. Bunun yerine, Web Sitesi sınıfında tanımlanan kimliği kullanarak mevcut olanı tamamladım.

Ayrıca, web sitesi modelini almak ve formun içine koymak için geçerli değeri veritabanından almak için miras kullandım (Magento Web sitesi sınıfından da kopyalanır).

Önkoşul olarak, magento veritabanının store_website tablosuna 'url' sütununu eklemeniz gerekir.

İşte çalışma sonucu (Magento 2.1'de test edilmiştir):

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

Ve Satıcı / Mağaza / etc / adminhtml dizinindeki di.xml dosyası (burada doğrulanmış cevaptan yeni bir şey yok):

<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

Çözümünüzde küçük bir değişiklik yaptım ve bu benim için çalıştı:

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

}

İsterseniz, tüm çözümü gönderebilirim - ancak revize etmeliyim çünkü şirket normlarıma göre kodu herkese açık forumlarda gösteremiyorum. Sadece kendiniz yapabiliyorsanız bunu bize bildirin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.