I am looking for a good approach with add/update already prepared (by default) Magento User's (module-user) form. Form can be reached in admin panel by this path:

System > All users > [chosen_user] > User's main edit tab (Account Information)

Now I'm trying with using di.xml in my custom module where I specify dependencies: `

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

`

This is content that I've already made for a Main.php class


// @codingStandardsIgnoreFile

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

use \Magento\User\Block\User\Edit\Tab\Main as 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;

class Main extends UserEditMainTab
{
    public function __construct(
        Context $context,
        Registry $registry,
        FormFactory $formFactory,
        Session $authSession,
        ListsInterface $localeLists,
        array $data = []
    ) {
        parent::__construct($context, $registry, $formFactory, $authSession, $localeLists, $data);
    }

    protected function _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' => __('Account Information __ 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',
            'image',
            [
                'name' => 'user_image',
                'label' => __('User Image'),
                'id' => 'user_image',
                'title' => __('User Image'),
                'required' => false,
                'note' => 'Allow image type: jpg, jpeg, png'
            ]
        );

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

        $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->_LocaleLists->getTranslatedOptionLocales(),
                '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();
    }
}

and some code for User.php

namespace Vendor_Name\Module_Name\Block\Role\Grid;

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

class User extends RoleGridUser
{
    protected function _prepareColumns()
    {
        parent::_prepareCollection();

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

        return ExtendedGrid::_prepareCollection();
    }
}

If you take a look closer you already now that I'm trying to add a field with user's image.

Unfortunately, I don't see any changes in admin front. Of course, needed column was added by InstallSchema script earlier to 'admin_user' table.

Contents of directories in a tree-like format:

Module_Name
├── Block
│   ├── Catalog
│   │   └── Product
│   │       └── RelatedPosts.php
│   ├── Role
│   │   └── Grid
│   │       └── User.php
│   └── User
│       └── Edit
│           └── Tab
│               └── Main.php
├── composer.json
├── etc
│   ├── di.xml
│   └── module.xml
├── Setup
    └── InstallSchema.php

What Did I do Wrong?

  • The above solution is great but the values are not set on the added fields..is there anything else we need to do on the same. We are basically overriding the Reviews form. Thanks in advance.. – Great Indian Brain Jul 25 '17 at 10:58
up vote 9 down vote accepted

For adding image field, you can try using plugin and always try to avoid overwrite whole class.

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

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

Clear cache.

  • Hey Sohel, thanks a lot for your response! It seems to be exact what I want to achieve :) I'll give you feedback as soon as I try this code locally. By the way, I saw that you create new fieldset and I'm starting to wonder if it's possible to update already existing one, e.g. 'base_fieldset', what do you think? Also, I am curious, is this plugin approach cover updating controllers too? I need to update some thinks in future here: /module-user/Controller/Adminhtml/User/Save.php - save string with image's path in 'admin_user' table. Sorry about many questions. appreciate your help! cheers! – Rob May 14 '17 at 18:29
  • Ok, it's possible to use plugin for a controller, but in my case that was not sufficient. Anyway, your suggestions help me to resolve a problem. Thank you once again! – Rob May 16 '17 at 5:58
  • The above solution is great but the values are not set on the added fields..is there anything else we need to do on the same. We are basically overriding the Reviews form. Thanks in advance.. – Great Indian Brain Jul 25 '17 at 10:59
  • I would also be interested in how to save the value of a new field in admin user form to admin_user table. Did you solve it extending/overriding the /module-user/Controller/Adminhtml/User/Save.php Controller? – hallleron Apr 24 at 7:30
  • @Sohel Rana, selected field will not show where ? or how to we can get current user id here ? – SagarPPanchal Jun 29 at 6:09

after some research got a solution for this

add new property "value" in addField method

with the value you need. see the example:

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

I hope it will help some of you ..

I just did a minor change in your solution and it worked for me :

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

}

If you want, I can post the whole solution -- but I have to revise it because as per my company norms I cannot show the code on public forums. So just let me know if you can do it yourself.

Your Answer

 
discard

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.