Magento 2 Fügen Sie dem Verwaltungsformular für Magento_User ein neues Feld hinzu

11

Ich bin auf der Suche nach einem guten Ansatz mit bereits vorbereitetem (standardmäßig) Magento-Benutzerformular (Modulbenutzer). Das Formular kann im Admin-Bereich über folgenden Pfad erreicht werden:

System> Alle Benutzer> [Ausgewählter_Benutzer]> Hauptbearbeitungsregisterkarte des Benutzers (Kontoinformationen)

Jetzt versuche ich, di.xml in meinem benutzerdefinierten Modul zu verwenden, in dem ich Abhängigkeiten spezifiziere: `

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

`

Dies ist Inhalt, den ich bereits für eine Main.php-Klasse erstellt habe

// @codingStandardsIgnoreFile

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

Verwenden Sie \ Magento \ User \ Block \ User \ Edit \ Tab \ Main als UserEditMainTab.
Verwenden Sie \ Magento \ Backend \ Block \ Template \ Context.
Verwenden Sie \ Magento \ Framework \ Registry.
Verwenden Sie \ Magento \ Framework \ Data \ FormFactory.
Verwenden Sie \ Magento \ Backend \ Model \ Auth \ Session.
Verwenden Sie \ Magento \ Framework \ Locale \ ListsInterface.

Klasse Main erweitert UserEditMainTab
{
    öffentliche Funktion __construct (
        Kontext $ Kontext,
        Registrierung $ Registrierung,
        FormFactory $ formFactory,
        Sitzung $ authSession,
        ListsInterface $ localeLists,
        Array $ data = []
    ) {
        parent :: __ Konstrukt ($ context, $ registry, $ formFactory, $ authSession, $ localeLists, $ data);
    }}

    geschützte Funktion _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' => __ ('Kontoinformationen __ TEST')]);

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

        $ baseFieldset-> addField (
            'user_image',
            'Bild',
            [
                'name' => 'user_image',
                'label' => __ ('User Image'),
                'id' => 'user_image',
                'title' => __ ('User Image'),
                'erforderlich' => falsch,
                'note' => 'Bildtyp zulassen: jpg, jpeg, png'
            ]]
        );

        $ baseFieldset-> addField (
            'Nutzername',
            'Text',
            [
                'name' => 'username',
                'label' => __ ('Benutzername'),
                'id' => 'Benutzername',
                'title' => __ ('Benutzername'),
                'erforderlich' => wahr
            ]]
        );

        $ baseFieldset-> addField (
            'Vorname',
            'Text',
            [
                'name' => 'firstname',
                'label' => __ ('Vorname'),
                'id' => 'Vorname',
                'title' => __ ('Vorname'),
                'erforderlich' => wahr
            ]]
        );

        $ baseFieldset-> addField (
            'Familienname, Nachname',
            'Text',
            [
                'name' => 'lastname',
                'label' => __ ('Nachname'),
                'id' => 'Nachname',
                'title' => __ ('Nachname'),
                'erforderlich' => wahr
            ]]
        );

        $ baseFieldset-> addField (
            'Email',
            'Text',
            [
                'name' => 'email',
                'label' => __ ('Email'),
                'id' => 'customer_email',
                'title' => __ ('Benutzer-E-Mail'),
                'class' => 'validate-email für erforderlichen Eintrag',
                'erforderlich' => wahr
            ]]
        );

        $ isNewObject = $ model-> isObjectNew ();
        if ($ isNewObject) {
            $ passwordLabel = __ ('Passwort');
        } else {
            $ passwordLabel = __ ('Neues Passwort');
        }}
        $ verifyLabel = __ ('Passwortbestätigung');
        $ this -> _ addPasswordFields ($ baseFieldset, $ passwordLabel, $ verifyLabel, $ isNewObject);

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

        if ($ this -> _ authSession-> getUser () -> getId ()! = $ model-> getUserId ()) {
            $ baseFieldset-> addField (
                'ist aktiv',
                'wählen',
                [
                    'name' => 'is_active',
                    'label' => __ ('Dieses Konto ist'),
                    'id' => 'is_active',
                    'title' => __ ('Kontostatus'),
                    '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' => __ ('Überprüfung der aktuellen Benutzeridentität')]
        );
        $ currentUserVerificationFieldset-> addField (
            self :: CURRENT_USER_PASSWORD_FIELD,
            'Passwort',
            [
                'name' => self :: CURRENT_USER_PASSWORD_FIELD,
                'label' => __ ('Ihr Passwort'),
                'id' => self :: CURRENT_USER_PASSWORD_FIELD,
                'title' => __ ('Ihr Passwort'),
                'class' => 'input-text validate-current-password required-entry',
                'erforderlich' => wahr
            ]]
        );

        $ data = $ model-> getData ();
        nicht gesetzt ($ data ['password']);
        nicht gesetzt ($ data [self :: CURRENT_USER_PASSWORD_FIELD]);
        $ form-> setValues ​​($ data);

        $ this-> setForm ($ form);

        return parent :: _ prepareForm ();
    }}
}}

und etwas Code für User.php

Namespace Vendor_Name \ Module_Name \ Block \ Role \ Grid;

Verwenden Sie \ Magento \ User \ Block \ Role \ Grid \ User als RoleGridUser.
Verwenden Sie \ Magento \ Backend \ Block \ Widget \ Grid \ Extended als ExtendedGrid.

Klasse Benutzer erweitert RoleGridUser
{
    geschützte Funktion _prepareColumns ()
    {
        parent :: _ prepareCollection ();

        $ this-> addColumn (
            'user_image',
            [
                'header' => __ ('User Image'),
                'width' => 5,
                'align' => 'left',
                'sortierbar' => wahr,
                'index' => 'user_image'
            ]]
        );

        return ExtendedGrid :: _ prepareCollection ();
    }}
}}

Wenn Sie genauer hinschauen, werden Sie bereits jetzt versuchen, ein Feld mit dem Bild des Benutzers hinzuzufügen.

Leider sehe ich keine Änderungen in der Admin-Front. Natürlich wurde die erforderliche Spalte vom InstallSchema-Skript früher zur Tabelle ' admin_user ' hinzugefügt .

Inhalt von Verzeichnissen in einem baumartigen Format:

Modulname
├── Blockieren
│ ├ Katalog
│ │ └ Produkt
│ │ └ RelatedPosts.php
│ ├ Rolle
│ │ └ Gitter
│ │ └ User.php
│ └ Benutzer
│ └ Bearbeiten
│ └ Tab
│ └ Main.php
├── composer.json
├── etc.
│ ├ di.xml
│ └ module.xml
├── Setup
    └── InstallSchema.php

Was habe ich falsch gemacht?

rauben
quelle
Die obige Lösung ist großartig, aber die Werte werden nicht für die hinzugefügten Felder festgelegt. Gibt es noch etwas, das wir für dasselbe tun müssen? Grundsätzlich überschreiben wir das Bewertungsformular. Vielen Dank im Voraus ..
Great Indian Brain

Antworten:

24

Zum Hinzufügen eines Bildfelds können Sie versuchen, das Plugin zu verwenden und immer zu vermeiden, dass die gesamte Klasse überschrieben wird.

Hersteller / Modul / 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>

Anbieter / Modul / Plugin / Block / Adminhtml / Benutzer / Bearbeiten / 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();
    }
}

Cache leeren.

Sohel Rana
quelle
Hey Sohel, vielen Dank für deine Antwort! Es scheint genau zu sein, was ich erreichen möchte :) Ich werde Ihnen Feedback geben, sobald ich diesen Code lokal ausprobiere. Übrigens habe ich gesehen, dass Sie ein neues Feldset erstellen, und ich frage mich, ob es möglich ist, bereits vorhandene zu aktualisieren, z. B. 'base_fieldset'. Was denken Sie? Ich bin auch neugierig, ob dieser Plugin-Ansatz auch die Aktualisierung von Controllern abdeckt. Ich muss hier in Zukunft einige /module-user/Controller/Adminhtml/User/Save.phpÜberlegungen aktualisieren: - Speichern Sie die Zeichenfolge mit dem Bildpfad in der Tabelle 'admin_user'. Entschuldigung für viele Fragen. schätze deine Hilfe! Prost!
Rob
Ok, es ist möglich, ein Plugin für einen Controller zu verwenden, aber in meinem Fall war das nicht ausreichend. Wie auch immer, Ihre Vorschläge helfen mir, ein Problem zu lösen. Vielen Dank noch mal!
Rob
Die obige Lösung ist großartig, aber die Werte werden nicht für die hinzugefügten Felder festgelegt. Gibt es noch etwas, das wir für dasselbe tun müssen? Grundsätzlich überschreiben wir das Bewertungsformular. Vielen Dank im Voraus ..
Great Indian Brain
Mich würde auch interessieren, wie man den Wert eines neuen Feldes im Admin-Benutzerformular in der Tabelle admin_user speichert. Haben Sie das Problem gelöst, indem Sie den Controller /module-user/Controller/Adminhtml/User/Save.php erweitert / überschrieben haben?
Hallleron
@Sohel Rana, ausgewähltes Feld zeigt nicht wo? oder wie können wir hier die aktuelle Benutzer-ID erhalten?
SagarPPanchal
2

Nach einigen Recherchen bekam man eine Lösung dafür

Fügen Sie in der addField-Methode eine neue Eigenschaft "value" hinzu

mit dem Wert, den Sie brauchen. siehe das Beispiel:

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

Ich hoffe es wird einigen von euch helfen ..

tal shulgin
quelle
2

Ersetzen der Anweisung

return parent::_prepareForm();

mit diesem

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

arbeitete für mich. Hier ist der vollständige Code. Fügen Sie das Feld "Accessible Store" wie folgt hinzu.

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

}

Und danke @Rob für den Hinweis, wo man anfangen soll.

sagte
quelle
2

Um ein weiteres funktionierendes Beispiel hinzuzufügen, ist es mir gelungen, die Website-Administrationsseite zu überschreiben. Ich habe versucht, der Website-Bearbeitungsseite ein URL-Feld hinzuzufügen.

Ich habe genau das getan, was in der validierten Antwort steht, aber ich habe kein neues Feldset hinzugefügt. Stattdessen habe ich die vorhandene mit der in der Website-Klasse definierten ID vervollständigt.

Außerdem habe ich die Vererbung verwendet, um das Website-Modell abzurufen und den aktuellen Wert aus der Datenbank abzurufen, um ihn in das Formular einzufügen (er wurde auch aus der Magento-Website-Klasse kopiert).

Voraussetzung ist, dass die Spalte 'url' in der Tabelle store_website der Magento-Datenbank hinzugefügt wird.

Hier ist das Arbeitsergebnis (getestet 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();
    }
}

Und die Datei di.xml im Verzeichnis Vendor / Store / etc / adminhtml (hier nichts Neues aus der validierten Antwort):

<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
quelle
0

Ich habe nur eine kleine Änderung an Ihrer Lösung vorgenommen und es hat bei mir funktioniert:

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

}

Wenn Sie möchten, kann ich die gesamte Lösung veröffentlichen - aber ich muss sie überarbeiten, da ich den Code gemäß meinen Unternehmensnormen nicht in öffentlichen Foren anzeigen kann. Lassen Sie mich einfach wissen, ob Sie es selbst tun können.

Abid Malik
quelle