Magento 2 Dodaj nowe pole do formularza administratora Magento_User

11

Szukam dobrego podejścia z dodanym / zaktualizowanym już (domyślnie) formularzem użytkownika Magento (moduł-użytkownik). Do formularza można dotrzeć w panelu administracyjnym, korzystając z tej ścieżki:

System> Wszyscy użytkownicy> [wybrany_użytkownik]> główna karta edycji użytkownika (Informacje o koncie)

Teraz próbuję użyć di.xml w moim module niestandardowym, w którym określam zależności: `

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

`

To jest treść, którą już stworzyłem dla klasy Main.php

// @codingStandardsIgnoreFile

przestrzeń nazw nazwa_dostawcy \ nazwa_modułu \ blok \ użytkownik \ edycja \ tab;

użyj \ Magento \ User \ Block \ User \ Edit \ Tab \ Main jako UserEditMainTab;
użyj \ Magento \ Backend \ Block \ Template \ Context;
use \ Magento \ Framework \ Registry;
use \ Magento \ Framework \ Data \ FormFactory;
użyj \ Magento \ Backend \ Model \ Auth \ Session;
use \ Magento \ Framework \ Locale \ ListsInterface;

klasa Main rozszerza UserEditMainTab
{
    funkcja publiczna __construct (
        Kontekst $ kontekst,
        Rejestr $ rejestr,
        FormFactory $ formFactory,
        Sesja $ authSession,
        ListsInterface $ localeLists,
        tablica $ data = []
    ) {
        rodzic :: __ konstrukcja ($ kontekst, $ rejestr, $ formFactory, $ authSession, $ localeLists, $ data);
    }

    funkcja chroniona _prepareForm ()
    {
        / ** @var $ model \ Magento \ Użytkownik \ Model \ Użytkownik * /
        $ model = $ this -> _ coreRegistry-> register ('permissions_user');

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

        $ baseFieldset = $ form-> addFieldset ('base_fieldset', ['legend' => __ ('Informacje o koncie __ 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”,
            'wizerunek',
            [
                „name” => „user_image”,
                „label” => __ („Obraz użytkownika”),
                „id” => „user_image”,
                „title” => __ („Obraz użytkownika”),
                „wymagane” => fałsz,
                „note” => „Zezwól na typ obrazu: jpg, jpeg, png”
            ]
        );

        $ baseFieldset-> addField (
            'Nazwa Użytkownika',
            'tekst',
            [
                „name” => „username”,
                „label” => __ („Nazwa użytkownika”),
                „id” => „nazwa użytkownika”,
                „title” => __ („Nazwa użytkownika”),
                „wymagane” => prawda
            ]
        );

        $ baseFieldset-> addField (
            'Imię',
            'tekst',
            [
                „name” => „firstname”,
                „label” => __ („Imię”),
                „id” => „imię”,
                „title” => __ („Imię”),
                „wymagane” => prawda
            ]
        );

        $ baseFieldset-> addField (
            'nazwisko',
            'tekst',
            [
                „imię” => „nazwisko”,
                „label” => __ („Nazwisko”),
                „id” => „nazwisko”,
                „title” => __ („nazwisko”),
                „wymagane” => prawda
            ]
        );

        $ baseFieldset-> addField (
            'e-mail',
            'tekst',
            [
                „name” => „email”,
                „label” => __ („Email”),
                „id” => „customer_email”,
                „title” => __ („E-mail użytkownika”),
                „klasa” => „wymagany-poprawny adres e-mail”,
                „wymagane” => prawda
            ]
        );

        $ isNewObject = $ model-> isObjectNew ();
        if ($ isNewObject) {
            $ passwordLabel = __ („Hasło”);
        } else {
            $ passwordLabel = __ („Nowe hasło”);
        }
        $ potwierdzenieLabel = __ („Potwierdzenie hasła”);
        $ this -> _ addPasswordFields ($ baseFieldset, $ passwordLabel, $ confirmLabel, $ isNewObject);

        $ baseFieldset-> addField (
            „interfejs_lokalny”,
            'Wybierz',
            [
                „name” => „interface_locale”,
                „label” => __ („Ustawienia regionalne interfejsu”),
                „title” => __ („Ustawienia regionalne interfejsu”),
                'wartości' => $ to -> _ LocaleLists-> getTranslatedOptionLocales (),
                „klasa” => „wybierz”
            ]
        );

        if ($ this -> _ authSession-> getUser () -> getId ()! = $ model-> getUserId ()) {
            $ baseFieldset-> addField (
                'jest aktywny',
                'Wybierz',
                [
                    „name” => „is_active”,
                    „label” => __ („To konto to”),
                    „id” => „is_active”,
                    „title” => __ („Status konta”),
                    „class” => „input-select”,
                    „opcje” => [„1” => __ („Aktywny”), „0” => __ („Nieaktywny”)]
                ]
            );
        }

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

        $ currentUserVerificationFieldset = $ form-> addFieldset (
            „current_user_verification_fieldset”,
            ['legend' => __ („Bieżąca weryfikacja tożsamości użytkownika”)]
        );
        $ currentUserVerificationFieldset-> addField (
            self :: CURRENT_USER_PASSWORD_FIELD,
            'hasło',
            [
                'name' => self :: CURRENT_USER_PASSWORD_FIELD,
                „label” => __ („Twoje hasło”),
                „id” => self :: CURRENT_USER_PASSWORD_FIELD,
                „title” => __ („Twoje hasło”),
                „class” => „input-text validate-current-password wymagany-wpis”,
                „wymagane” => prawda
            ]
        );

        $ data = $ model-> getData ();
        nieustawiony ($ data [„hasło”]);
        nieustawiony ($ data [self :: CURRENT_USER_PASSWORD_FIELD]);
        $ form-> setValues ​​($ data);

        $ this-> setForm ($ form);

        return parent :: _ preparForm ();
    }
}

i trochę kodu dla User.php

przestrzeń nazw nazwa_dostawcy \ nazwa_modułu \ blok \ rola \ siatka;

użyj \ Magento \ User \ Block \ Role \ Grid \ User jako RoleGridUser;
użyj \ Magento \ Backend \ Block \ Widget \ Grid \ Extended jako ExtendedGrid;

klasa Użytkownik rozszerza RoleGridUser
{
    funkcja chroniona _prepareColumns ()
    {
        parent :: _ preparCollection ();

        $ this-> addColumn (
            „user_image”,
            [
                „header” => __ („Obraz użytkownika”),
                „szerokość” => 5,
                „align” => „left”,
                „sortable” => true,
                „index” => „user_image”
            ]
        );

        return ExtendedGrid :: _ preparCollection ();
    }
}

Jeśli przyjrzysz się bliżej, już teraz próbuję dodać pole z wizerunkiem użytkownika.

Niestety nie widzę żadnych zmian w panelu administratora. Oczywiście potrzebna kolumna została wcześniej dodana przez skrypt InstallSchema do tabeli „ admin_user ”.

Zawartość katalogów w formacie drzewiastym:

Nazwa modułu
├── Blokuj
│ ├── Katalog
└── │ └── Produkt
└── │ └── RelatedPosts.php
├── ├── Rola
│ │ └── Siatka
└── │ └── User.php
└── └── Użytkownik
└── └── Edytuj
│ └── Tab
└── └── Main.php
├── composer.json
├── itp
├── ├── di.xml
└── └── module.xml
├── Konfiguracja
    └── InstallSchema.php

Co zrobiłem źle?

Obrabować
źródło
Powyższe rozwiązanie jest świetne, ale wartości nie są ustawione w dodanych polach .. czy jest coś jeszcze, co musimy zrobić na tym samym. Zasadniczo zastępujemy formularz Recenzje. Z góry dziękuję ..
Great Indian Brain

Odpowiedzi:

24

Aby dodać pole obrazu, możesz spróbować użyć wtyczki i zawsze staraj się unikać zastępowania całej klasy.

Dostawca / Moduł / 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 / Module / Plugin / Block / Adminhtml / User / 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();
    }
}

Wyczyść pamięć podręczną.

Sohel Rana
źródło
Hej Sohel, wielkie dzięki za odpowiedź! Wydaje się, że dokładnie to, co chcę osiągnąć :) Prześlemy ci opinię, jak tylko spróbuję tego kodu lokalnie. Nawiasem mówiąc, widziałem, że tworzysz nowy zestaw pól i zaczynam się zastanawiać, czy można zaktualizować już istniejący zestaw, np. „Base_fieldset”, co myślisz? Ciekawe, czy to podejście wtyczek obejmuje również aktualizację kontrolerów? Muszę zaktualizować kilka myśli w przyszłości tutaj: /module-user/Controller/Adminhtml/User/Save.php- zapisz ciąg ze ścieżką obrazu w tabeli „admin_user”. Przepraszam za wiele pytań. doceniam Twoją pomoc! Twoje zdrowie!
Rob
Ok, można użyć wtyczki do kontrolera, ale w moim przypadku nie było to wystarczające. W każdym razie Twoje sugestie pomogą mi rozwiązać problem. Dziękuję raz jeszcze!
Rob
Powyższe rozwiązanie jest świetne, ale wartości nie są ustawione w dodanych polach .. czy jest coś jeszcze, co musimy zrobić na tym samym. Zasadniczo zastępujemy formularz Recenzje. Z góry dziękuję ..
Great Indian Brain
Byłbym również zainteresowany tym, jak zapisać wartość nowego pola w formularzu użytkownika admin do tabeli admin_user. Czy rozwiązałeś to rozszerzenie / przesłonięcie kontrolera /module-user/Controller/Adminhtml/User/Save.php?
Hallleron
@ Sohel Rana, wybrane pole nie pokaże gdzie? lub jak możemy uzyskać bieżący identyfikator użytkownika tutaj?
SagarPPanchal
2

po kilku badaniach udało się znaleźć rozwiązanie tego problemu

dodaj nową właściwość „wartość” w metodzie addField

o wartości, której potrzebujesz. patrz przykład:

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

Mam nadzieję, że to pomoże niektórym z was ...

tal shulgin
źródło
2

Zastępowanie instrukcji

return parent::_prepareForm();

z tym

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

pracował dla mnie. Oto pełny kod. Dodanie pola „Sklep dostępny” w następujący sposób.

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

}

I dzięki @Rob za podzielenie się wskazówką, od czego zacząć.

saiid
źródło
2

Aby dodać kolejny działający przykład, udało mi się zastąpić stronę administratora witryny. Próbowałem dodać pole adresu URL do strony edycji witryny.

Zrobiłem dokładnie to, co zostało powiedziane w potwierdzonej odpowiedzi, ale nie dodałem nowego zestawu pól. Zamiast tego ukończyłem już istniejący, używając jego identyfikatora zdefiniowanego w klasie WWW.

Poza tym użyłem dziedziczenia do pobrania modelu strony i pobrania bieżącej wartości z bazy danych, aby umieścić ją w formularzu (jest ona również skopiowana z klasy Magento Website).

Wymagane jest dodanie kolumny „url” w tabeli store_website bazy danych magento.

Oto wynik pracy (przetestowany w 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();
    }
}

Oraz plik di.xml w katalogu Vendor / Store / etc / adminhtml (nic nowego tutaj z potwierdzonej odpowiedzi):

<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
źródło
0

Właśnie dokonałem niewielkiej zmiany w twoim rozwiązaniu i zadziałało dla mnie:

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

}

Jeśli chcesz, mogę opublikować całe rozwiązanie - ale muszę je poprawić, ponieważ zgodnie z normami mojej firmy nie mogę wyświetlać kodu na forach publicznych. Po prostu daj mi znać, czy możesz to zrobić sam.

Abid Malik
źródło