Magento 2 Magento_User 관리 양식에 새 필드 추가


11

추가 / 업데이트가 이미 기본적으로 준비된 Magento User (모듈 사용자) 양식으로 좋은 접근 방식을 찾고 있습니다. 다음 경로를 통해 관리자 패널에서 양식에 도달 할 수 있습니다.

시스템> 모든 사용자> [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,
        레지스트리 $ 레지스트리
        FormFactory $ formFactory,
        세션 $ authSession,
        인터페이스 $ localeLists,
        배열 $ data = []
    ) {
        parent :: __ construct ($ context, $ registry, $ formFactory, $ authSession, $ localeLists, $ data);
    }

    보호 된 함수 _prepareForm ()
    {
        / ** @var $ model \ 마 젠토 \ 사용자 \ 모델 \ 사용자 * /
        $ model = $ this-> _ coreRegistry-> 레지스트리 ( 'permissions_user');

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

        $ baseFieldset = $ form-> addFieldset ( 'base_fieldset', [ 'legend'=> __ ( '계정 정보 __ 테스트')]);

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

        $ baseFieldset-> addField (
            'user_image',
            '영상',
            [
                'name'=> 'user_image',
                'label'=> __ ( '사용자 이미지'),
                'id'=> 'user_image',
                'title'=> __ ( '사용자 이미지'),
                '필수'=> 거짓,
                'note'=> '이미지 유형 허용 : jpg, jpeg, png'
            ]
        );

        $ baseFieldset-> addField (
            '사용자 이름',
            '본문',
            [
                'name'=> '사용자 이름',
                'label'=> __ ( '사용자 이름'),
                'id'=> '사용자 이름',
                'title'=> __ ( '사용자 이름'),
                '필수'=> true
            ]
        );

        $ baseFieldset-> addField (
            '이름',
            '본문',
            [
                'name'=> '이름',
                'label'=> __ ( '이름'),
                'id'=> '이름',
                'title'=> __ ( '이름'),
                '필수'=> true
            ]
        );

        $ baseFieldset-> addField (
            '성',
            '본문',
            [
                'name'=> '성',
                'label'=> __ ( '성' '),
                'id'=> '성',
                'title'=> __ ( '성' '),
                '필수'=> true
            ]
        );

        $ baseFieldset-> addField (
            '이메일',
            '본문',
            [
                'name'=> '이메일',
                'label'=> __ ( '이메일'),
                'id'=> 'customer_email',
                'title'=> __ ( '사용자 이메일'),
                'class'=> '필수 항목 확인 이메일',
                '필수'=> true
            ]
        );

        $ isNewObject = $ model-> isObjectNew ();
        if ($ isNewObject) {
            $ passwordLabel = __ ( '비밀번호');
        } else {
            $ passwordLabel = __ ( '새 비밀번호');
        }
        $ confirmationLabel = __ ( '비밀번호 확인');
        $ this-> _ addPasswordFields ($ baseFieldset, $ passwordLabel, $ confirmationLabel, $ isNewObject);

        $ baseFieldset-> addField (
            'interface_locale',
            '고르다',
            [
                'name'=> 'interface_locale',
                'label'=> __ ( '인터페이스 로캘'),
                'title'=> __ ( '인터페이스 로캘'),
                'values'=> $ this-> _ LocaleLists-> getTranslatedOptionLocales (),
                'class'=> '선택'
            ]
        );

        if ($ this-> _ authSession-> getUser ()-> getId ()! = $ model-> getUserId ()) {
            $ baseFieldset-> addField (
                '활성',
                '고르다',
                [
                    'name'=> 'is_active',
                    'label'=> __ ( '이 계정은'),
                    'id'=> 'is_active',
                    'title'=> __ ( '계정 상태'),
                    'class'=> '입력 선택',
                    'options'=> [ '1'=> __ ( 'Active'), '0'=> __ ( '비활성')]
                ]
            );
        }

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

        $ currentUserVerificationFieldset = $ form-> addFieldset (
            'current_user_verification_fieldset',
            [ 'legend'=> __ ( '현재 사용자 신원 확인')]
        );
        $ currentUserVerificationFieldset-> addField (
            self :: CURRENT_USER_PASSWORD_FIELD,
            '암호',
            [
                'name'=> self :: CURRENT_USER_PASSWORD_FIELD,
                'label'=> __ ( '귀하의 비밀번호'),
                'id'=> self :: CURRENT_USER_PASSWORD_FIELD,
                'title'=> __ ( '귀하의 비밀번호'),
                'class'=> '입력 텍스트 유효성 검사 현재 암호 필요 입력',
                '필수'=> true
            ]
        );

        $ data = $ model-> getData ();
        unset ($ data [ '암호']);
        설정 해제 ($ data [self :: CURRENT_USER_PASSWORD_FIELD]);
        $ form-> setValues ​​($ data);

        $ this-> setForm ($ form);

        부모 반환 :: _ prepareForm ();
    }
}

User.php에 대한 코드

네임 스페이스 Vendor_Name \ Module_Name \ Block \ Role \ Grid;

\ Magento \ User \ Block \ Role \ Grid \ User를 RoleGridUser로 사용하십시오.
\ Magento \ Backend \ Block \ Widget \ Grid \ ExtendedGrid로 사용하십시오.

User 클래스는 RoleGridUser를 확장합니다
{
    보호 된 함수 _prepareColumns ()
    {
        부모 :: _ prepareCollection ();

        $ this-> addColumn (
            'user_image',
            [
                'header'=> __ ( '사용자 이미지'),
                'width'=> 5,
                'align'=> '왼쪽',
                'sortable'=> true,
                'index'=> 'user_image'
            ]
        );

        ExtendedGrid :: _ prepareCollection ()을 반환합니다.
    }
}

좀 더 자세히 살펴보면 사용자 이미지가있는 필드를 추가하려고합니다.

불행히도, 나는 admin front에 어떤 변화도 보이지 않습니다. 물론 필요한 열은 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>

공급 업체 / 모듈 / 플러그인 / 블록 / 관리자 HTML / 사용자 / 편집 / 탭 /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, 답변 해 주셔서 감사합니다. 내가 달성하고자하는 정확한 것 같습니다 :)이 코드를 로컬로 시도하자마자 피드백을 줄 것입니다. 그건 그렇고, 당신이 새로운 fieldset을 생성하고 이미 존재하는 것을 업데이트 할 수 있는지 궁금해지기 시작했습니다 (예 : 'base_fieldset') 어떻게 생각하십니까? 또한 궁금합니다.이 플러그인 접근법은 컨트롤러 업데이트에도 적용됩니까? 나중에 여기에 몇 가지 생각을 업데이트해야합니다 /module-user/Controller/Adminhtml/User/Save.php.- 'admin_user'테이블에 이미지 경로가있는 문자열을 저장하십시오. 많은 질문에 대해 죄송합니다. 당신의 도움을 주셔서 감사합니다! 건배!
Rob

좋아, 컨트롤러에 플러그인을 사용할 수는 있지만 내 경우에는 충분하지 않습니다. 어쨌든 귀하의 제안은 문제 해결에 도움이됩니다. 다시 한번 감사드립니다!
Rob

위의 해결 방법은 훌륭하지만 추가 된 필드에 값이 설정되지 않았습니다. 기본적으로 리뷰 양식을 재정의하고 있습니다. 미리 감사드립니다.
위대한 인디언 브레인

또한 admin 사용자 양식의 새 필드 값을 admin_user 테이블에 저장하는 방법에 관심이 있습니다. /module-user/Controller/Adminhtml/User/Save.php Controller를 확장 / 재정 의하여 해결 했습니까?
hallleron

@Sohel Rana, 선택된 필드는 어디에 표시되지 않습니까? 또는 현재 사용자 ID를 어떻게 얻을 수 있습니까?
SagarPPanchal

2

일부 연구가 이것에 대한 해결책을 얻은 후에

addField 메소드에서 새 특성 "value"추가

필요한 가치로. 예제를보십시오 :

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

나를 위해 일했다. 다음은 완전한 코드입니다. 다음과 같이 "액세스 가능한 저장소"필드를 추가하십시오.

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

다른 실제 예제를 추가하기 위해 웹 사이트 관리 페이지를 덮어 쓰는 데 성공했습니다. 웹 사이트 편집 페이지에 URL 필드를 추가하려고했습니다.

나는 검증 된 답변에서 말한 것을 정확하게했지만 새 필드 세트를 추가하지 않았습니다. 대신 웹 사이트 클래스에 정의 된 ID를 사용하여 기존 항목을 완성했습니다.

또한 상속을 사용하여 웹 사이트 모델을 검색하고 데이터베이스에서 현재 값을 검색하여 양식에 넣습니다 (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.