Magento 2 Adicione um novo campo ao formulário de administração do Magento_User

11

Eu estou procurando uma boa abordagem com adicionar / atualizar já preparado (por padrão) o formulário do usuário Magento (usuário do módulo). O formulário pode ser acessado no painel de administração por este caminho:

Sistema> Todos os usuários> [usuário_ escolhido]> guia principal de edição do usuário (informações da conta)

Agora estou tentando usar o di.xml no meu módulo personalizado, onde especifico dependências: `

<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 é o conteúdo que eu já criei para uma classe Main.php

// @codingStandardsIgnoreFile

namespace Nome do Fornecedor \ Nome do Módulo \ Bloco \ Usuário \ Editar \ Guia;

use \ Magento \ Usuário \ Bloco \ Usuário \ Editar \ Guia \ Principal 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;

classe Main estende UserEditMainTab
{
    função pública __construct (
        Contexto $ context,
        Registry $ registry,
        FormFactory $ formFactory,
        Sessão $ authSession,
        ListsInterface $ localeLists,
        matriz $ data = []
    ) {
        parent :: __ constrói ($ context, $ registry, $ formFactory, $ authSession, $ localeLists, $ data);
    }

    função protegida _prepareForm ()
    {
        / ** @var $ model \ Magento \ Usuário \ Modelo \ Usuário * /
        $ model = $ this -> _ coreRegistry-> registry ('usuário_acesso');

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

        $ baseFieldset = $ form-> addFieldset ('base_fieldset', ['legend' => __ ('Informações da conta __ TEST')]);

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

        $ baseFieldset-> addField (
            'user_image',
            'imagem',
            [
                'name' => 'user_image',
                'label' => __ ('Imagem do usuário'),
                'id' => 'imagem_do_usuário',
                'title' => __ ('Imagem do usuário'),
                'obrigatório' => falso,
                'note' => 'Permitir tipo de imagem: jpg, jpeg, png'
            ]
        );

        $ baseFieldset-> addField (
            'nome do usuário',
            'texto',
            [
                'nome' => 'nome de usuário',
                'label' => __ ('Nome do usuário'),
                'id' => 'nome de usuário',
                'title' => __ ('Nome do usuário'),
                'obrigatório' => verdadeiro
            ]
        );

        $ baseFieldset-> addField (
            'primeiro nome',
            'texto',
            [
                'name' => 'firstname',
                'label' => __ ('Primeiro nome'),
                'id' => 'primeiro nome',
                'title' => __ ('Primeiro nome'),
                'obrigatório' => verdadeiro
            ]
        );

        $ baseFieldset-> addField (
            'último nome',
            'texto',
            [
                'nome' => 'sobrenome',
                'label' => __ ('Sobrenome'),
                'id' => 'sobrenome',
                'title' => __ ('Sobrenome'),
                'obrigatório' => verdadeiro
            ]
        );

        $ baseFieldset-> addField (
            'o email',
            'texto',
            [
                'name' => 'email',
                'label' => __ ('Email'),
                'id' => 'customer_email',
                'title' => __ ('E-mail do usuário'),
                'class' => 'entrada obrigatória validar e-mail',
                'obrigatório' => verdadeiro
            ]
        );

        $ isNewObject = $ model-> isObjectNew ();
        if ($ isNewObject) {
            $ passwordLabel = __ ('Senha');
        } outro {
            $ passwordLabel = __ ('Nova senha');
        }
        $ confirmLabel = __ ('Confirmação de senha');
        $ this -> _ addPasswordFields ($ baseFieldset, $ passwordLabel, $ confirmLabel, $ isNewObject);

        $ baseFieldset-> addField (
            'interface_locale',
            'selecionar',
            [
                'name' => 'interface_locale',
                'label' => __ ('Local da interface'),
                'title' => __ ('Localidade da interface'),
                'values' => $ this -> _ LocaleLists-> getTranslatedOptionLocales (),
                'classe' => 'selecionar'
            ]
        );

        if ($ this -> _ authSession-> getUser () -> getId ()! = $ model-> getUserId ()) {
            $ baseFieldset-> addField (
                'está ativo',
                'selecionar',
                [
                    'name' => 'is_active',
                    'label' => __ ('Esta conta é'),
                    'id' => 'is_active',
                    'title' => __ ('Status da conta'),
                    'class' => 'seleção de entrada',
                    'opções' => ['1' => __ ('Ativo'), '0' => __ ('Inativo')]
                ]
            );
        }

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

        $ currentUserVerificationFieldset = $ form-> addFieldset (
            'current_user_verification_fieldset',
            ['legend' => __ ('Verificação atual de identidade do usuário')]
        );
        $ currentUserVerificationFieldset-> addField (
            self :: CURRENT_USER_PASSWORD_FIELD,
            'senha',
            [
                'name' => self :: CURRENT_USER_PASSWORD_FIELD,
                'label' => __ ('Sua senha'),
                'id' => self :: CURRENT_USER_PASSWORD_FIELD,
                'title' => __ ('Sua senha'),
                'class' => 'texto de entrada validar-senha-atual-entrada obrigatória',
                'obrigatório' => verdadeiro
            ]
        );

        $ data = $ model-> getData ();
        não definido ($ data ['senha']);
        não definido ($ data [self :: CURRENT_USER_PASSWORD_FIELD]);
        $ form-> setValues ​​($ dados);

        $ this-> setForm ($ formulário);

        retornar pai :: _ prepareForm ();
    }
}

e algum código para User.php

namespace Nome_Vendedor \ Nome_Módulo \ Bloco \ Função \ Grade;

use \ Magento \ Usuário \ Bloco \ Função \ Grade \ Usuário como RoleGridUser;
use \ Magento \ Backend \ Block \ Widget \ Grid \ Extended como ExtendedGrid;

classe User estende RoleGridUser
{
    função protegida _prepareColumns ()
    {
        pai :: _ prepareCollection ();

        $ this-> addColumn (
            'user_image',
            [
                'header' => __ ('Imagem do usuário'),
                'width' => 5,
                'align' => 'left',
                'classificável' => verdadeiro,
                'index' => 'imagem_do_usuário'
            ]
        );

        return ExtendedGrid :: _ prepareCollection ();
    }
}

Se você olhar mais de perto, já está tentando adicionar um campo à imagem do usuário.

Infelizmente, não vejo nenhuma alteração na frente do administrador. Obviamente, a coluna necessária foi adicionada pelo script InstallSchema anteriormente à tabela ' admin_user '.

Conteúdo dos diretórios em um formato de árvore:

Nome do módulo
├── Bloco
│ ├── Catálogo
│ │ └── Produto
Related │ └── RelatedPosts.php
│ ├── Função
│ │ └── Grade
User │ ─── User.php
│ └── Usuário
Edit └── Editar
Guia Tab └──
Main └── Main.php
Compos── composer.json
├── etc
Di ├── di.xml
Module └── module.xml
├── Configuração
    Install── InstallSchema.php

O que eu fiz errado?

Roubar
fonte
A solução acima é ótima, mas os valores não são definidos nos campos adicionados ... existe mais alguma coisa que precisamos fazer da mesma maneira. Basicamente, estamos substituindo o formulário Comentários. Agradecemos antecipadamente ..
Great Indian Brain

Respostas:

24

Para adicionar campo de imagem, você pode tentar usar o plug-in e sempre tentar substituir a classe inteira.

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

Fornecedor / Módulo / Plugin / Bloco / Adminhtml / Usuário / Editar / Guia / 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();
    }
}

Limpar cache.

Sohel Rana
fonte
Hey Sohel, muito obrigado pela sua resposta! Parece ser exato o que eu quero alcançar :) Eu darei um feedback assim que eu tentar esse código localmente. A propósito, vi que você criou um novo conjunto de campos e estou começando a me perguntar se é possível atualizar um já existente, por exemplo, 'base_fieldset', o que você acha? Além disso, estou curioso, essa abordagem de plug-in também abrange a atualização de controladores? Eu preciso atualizar algumas idéias no futuro aqui: /module-user/Controller/Adminhtml/User/Save.php- salve a string com o caminho da imagem na tabela 'admin_user'. Desculpe por muitas perguntas. Agradeço sua ajuda! Felicidades!
22717 Rob
Ok, é possível usar o plugin para um controlador, mas no meu caso isso não foi suficiente. De qualquer forma, suas sugestões me ajudam a resolver um problema. Agradeço novamente!
21417 Rob
A solução acima é ótima, mas os valores não são definidos nos campos adicionados ... existe mais alguma coisa que precisamos fazer da mesma maneira. Basicamente, estamos substituindo o formulário Comentários. Agradecemos antecipadamente ..
Great Indian Brain
Também estaria interessado em como salvar o valor de um novo campo no formulário de usuário administrador na tabela admin_user. Você resolveu estender / substituir o /module-user/Controller/Adminhtml/User/Save.php Controller?
Hallleron
@Sohel Rana, o campo selecionado não mostrará onde? ou como podemos obter o ID do usuário atual aqui?
SagarPPanchal
2

depois de alguma pesquisa conseguiu uma solução para isso

adicione nova propriedade "value" no método addField

com o valor que você precisa. veja o exemplo:

        $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 ajude alguns de vocês ..

tal shulgin
fonte
2

Substituindo a instrução

return parent::_prepareForm();

com isso

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

trabalhou para mim. Aqui está o código completo. Adicionando o campo "Accessible Store" da seguinte maneira.

<?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 obrigado @Rob por compartilhar a pista por onde começar.

saiid
fonte
2

Apenas para adicionar outro exemplo, consegui substituir a página de administração do site. Eu estava tentando adicionar um campo de URL à página de edição do site.

Fiz exatamente o que foi dito na resposta validada, mas não adicionei um novo conjunto de campos. Em vez disso, concluí o existente, usando seu ID definido na classe Website.

Além disso, usei a herança para recuperar o modelo do site e recuperar o valor atual do banco de dados para colocá-lo no formulário (também é copiado da classe Magento Website).

Como pré-requisito, é necessário adicionar a coluna 'url' na tabela store_website do banco de dados magento.

Aqui está o resultado do trabalho (testado no 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 o arquivo di.xml no diretório Vendor / Store / etc / adminhtml (nada de novo aqui na resposta 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
fonte
0

Acabei de fazer uma pequena alteração na sua solução e funcionou para mim:

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 você quiser, posso postar toda a solução - mas preciso revisá-la porque, de acordo com as normas da minha empresa, não consigo mostrar o código em fóruns públicos. Então, deixe-me saber se você pode fazer isso sozinho.

Abid Malik
fonte