Magento 2 Ajouter un nouveau champ au formulaire d'administration Magento_User

11

Je recherche une bonne approche avec l'ajout / mise à jour déjà préparé (par défaut) du formulaire Utilisateur Magento (module-utilisateur). Le formulaire peut être atteint dans le panneau d'administration par ce chemin:

Système> Tous les utilisateurs> [utilisateur choisi]> Onglet d'édition principal de l'utilisateur (Informations sur le compte)

Maintenant, j'essaie d'utiliser di.xml dans mon module personnalisé où je spécifie les dépendances: `

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

"

C'est du contenu que j'ai déjà créé pour une classe Main.php

// @codingStandardsIgnoreFile

espace de noms Vendor_Name \ Module_Name \ Block \ User \ Edit \ Tab;

utilisez \ Magento \ User \ Block \ User \ Edit \ Tab \ Main comme UserEditMainTab;
utilisez \ Magento \ Backend \ Block \ Template \ Context;
utilisez \ Magento \ Framework \ Registry;
utilisez \ Magento \ Framework \ Data \ FormFactory;
utilisez \ Magento \ Backend \ Model \ Auth \ Session;
use \ Magento \ Framework \ Locale \ ListsInterface;

La classe Main étend UserEditMainTab
{
    fonction publique __construct (
        Context $ context,
        Registry $ Registry,
        FormFactory $ formFactory,
        Session $ authSession,
        ListsInterface $ localeLists,
        tableau $ data = []
    ) {
        parent :: __ construct ($ context, $ registry, $ formFactory, $ authSession, $ localeLists, $ data);
    }

    fonction protégée _prepareForm ()
    {
        / ** @var $ model \ Magento \ User \ Model \ User * /
        $ model = $ this -> _ coreRegistry-> registre ('permissions_user');

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

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

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

        $ baseFieldset-> addField (
            'user_image',
            'image',
            [
                'name' => 'user_image',
                'label' => __ ('Image utilisateur'),
                'id' => 'image_utilisateur',
                'title' => __ ('Image utilisateur'),
                'required' => false,
                'note' => 'Autoriser le type d'image: jpg, jpeg, png'
            ]
        );

        $ baseFieldset-> addField (
            'Nom d'utilisateur',
            'texte',
            [
                'name' => 'username',
                'label' => __ ('Nom d'utilisateur'),
                'id' => 'nom d'utilisateur',
                'title' => __ ('Nom d'utilisateur'),
                'required' => vrai
            ]
        );

        $ baseFieldset-> addField (
            'Prénom',
            'texte',
            [
                'name' => 'firstname',
                'label' => __ ('Prénom'),
                'id' => 'prénom',
                'title' => __ ('Prénom'),
                'required' => vrai
            ]
        );

        $ baseFieldset-> addField (
            'nom de famille',
            'texte',
            [
                'name' => 'lastname',
                'label' => __ ('Nom'),
                'id' => 'nom',
                'title' => __ ('Nom'),
                'required' => vrai
            ]
        );

        $ baseFieldset-> addField (
            'email',
            'texte',
            [
                'name' => 'email',
                'label' => __ ('Email'),
                'id' => 'email_client',
                'title' => __ ('Email de l'utilisateur'),
                'class' => 'required-entry validate-email',
                'required' => vrai
            ]
        );

        $ isNewObject = $ model-> isObjectNew ();
        if ($ isNewObject) {
            $ passwordLabel = __ ('Mot de passe');
        } autre {
            $ passwordLabel = __ ('Nouveau mot de passe');
        }
        $ confirmationLabel = __ ('Confirmation du mot de passe');
        $ this -> _ addPasswordFields ($ baseFieldset, $ passwordLabel, $ confirmationLabel, $ isNewObject);

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

        if ($ this -> _ authSession-> getUser () -> getId ()! = $ model-> getUserId ()) {
            $ baseFieldset-> addField (
                'c'est actif',
                'sélectionner',
                [
                    'name' => 'is_active',
                    'label' => __ ('Ce compte est'),
                    'id' => 'is_active',
                    'title' => __ ('Statut du compte'),
                    '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' => __ ('Vérification de l'identité de l'utilisateur actuel')]
        );
        $ currentUserVerificationFieldset-> addField (
            self :: CURRENT_USER_PASSWORD_FIELD,
            'mot de passe',
            [
                'name' => self :: CURRENT_USER_PASSWORD_FIELD,
                'label' => __ ('Votre mot de passe'),
                'id' => self :: CURRENT_USER_PASSWORD_FIELD,
                'title' => __ ('Votre mot de passe'),
                'class' => 'input-text validate-current-password required-entry',
                'required' => vrai
            ]
        );

        $ data = $ model-> getData ();
        unset ($ data ['mot de passe']);
        unset ($ data [self :: CURRENT_USER_PASSWORD_FIELD]);
        $ form-> setValues ​​($ data);

        $ this-> setForm ($ form);

        return parent :: _ prepareForm ();
    }
}

et du code pour User.php

espace de noms Vendor_Name \ Module_Name \ Block \ Role \ Grid;

utilisez \ Magento \ User \ Block \ Role \ Grid \ User comme RoleGridUser;
utilisez \ Magento \ Backend \ Block \ Widget \ Grid \ Extended comme ExtendedGrid;

classe User étend RoleGridUser
{
    fonction protégée _prepareColumns ()
    {
        parent :: _ prepareCollection ();

        $ this-> addColumn (
            'user_image',
            [
                'header' => __ ('Image utilisateur'),
                'largeur' => 5,
                'align' => 'left',
                'sortable' => true,
                'index' => 'image_utilisateur'
            ]
        );

        return ExtendedGrid :: _ prepareCollection ();
    }
}

Si vous regardez de plus près vous déjà maintenant que j'essaie d'ajouter un champ avec l'image de l'utilisateur.

Malheureusement, je ne vois aucun changement dans la partie administrative. Bien sûr, la colonne nécessaire a été ajoutée par le script InstallSchema plus tôt dans la table ' admin_user '.

Contenu des répertoires sous forme d'arborescence:

Module_Name
├── Bloquer
│ ├── Catalogue
│ │ └── Produit
│ │ └── RelatedPosts.php
│ ├── Rôle
│ │ └── Grille
│ │ └── User.php
│ └── Utilisateur
│ └── Modifier
│ └── Tab
│ └── Main.php
├── composer.json
├── etc
│ ├── di.xml
│ └── module.xml
├── Configuration
    └── InstallSchema.php

Qu'ai-je fait de mal?

Rob
la source
La solution ci-dessus est excellente mais les valeurs ne sont pas définies dans les champs ajoutés ... y a-t-il autre chose que nous devons faire de la même manière. Nous remplaçons essentiellement le formulaire Avis. Merci d'avance ..
Great Indian Brain

Réponses:

24

Pour ajouter un champ d'image, vous pouvez essayer d'utiliser le plugin et toujours essayer d'éviter d'écraser toute la classe.

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

Fournisseur / Module / Plugin / Bloquer / Adminhtml / Utilisateur / Modifier / 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();
    }
}

Vider le cache.

Sohel Rana
la source
Hé Sohel, merci beaucoup pour votre réponse! Il semble être exactement ce que je veux atteindre :) Je vous donnerai des commentaires dès que j'essaierai ce code localement. Au fait, j'ai vu que vous créez un nouveau fieldset et je commence à me demander s'il est possible de mettre à jour un déjà existant, par exemple 'base_fieldset', qu'en pensez-vous? De plus, je suis curieux, cette approche de plugin couvre-t-elle également la mise à jour des contrôleurs? J'ai besoin de mettre à jour quelques réflexions à l'avenir ici: /module-user/Controller/Adminhtml/User/Save.php- enregistrer la chaîne avec le chemin de l'image dans la table 'admin_user'. Désolé pour de nombreuses questions. apprécier ton aide! à votre santé!
Rob
Ok, il est possible d'utiliser un plugin pour un contrôleur, mais dans mon cas ce n'était pas suffisant. Quoi qu'il en soit, vos suggestions m'aident à résoudre un problème. Merci une fois de plus!
Rob
La solution ci-dessus est excellente mais les valeurs ne sont pas définies dans les champs ajoutés ... y a-t-il autre chose que nous devons faire de la même manière. Nous remplaçons essentiellement le formulaire Avis. Merci d'avance ..
Great Indian Brain
Je serais également intéressé par la façon d'enregistrer la valeur d'un nouveau champ sous forme d'utilisateur administrateur dans la table admin_user. L'avez-vous résolu en étendant / remplaçant le contrôleur /module-user/Controller/Adminhtml/User/Save.php?
hallleron le
@Sohel Rana, le champ sélectionné ne montrera pas où? ou comment obtenir ici l'ID utilisateur actuel?
SagarPPanchal
2

après quelques recherches a obtenu une solution pour cela

ajouter une nouvelle propriété "value" dans la méthode addField

avec la valeur dont vous avez besoin. voir l'exemple:

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

J'espère que cela aidera certains d'entre vous ..

tal shulgin
la source
2

Remplacement de la déclaration

return parent::_prepareForm();

avec ça

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

travaillé pour moi. Voici le code complet. Ajout du champ "Boutique accessible" comme suit.

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

}

Et merci à @Rob d'avoir partagé l'indice par où commencer.

saiid
la source
2

Juste pour ajouter un autre exemple de travail, j'ai réussi à remplacer la page d'administration du site Web. J'essayais d'ajouter un champ URL à la page de modification du site Web.

J'ai fait exactement ce qui est dit dans la réponse validée mais je n'ai pas ajouté de nouveau fieldset. Au lieu de cela, j'ai terminé celui existant, en utilisant son id défini dans la classe Website.

En outre, j'ai utilisé l'héritage pour récupérer le modèle de site Web et récupérer la valeur actuelle de la base de données pour le placer dans le formulaire (il est également copié de la classe de site Web Magento).

Au préalable, il est nécessaire d'ajouter la colonne 'url' dans la table store_website de la base de données magento.

Voici le résultat de travail (testé dans 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();
    }
}

Et le fichier di.xml dans le répertoire Vendor / Store / etc / adminhtml (rien de nouveau ici à partir de la réponse validée):

<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
la source
0

Je viens de faire un changement mineur dans votre solution et cela a fonctionné pour moi:

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

}

Si vous le souhaitez, je peux publier l'intégralité de la solution - mais je dois la réviser car, conformément aux normes de mon entreprise, je ne peux pas afficher le code sur les forums publics. Alors, faites-moi savoir si vous pouvez le faire vous-même.

Abid Malik
la source