Magento 2 Agregar nuevo campo al formulario de administración de Magento_User

11

Estoy buscando un buen enfoque con el formulario de agregar / actualizar ya preparado (por defecto) Magento User (module-user). Se puede acceder al formulario en el panel de administración mediante esta ruta:

Sistema> Todos los usuarios> [elegido_usuario]> Pestaña de edición principal del usuario (Información de la cuenta)

Ahora estoy intentando usar di.xml en mi módulo personalizado donde especifico dependencias: `

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

``

Este es el contenido que ya hice para una clase Main.php

// @codingStandardsIgnoreFile

espacio de nombres Nombre del proveedor \ Nombre del módulo \ Bloque \ Usuario \ Editar \ Pestaña;

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

La clase Main extiende UserEditMainTab
{
    función pública __construct (
        Contexto $ context,
        Registro $ registro,
        FormFactory $ formFactory,
        Sesión $ authSession,
        ListsInterface $ localeLists,
        matriz $ datos = []
    ) {
        parent :: __ construct ($ context, $ registro, $ formFactory, $ authSession, $ localeLists, $ data);
    }

    función protegida _prepareForm ()
    {
        / ** @var $ model \ Magento \ User \ Model \ User * /
        $ model = $ this -> _ coreRegistry-> registro ('permisos_usuario');

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

        $ baseFieldset = $ form-> addFieldset ('base_fieldset', ['legend' => __ ('Información de la cuenta __ TEST')]);

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

        $ baseFieldset-> addField (
            'user_image',
            'imagen',
            [
                'name' => 'user_image',
                'label' => __ ('Imagen de usuario'),
                'id' => 'user_image',
                'title' => __ ('Imagen de usuario'),
                'required' => false,
                'note' => 'Permitir tipo de imagen: jpg, jpeg, png'
            ]
        );

        $ baseFieldset-> addField (
            'nombre de usuario',
            'texto',
            [
                'name' => 'nombre de usuario',
                'label' => __ ('Nombre de usuario'),
                'id' => 'nombre de usuario',
                'title' => __ ('Nombre de usuario'),
                'required' => verdadero
            ]
        );

        $ baseFieldset-> addField (
            'primer nombre',
            'texto',
            [
                'name' => 'firstname',
                'label' => __ ('Nombre'),
                'id' => 'nombre',
                'title' => __ ('Nombre'),
                'required' => verdadero
            ]
        );

        $ baseFieldset-> addField (
            'apellido',
            'texto',
            [
                'name' => 'apellido',
                'label' => __ ('Apellido'),
                'id' => 'apellido',
                'title' => __ ('Apellido'),
                'required' => verdadero
            ]
        );

        $ baseFieldset-> addField (
            'Email',
            'texto',
            [
                'name' => 'email',
                'label' => __ ('Correo electrónico'),
                'id' => 'customer_email',
                'title' => __ ('Correo electrónico del usuario'),
                'class' => 'required-entry validate-email',
                'required' => verdadero
            ]
        );

        $ isNewObject = $ modelo-> isObjectNew ();
        if ($ isNewObject) {
            $ passwordLabel = __ ('Contraseña');
        } más {
            $ passwordLabel = __ ('Nueva contraseña');
        }
        $ confirmLabel = __ ('Confirmación de contraseña');
        $ this -> _ addPasswordFields ($ baseFieldset, $ passwordLabel, $ confirmLabel, $ isNewObject);

        $ baseFieldset-> addField (
            'interface_locale',
            'Seleccione',
            [
                'name' => 'interface_locale',
                'label' => __ ('Configuración regional de interfaz'),
                'title' => __ ('Configuración regional de interfaz'),
                'values' => $ this -> _ LocaleLists-> getTranslatedOptionLocales (),
                'class' => 'select'
            ]
        );

        if ($ this -> _ authSession-> getUser () -> getId ()! = $ model-> getUserId ()) {
            $ baseFieldset-> addField (
                'está activo',
                'Seleccione',
                [
                    'name' => 'is_active',
                    'label' => __ ('Esta cuenta es'),
                    'id' => 'is_active',
                    'title' => __ ('Estado de la cuenta'),
                    'class' => 'input-select',
                    'opciones' => ['1' => __ ('Activo'), '0' => __ ('Inactivo')]
                ]
            );
        }

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

        $ currentUserVerificationFieldset = $ form-> addFieldset (
            'current_user_verification_fieldset',
            ['leyenda' => __ ('Verificación de identidad del usuario actual')]
        );
        $ currentUserVerificationFieldset-> addField (
            self :: CURRENT_USER_PASSWORD_FIELD,
            'contraseña',
            [
                'name' => self :: CURRENT_USER_PASSWORD_FIELD,
                'label' => __ ('Su contraseña'),
                'id' => self :: CURRENT_USER_PASSWORD_FIELD,
                'title' => __ ('Su contraseña'),
                'class' => 'input-text validate-current-password required-entry',
                'required' => verdadero
            ]
        );

        $ datos = $ modelo-> getData ();
        sin establecer ($ datos ['contraseña']);
        unset ($ data [self :: CURRENT_USER_PASSWORD_FIELD]);
        $ form-> setValues ​​($ data);

        $ this-> setForm ($ form);

        return parent :: _ prepareForm ();
    }
}

y algo de código para User.php

espacio de nombres Nombre_proveedor \ Nombre_módulo \ Bloque \ Función \ Cuadrícula;

use \ Magento \ User \ Block \ Role \ Grid \ User como RoleGridUser;
use \ Magento \ Backend \ Block \ Widget \ Grid \ Extended como ExtendedGrid;

clase Usuario extiende RoleGridUser
{
    función protegida _prepareColumns ()
    {
        parent :: _ prepareCollection ();

        $ this-> addColumn (
            'user_image',
            [
                'header' => __ ('Imagen de usuario'),
                'ancho' => 5,
                'align' => 'left',
                'clasificable' => verdadero,
                'index' => 'user_image'
            ]
        );

        return ExtendedGrid :: _ prepareCollection ();
    }
}

Si miras más de cerca, ahora que estoy tratando de agregar un campo con la imagen del usuario.

Desafortunadamente, no veo ningún cambio en el frente de administración. Por supuesto, la columna necesaria fue agregada por el script InstallSchema anteriormente a la tabla ' admin_user '.

Contenido de directorios en formato de árbol:

Nombre del módulo
├── Bloque
│ ├── Catálogo
│ │ └── Producto
│ │ └── RelatedPosts.php
│ ├── Rol
│ │ └── Cuadrícula
│ │ └── User.php
│ └── Usuario
│ └── Editar
└── └── Pestaña
│ └── Main.php
├── composer.json
├── etc.
│ ├── di.xml
│ └── module.xml
├── Configuración
    └── InstallSchema.php

¿Qué hice mal?

Robar
fuente
La solución anterior es excelente, pero los valores no se establecen en los campos agregados ... ¿hay algo más que debamos hacer en el mismo? Básicamente, estamos anulando el formulario Comentarios. Gracias de antemano ..
Great Indian Brain

Respuestas:

24

Para agregar un campo de imagen, puede intentar usar el complemento y siempre tratar de evitar sobrescribir toda la clase.

Proveedor / Módulo / 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>

Proveedor / Módulo / Complemento / Bloque / Adminhtml / Usuario / Editar / Pestaña / 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();
    }
}

Limpiar cache.

Sohel Rana
fuente
Hola Sohel, muchas gracias por tu respuesta! Parece ser exactamente lo que quiero lograr :) Te daré comentarios tan pronto como intente este código localmente. Por cierto, vi que creas un nuevo conjunto de campos y estoy empezando a preguntarme si es posible actualizar uno ya existente, por ejemplo, 'base_fieldset', ¿qué te parece? Además, tengo curiosidad, ¿este enfoque de complemento también cubre los controladores de actualización? Necesito actualizar algunas ideas en el futuro aquí: /module-user/Controller/Adminhtml/User/Save.php- guarde la cadena con la ruta de la imagen en la tabla 'admin_user'. Perdón por muchas preguntas. ¡aprecio tu ayuda! ¡salud!
Rob
Ok, es posible usar un complemento para un controlador, pero en mi caso eso no fue suficiente. De todos modos, sus sugerencias me ayudan a resolver un problema. ¡Gracias otra vez!
Rob
La solución anterior es excelente, pero los valores no se establecen en los campos agregados ... ¿hay algo más que debamos hacer en el mismo? Básicamente, estamos anulando el formulario Comentarios. Gracias de antemano ..
Great Indian Brain
También me interesaría cómo guardar el valor de un nuevo campo en el formulario de usuario admin en la tabla admin_user. ¿Lo resolvió extendiendo / anulando el /module-user/Controller/Adminhtml/User/Save.php Controller?
hallleron
@Sohel Rana, ¿el campo seleccionado no mostrará dónde? o cómo podemos obtener la identificación de usuario actual aquí?
SagarPPanchal
2

después de que algunas investigaciones obtuvieron una solución para esto

agregar nueva propiedad "valor" en el método addField

con el valor que necesitas mira el ejemplo:

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

Espero que ayude a algunos de ustedes ...

tal shulgin
fuente
2

Sustitución de la declaración

return parent::_prepareForm();

con este

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

trabajó para mi. Aquí está el código completo. Agregar el campo "Tienda accesible" de la siguiente manera.

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

}

Y gracias @Rob por compartir la pista por dónde empezar.

dicho
fuente
2

Solo para agregar otro ejemplo de trabajo, he logrado sobrescribir la página de administración del sitio web. Intenté agregar un campo de URL a la página de edición del sitio web.

Hice exactamente lo que se dice en la respuesta validada pero no agregué un nuevo conjunto de campos. En cambio, he completado el existente, usando su identificación definida en la clase del sitio web.

Además, he usado la herencia para recuperar el modelo del sitio web y recuperar el valor actual de la base de datos para ponerlo dentro del formulario (también se copia de la clase del sitio web de Magento).

Como requisito previo, es necesario agregar la columna 'url' en la tabla store_website de la base de datos magento.

Aquí está el resultado de trabajo (probado en 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();
    }
}

Y el archivo di.xml en el directorio Vendor / Store / etc / adminhtml (nada nuevo aquí de la respuesta validada):

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

Acabo de hacer un cambio menor en su solución y funcionó para mí:

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 lo desea, puedo publicar toda la solución, pero tengo que revisarla porque, según las normas de mi empresa, no puedo mostrar el código en foros públicos. Así que avísame si puedes hacerlo tú mismo.

Abid Malik
fuente