사용자 프로필 페이지에서 사용자 정의 탭을 추가하려면 어떻게합니까?


11

사용자 프로필 페이지에 사용자 정의 탭을 추가해야합니다. 아래처럼 경로를 정의했습니다.

mymodule.routing.yml

mymodule.account:
path: '/user/{user}/custom'
defaults: 
  _form: '\Drupal\mymodule\Form\MyModuleUserSettingsForm'
  _title: 'Custom Settings'
  user: \d+
requirements:
  _permission: 'access content'

mymodule.links.task.yml

mymodule.account:
  title: Mymodule Settings
  route_name: mymodule.account
  base_route: entity.user.canonical

mymodule.links.menu.yml

mymodule.account:
  title: My module Settings
  parent: entity.user.canonical
  route_name: mymodule.account

그런 다음 캐시 페이지 지우기 후 프로필 페이지에 나타납니다. 그러나 URL / user / 1 / custom을 열면 페이지를 찾을 수 없다는 메시지가 표시됩니다.


1
사용자 : \ d +는 요구 사항을 충족해야합니다. 변경 사항을 확인하고 모든 캐시를 지우고 여전히 페이지를 찾을 수 없는지 확인하십시오.
Kevin

답변:


5

문제는 mymodule.routing.yml파일에 있으며 큰 문제는의 장소입니다 user: \d+.이 줄은 requirements:섹션 아래에 있어야하며 다른 문제는 들여 쓰기입니다. 따라서 최종 코드는 다음과 같아야합니다.

mymodule.account:
  path: '/user/{user}/custom'
  defaults: 
    _form: '\Drupal\mymodule\Form\MyModuleUserSettingsForm'
    _title: 'Custom Settings'
  requirements:
    _permission: 'access content'
    user: \d+

그리고 물론 폼 클래스 정의가 필요합니다. src/Form/MyModuleUserSettingsForm.php

<?php

namespace Drupal\mymodule\Form;

use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;

/**
 * Class MyModuleUserSettingsForm.
 *
 * @package Drupal\mymodule\Form
 */
class MyModuleUserSettingsForm extends FormBase {

  /**
   * {@inheritdoc}
   */
  public function getFormId() {
    return 'simple_form';
  }

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $form['title'] = [
      '#type' => 'textfield',
      '#title' => $this->t('Title'),
      '#maxlength' => 64,
      '#size' => 64,
      '#required' => TRUE,
    ];
    $form['submit'] = [
      '#type' => 'submit',
      '#value' => t('Submit'),
    ];

    return $form;
  }

  public function validateForm(array &$form, FormStateInterface $form_state) {  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {  }

}

mymodule.info.yml모듈을 완성하기 위한 파일 (이 경우 mymodule)

name: My Module
type: module
description: 'My module'
core: 8.x
package: Custom

참조 : 경로 구조


경로구조가 열쇠 user:와 그 경로를 언급하지 않는다는 점에 흥미가 있습니다 ... 아마도 문서를 개선 / 편집해야합니까? 아니면 내가 뭔가를 그리워 했습니까?
No Sssweat

nvm, 나는 _entity_access 아래에 있으며 노드를 예로 사용했기 때문에 CTRL + F "user :"가 아무것도 찾지 못했습니다.
No Sssweat

3

경로를 사용하여 양식을로드하는 방법에는 두 가지가 있습니다. 폼을로드하고 빌드 배열의 일부로 반환하는 콜백을로드하거나 기본값에서 _form 매개 변수를 설정하여 폼을 직접로드 할 수 있습니다.

코드베이스를 검색하여 작업 예제를 찾아 mymodule.routing.yml에 복사하고 필요에 따라 편집 한 다음 캐시를 다시 빌드 할 수 있습니다.

콜백에서 양식로드 :

접점 모듈에는 실제 예제가 있습니다.

/core/modules/contact/contact.routing.yml

entity.user.contact_form:
  path: '/user/{user}/contact'
  defaults:
    _title: 'Contact'
    _controller: '\Drupal\contact\Controller\ContactController::contactPersonalPage'
  requirements:
    _access_contact_personal_tab: 'TRUE'
    user: \d+

그런 다음 /core/modules/contact/src/Controller/ContactController.php에서

콜백에서 양식을로드하는 방법의 예를 볼 수 있습니다.

  public function contactPersonalPage(UserInterface $user) {
    // Do not continue if the user does not have an email address configured.
    if (!$user->getEmail()) {
      throw new NotFoundHttpException();
    }

    $message = $this->entityManager()->getStorage('contact_message')->create(array(
      'contact_form' => 'personal',
      'recipient' => $user->id(),
    ));

    $form = $this->entityFormBuilder()->getForm($message);
    $form['#title'] = $this->t('Contact @username', array('@username' => $user->getDisplayName()));
    $form['#cache']['contexts'][] = 'user.permissions';
    return $form;
  }

경로에서 직접 양식로드 :

_form 기본값을 사용하여 양식을 직접로드하려면 /core/modules/shortcut/shortcut.routing.yml의 바로 가기 모듈에 예제가 있습니다.

shortcut.set_switch:
  path: '/user/{user}/shortcuts'
  defaults:
    _form: 'Drupal\shortcut\Form\SwitchShortcutSet'
    _title: 'Shortcuts'
  requirements:
    _custom_access: 'Drupal\shortcut\Form\SwitchShortcutSet::checkAccess'
  options:
    _admin_route: TRUE
    user: \d+

이 경우 사용자는 양식에 매개 변수로 전달됩니다. /core/modules/shortcut/src/Form/SwitchShortcutSet.php를 참조하십시오.

  public function buildForm(array $form, FormStateInterface $form_state, UserInterface $user = NULL) {

1

내가 알아낼 수있는 몇 가지 ...

mymodule.account라는 이름의 모든 것이 있습니다. 나는 그것을 조금 다양 화했다. 작업 페이지에 대해이 작업을 고려하십시오.

mymodule.account_tab:
  title: Mymodule Settings
  route_name: mymodule.account
  base_route: entity.user.canonical

또한 메뉴에 아무것도 필요하다고 생각하지 않습니다.

그 둘 사이에 가면 좋을 것입니다! 저 (JUST)가 D8 Apply For Role의 역할을 수행 할 수 있기 때문에이 문제를 파악할 수 없다면 저에게 직접 연락하십시오.


1

modulename.routing.yml에서 아래와 같이 사용자 인수를 전달해야합니다

profile.user_information:
  path: '/user/{user}/profile'
  defaults:
    _form: '\Drupal\profile\Form\UserInformation'
    _title: 'UserInformation'
  requirements:
    _permission: 'access content'
  options:
    user: \d+

그리고 modulename.links.task.yml에는 다음과 같은 코드가 있습니다

profile.user_information:
  title: User profile
  route_name: profile.user_information
  base_route: entity.user.canonical
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.