Magento 2新しいフィールドをMagento_User管理フォームに追加


11

追加/更新が(デフォルトで)Magentoユーザーの(モジュール-ユーザー)フォームを既に準備している良いアプローチを探しています。フォームには、次のパスで管理パネルにアクセスできます。

システム>すべてのユーザー> [chosen_user]>ユーザーのメイン編集タブ(アカウント情報)

次に、依存関係を指定するカスタムモジュールでdi.xmlを使用してみます。`

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

`

これは、Main.phpクラス用にすでに作成したコンテンツです

// @codingStandardsIgnoreFile

名前空間Vendor_Name \ Module_Name \ Block \ User \ Edit \ Tab;

\ Magento \ User \ Block \ User \ Edit \ Tab \ MainをUserEditMainTabとして使用します。
\ Magento \ Backend \ Block \ Template \ Contextを使用します。
\ Magento \ Framework \ Registryを使用します。
\ Magento \ Framework \ Data \ FormFactoryを使用します。
\ Magento \ Backend \ Model \ Auth \ Sessionを使用します。
\ Magento \ Framework \ Locale \ ListsInterfaceを使用します。

MainクラスはUserEditMainTabを拡張します
{
    パブリック関数__construct(
        コンテキスト$ context、
        レジストリ$ registry、
        FormFactory $ formFactory、
        セッション$ authSession、
        ListsInterface $ localeLists、
        配列$ data = []
    ){
        parent :: __ construct($ context、$ registry、$ formFactory、$ authSession、$ localeLists、$ data);
    }

    保護された関数_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']);
        } そうしないと {
            if(!$ model-> hasData( 'is_active')){
                $ model-> setIsActive(1);
            }
        }

        $ baseFieldset-> addField(
            'user_image'、
            '画像'、
            [
                '名前' => 'ユーザー画像'、
                'ラベル' => __( 'ユーザー画像')、
                'id' => 'user_image'、
                'title' => __( 'User Image')、
                '必須' => false、
                'note' => 'Allow image type:jpg、jpeg、png'
            ]
        );

        $ baseFieldset-> addField(
            'ユーザー名'、
            'テキスト'、
            [
                '名前' => 'ユーザー名'、
                'ラベル' => __( 'ユーザー名')、
                'id' => 'ユーザー名'、
                'title' => __( 'ユーザー名')、
                '必須' => true
            ]
        );

        $ baseFieldset-> addField(
            'ファーストネーム'、
            'テキスト'、
            [
                '名前' => '名'、
                'ラベル' => __( '名')、
                'id' => 'firstname'、
                'title' => __( 'First Name')、
                '必須' => true
            ]
        );

        $ baseFieldset-> addField(
            '苗字'、
            'テキスト'、
            [
                '名前' => '姓'、
                'ラベル' => __( '姓')、
                'id' => '姓'、
                'title' => __( '姓')、
                '必須' => true
            ]
        );

        $ baseFieldset-> addField(
            'Eメール'、
            'テキスト'、
            [
                '名前' => 'メール'、
                'ラベル' => __( 'メール')、
                'id' => 'customer_email'、
                'title' => __( 'User Email')、
                'class' => 'required-entry validate-email'、
                '必須' => true
            ]
        );

        $ isNewObject = $ model-> isObjectNew();
        if($ isNewObject){
            $ passwordLabel = __( 'Password');
        } そうしないと {
            $ passwordLabel = __( '新しいパスワード');
        }
        $ confirmationLabel = __( 'パスワードの確認');
        $ this-> _ addPasswordFields($ baseFieldset、$ passwordLabel、$ confirmationLabel、$ isNewObject);

        $ baseFieldset-> addField(
            'interface_locale'、
            '選択する'、
            [
                'name' => 'interface_locale'、
                'label' => __( 'Interface Locale')、
                'title' => __( 'Interface Locale')、
                'values' => $ this-> _ LocaleLists-> getTranslatedOptionLocales()、
                'クラス' => '選択'
            ]
        );

        if($ this-> _ authSession-> getUser()-> getId()!= $ model-> getUserId()){
            $ baseFieldset-> addField(
                'アクティブです'、
                '選択する'、
                [
                    '名前' => 'is_active'、
                    'label' => __( 'このアカウントは')、
                    'id' => 'is_active'、
                    'title' => __( 'アカウントステータス')、
                    'クラス' => '入力選択'、
                    'オプション' => ['1' => __( 'アクティブ')、 '0' => __( '非アクティブ')]
                ]
            );
        }

        $ 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、
            'パスワード'、
            [
                '名前' => self :: CURRENT_USER_PASSWORD_FIELD、
                'ラベル' => __( 'あなたのパスワード')、
                'id' => self :: CURRENT_USER_PASSWORD_FIELD、
                'title' => __( 'あなたのパスワード')、
                'class' => 'input-text validate-current-password required-entry'、
                '必須' => true
            ]
        );

        $ data = $ model-> getData();
        unset($ data ['password']);
        unset($ data [self :: CURRENT_USER_PASSWORD_FIELD]);
        $ form-> setValues($ data);

        $ this-> setForm($ form);

        parent :: _ prepareForm();を返します。
    }
}

User.phpのコード

名前空間Vendor_Name \ Module_Name \ Block \ Role \ Grid;

RoleGridUserとして\ Magento \ User \ Block \ Role \ Grid \ Userを使用します。
ExtendedGridとして\ Magento \ Backend \ Block \ Widget \ Grid \ Extendedを使用します。

クラスUserはRoleGridUserを拡張します
{
    保護された関数_prepareColumns()
    {
        parent :: _ prepareCollection();

        $ this-> addColumn(
            'user_image'、
            [
                'header' => __( 'User Image')、
                '幅' => 5
                'align' => 'left'、
                'sortable' => true、
                'インデックス' => 'user_image'
            ]
        );

        ExtendedGrid :: _ prepareCollection();を返します。
    }
}

よく見てみると、ユーザーの画像を含むフィールドを追加しようとしていることがわかります。

残念ながら、私は管理画面で何の変更も見ていません。もちろん、必要な列はInstallSchemaスクリプトによって以前に ' admin_user 'テーブルに追加されました。

ツリーのような形式のディレクトリの内容:

Module_Name
├──ブロック
│├──カタログ
││└───製品
││└──RelatedPosts.php
│├──役割
││└──グリッド
││└──User.php
│└──ユーザー
│└──編集
│└──タブ
│└──Main.php
├──composer.json
├──など
│├──di.xml
│└──module.xml
├──セットアップ
    └──InstallSchema.php

何を間違えたか


上記の解決策は素晴らしいですが、追加されたフィールドに値が設定されていません。同じことを行うために他に必要なことはありますか?基本的にはレビューフォームを上書きしています。事前のおかげで...
グレートインドの脳

回答:


24

画像フィールドを追加するには、プラグインを使用して、クラス全体を上書きしないようにしてください。

ベンダー/モジュール/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();
    }
}

キャッシュの消去。


こんにちはSohel、あなたの返事に感謝します!私が達成したいことは正確な​​ようです:)このコードをローカルで試したらすぐにフィードバックを提供します。ところで、私はあなたが新しいフィールドセットを作成するのを見たのですが、 'base_fieldset'などの既存のフィールドセットを更新できるかどうか疑問に思い始めています。どう思いますか?また、私は好奇心旺盛です、このプラグインのアプローチはコントローラの更新もカバーしていますか?私は将来ここでいくつかの考えを更新する必要があります:/module-user/Controller/Adminhtml/User/Save.php-'admin_user'テーブルに画像のパスで文字列を保存します。多くの質問について申し訳ありません。あなたの助けに感謝!乾杯!
Rob

さて、コントローラーにプラグインを使用することは可能ですが、私の場合はそれでは不十分でした。とにかく、あなたの提案は私が問題を解決するのに役立ちます。もう一度ありがとう!
ロブ

上記の解決策は素晴らしいですが、追加されたフィールドに値が設定されていません。同じことを行うために他に必要なことはありますか?基本的にはレビューフォームを上書きしています。事前のおかげで...
グレートインドの脳

また、adminユーザーフォームの新しいフィールドの値をadmin_userテーブルに保存する方法にも興味があります。/module-user/Controller/Adminhtml/User/Save.php Controllerを拡張/オーバーライドして解決しましたか?
ハレロン

@Sohel Rana、選択したフィールドはどこに表示されませんか?またはここで現在のユーザーIDを取得するにはどうすればよいですか?
SagarPPanchal

2

いくつかの研究がこれに対する解決策を得た後

addFieldメソッドに新しいプロパティ「値」を追加する

あなたが必要とする値で。例を参照してください:

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

皆さんのお役に立てれば幸いです。


2

ステートメントの置き換え

return parent::_prepareForm();

これとともに

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

私のために働いた。これが完全なコードです。次のように「Accessible Store」フィールドを追加します。

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

}

そして、どこから始めるべきか手がかりを共有してくれた@Robに感謝します。


2

別の実際の例を追加するために、私はWebサイトの管理ページを上書きすることに成功しました。Webサイトの編集ページにURLフィールドを追加しようとしました。

検証済みの回答で述べられていることを正確に行いましたが、新しいフィールドセットを追加しませんでした。代わりに、Webサイトクラスで定義されたIDを使用して、既存のものを完成させました。

さらに、継承を使用してWebサイトモデルを取得し、データベースから現在の値を取得してフォーム内に配置しました(Magento Websiteクラスからもコピーされます)。

前提条件として、magentoデータベースのstore_websiteテーブルに「url」列を追加する必要があります。

動作結果は次のとおりです(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();
    }
}

そして、Vendor / Store / etc / adminhtmlディレクトリにあるdi.xmlファイル(ここでは検証された回答から新しいものはありません):

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

0

私はあなたの解決策にちょっとした変更を加えました、そしてそれは私のために働きました:

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

}

必要に応じて、ソリューション全体を投稿することもできますが、会社の規範に従ってパブリックフォーラムにコードを表示できないため、修正する必要があります。自分でできるかどうか教えてください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.