Magento 2 Aggiungi un nuovo campo al modulo di amministrazione Magento_User


11

Sto cercando un buon approccio con aggiungi / aggiorna già preparato (di default) il modulo Magento User (modulo-utente). Il modulo è raggiungibile nel pannello di amministrazione da questo percorso:

Sistema> Tutti gli utenti> [chosen_user]> scheda di modifica principale dell'utente (Informazioni sull'account)

Ora sto provando con l'utilizzo di di.xml nel mio modulo personalizzato in cui specifico le dipendenze: `

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

`

Questo è il contenuto che ho già creato per una classe Main.php

// @codingStandardsIgnoreFile

namespace Nome fornitore \ Nome modulo \ Blocco \ Utente \ Modifica \ Scheda;

usa \ Magento \ Utente \ Blocca \ Utente \ Modifica \ Scheda \ Principale come UserEditMainTab;
usa \ Magento \ Backend \ Block \ Template \ Context;
usa \ Magento \ Framework \ Registry;
usa \ Magento \ Framework \ Data \ FormFactory;
usa \ Magento \ Backend \ Model \ Auth \ Session;
usa \ Magento \ Framework \ Locale \ ListsInterface;

class Main estende UserEditMainTab
{
    funzione pubblica __construct (
        Context $ context,
        Registro $ registro,
        FormFactory $ formFactory,
        Sessione $ authSession,
        ListsInterface $ localeLists,
        array $ data = []
    ) {
        genitore :: __ costrutto ($ context, $ register, $ formFactory, $ authSession, $ localeLists, $ data);
    }

    funzione protetta _prepareForm ()
    {
        / ** @var $ model \ Magento \ User \ Model \ User * /
        $ model = $ this -> _ coreRegistry-> register ('autorizzazioni_utente');

        / ** @var \ Magento \ Framework \ Data \ Form $ form * /
        $ form = $ this -> _ formFactory-> create ();
        $ Form-> setHtmlIdPrefix ( 'user_');

        $ baseFieldset = $ form-> addFieldset ('base_fieldset', ['legend' => __ ('Informazioni account __ TEST')]);

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

        $ BaseFieldset-> addField (
            'User_image',
            'Immagine',
            [
                'name' => 'user_image',
                'label' => __ ('Immagine utente'),
                'id' => 'user_image',
                'title' => __ ('Immagine utente'),
                'richiesto' => falso,
                'note' => 'Consenti tipo di immagine: jpg, jpeg, png'
            ]
        );

        $ BaseFieldset-> addField (
            'nome utente',
            'testo',
            [
                'name' => 'username',
                'label' => __ ('Nome utente'),
                'id' => 'nome utente',
                'title' => __ ('Nome utente'),
                'richiesto' => vero
            ]
        );

        $ BaseFieldset-> addField (
            'nome di battesimo',
            'testo',
            [
                'name' => 'firstname',
                'label' => __ ('Nome'),
                'id' => 'firstname',
                'title' => __ ('Nome'),
                'richiesto' => vero
            ]
        );

        $ BaseFieldset-> addField (
            'cognome',
            'testo',
            [
                'name' => 'lastname',
                'label' => __ ('Cognome'),
                'id' => 'lastname',
                'title' => __ ('Cognome'),
                'richiesto' => vero
            ]
        );

        $ BaseFieldset-> addField (
            'e-mail',
            'testo',
            [
                'name' => 'email',
                'label' => __ ('Email'),
                'id' => 'customer_email',
                'title' => __ ('Email utente'),
                'class' => 'email di validazione della voce obbligatoria',
                'richiesto' => vero
            ]
        );

        $ isNewObject = $ model-> isObjectNew ();
        if ($ isNewObject) {
            $ passwordLabel = __ ('Password');
        } altro {
            $ passwordLabel = __ ('Nuova password');
        }
        $ confirmLabel = __ ('Conferma password');
        $ this -> _ addPasswordFields ($ baseFieldset, $ passwordLabel, $ confirmLabel, $ isNewObject);

        $ BaseFieldset-> addField (
            'Interface_locale',
            'Selezionare',
            [
                'name' => 'interface_locale',
                'label' => __ ('Localizzazione interfaccia'),
                'title' => __ ('Localizzazione interfaccia'),
                'valori' => $ questo -> _ LocaleLists-> getTranslatedOptionLocales (),
                'class' => 'select'
            ]
        );

        if ($ this -> _ authSession-> getUser () -> getId ()! = $ model-> getUserId ()) {
            $ BaseFieldset-> addField (
                'è attivo',
                'Selezionare',
                [
                    'name' => 'is_active',
                    'label' => __ ('Questo account è'),
                    'id' => 'is_active',
                    'title' => __ ('Stato account'),
                    'class' => 'input-select',
                    'options' => ['1' => __ ('Active'), '0' => __ ('Inattivo')]
                ]
            );
        }

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

        $ currentUserVerificationFieldset = $ form-> addFieldset (
            'Current_user_verification_fieldset',
            ['legenda' => __ ('Verifica dell'identità dell'utente corrente')]
        );
        $ CurrentUserVerificationFieldset-> addField (
            self :: CURRENT_USER_PASSWORD_FIELD,
            'parola d'ordine',
            [
                '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',
                'richiesto' => vero
            ]
        );

        $ data = $ model-> getData ();
        unset ($ data [ 'password']);
        unset ($ data [self :: CURRENT_USER_PASSWORD_FIELD]);
        $ Form-> setValues ​​($ data);

        $ This-> setForm ($ form);

        return parent :: _ preparForm ();
    }
}

e del codice per User.php

namespace Vendor_Name \ Module_Name \ Block \ Role \ Grid;

usa \ Magento \ Utente \ Blocca \ Ruolo \ Griglia \ Utente come RoleGridUser;
usa \ Magento \ Backend \ Block \ Widget \ Grid \ Extended come ExtendedGrid;

class L'utente estende RoleGridUser
{
    funzione protetta _prepareColumns ()
    {
        parent :: _ prepareCollection ();

        $ This-> addColumn (
            'User_image',
            [
                'header' => __ ('Immagine utente'),
                'larghezza' => 5,
                'align' => 'left',
                'ordinabile' => vero,
                'index' => 'user_image'
            ]
        );

        return ExtendedGrid :: _ preparazioneCollection ();
    }
}

Se ti dai un'occhiata più da vicino, ora che sto cercando di aggiungere un campo con l'immagine dell'utente.

Sfortunatamente, non vedo cambiamenti nel fronte dell'amministratore. Naturalmente, la colonna necessaria è stata aggiunta dallo script InstallSchema in precedenza alla tabella ' admin_user '.

Contenuti delle directory in un formato ad albero:

nome_modulo
├── Blocco
│ ├── Catalogo
│ │ └── Prodotto
│ │ └── RelatedPosts.php
│ ├── Ruolo
│ │ └── Griglia
│ │ └── User.php
│ └── Utente
│ └── Modifica
│ └── Tab
│ └── Main.php
├── composer.json
├── ecc
│ ├── di.xml
│ └── module.xml
├── Installazione
    └── InstallSchema.php

Che cosa ho fatto di sbagliato?


La soluzione di cui sopra è ottima, ma i valori non sono impostati sui campi aggiunti ... c'è qualcos'altro che dobbiamo fare sullo stesso. Fondamentalmente stiamo sostituendo il modulo Recensioni. Grazie in anticipo ..
Grande cervello indiano il

Risposte:


24

Per aggiungere un campo immagine, puoi provare a usare il plugin e cercare sempre di evitare di sovrascrivere l'intera classe.

Venditore / modulo / 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>

Venditore / Modulo / Plugin / blocchi / Adminhtml / utente / Modifica / 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();
    }
}

Cancella cache.


Ciao Sohel, grazie mille per la tua risposta! Sembra esattamente quello che voglio ottenere :) Ti darò un feedback non appena provo questo codice localmente. A proposito, ho visto che crei un nuovo set di campi e sto iniziando a chiedermi se è possibile aggiornare uno già esistente, ad esempio "base_fieldset", cosa ne pensi? Inoltre, sono curioso, questo approccio plug-in copre anche l'aggiornamento dei controller? Ho bisogno di aggiornare alcuni pensieri in futuro qui: /module-user/Controller/Adminhtml/User/Save.php- salvare la stringa con il percorso dell'immagine nella tabella 'admin_user'. Mi dispiace per molte domande. apprezzo il tuo aiuto! Saluti!
Rob,

Ok, è possibile usare il plugin per un controller, ma nel mio caso non era sufficiente. Ad ogni modo, i tuoi suggerimenti mi aiutano a risolvere un problema. Grazie ancora!
Rob,

La soluzione di cui sopra è ottima, ma i valori non sono impostati sui campi aggiunti ... c'è qualcos'altro che dobbiamo fare sullo stesso. Fondamentalmente stiamo sostituendo il modulo Recensioni. Grazie in anticipo ..
Grande cervello indiano il

Sarei anche interessato a come salvare il valore di un nuovo campo nel modulo utente admin nella tabella admin_user. L'hai risolto estendendo / sovrascrivendo il controller /module-user/Controller/Adminhtml/User/Save.php?
Hallleron

@Sohel Rana, il campo selezionato non mostrerà dove? o come possiamo ottenere l'ID utente corrente qui?
SagarPPanchal,

2

dopo alcune ricerche ho trovato una soluzione per questo

aggiungi una nuova proprietà "valore" nel metodo addField

con il valore che ti serve. vedi l'esempio:

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

Spero che possa aiutare alcuni di voi ..


2

Sostituzione dell'istruzione

return parent::_prepareForm();

con questo

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

ha funzionato per me. Ecco il codice completo. Aggiunta del campo "Negozio accessibile" come segue.

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

}

E grazie a @Rob per aver condiviso l'indizio da dove cominciare.


2

Solo per aggiungere un altro esempio funzionante, sono riuscito a sovrascrivere la pagina di amministrazione del sito Web. Stavo cercando di aggiungere un campo URL alla pagina di modifica del sito Web.

Ho fatto esattamente ciò che è stato detto nella risposta convalidata ma non ho aggiunto un nuovo set di campi. Invece, ho completato quello esistente, usando il suo id definito nella classe Website.

Inoltre, ho usato l'eredità per recuperare il modello del sito Web e recuperare il valore corrente dal database per inserirlo nel modulo (viene copiato anche dalla classe del sito Web Magento).

Come prerequisito, è necessario aggiungere la colonna 'url' nella tabella store_website del database magento.

Ecco il risultato di lavoro (testato in 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();
    }
}

E il file di.xml nella directory Vendor / Store / etc / adminhtml (niente di nuovo qui dalla risposta convalidata):

<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

Ho appena apportato una piccola modifica alla tua soluzione e ha funzionato per me:

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

}

Se vuoi, posso pubblicare l'intera soluzione, ma devo rivederla perché, secondo le norme della mia azienda, non posso mostrare il codice sui forum pubblici. Fammi sapere se puoi farlo da solo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.