Làm cách nào để thêm tab tùy chỉnh trong trang hồ sơ người dùng?


11

Tôi cần thêm một tab tùy chỉnh trong trang hồ sơ người dùng. Tôi đã xác định lộ trình của mình như dưới đây:

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

Sau đó, sau khi xóa tab bộ nhớ cache xuất hiện trong trang hồ sơ. Nhưng khi tôi mở url / user / 1 / custom tôi thấy trang không tìm thấy thông báo.


1
người dùng: \ d + nên thực hiện theo yêu cầu - thực hiện thay đổi đó, xóa tất cả bộ đệm, xem bạn có nhận được trang không tìm thấy không.
Kevin

Câu trả lời:


5

Vấn đề của bạn là trong mymodule.routing.ymltập tin, vấn đề lớn là nơi user: \d+, dòng này phải nằm dưới requirements:phần, vấn đề khác là thụt lề. Vì vậy, mã cuối cùng phải là:

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

Và tất nhiên bạn cần định nghĩa lớp biểu mẫu trong 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) {  }

}

Và một mymodule.info.ymltệp để hoàn thành mô-đun của bạn (trong trường hợp này có tên là mymodule)

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

Tham khảo: Kết cấu tuyến đường


Điều thú vị là Cấu trúc của các tuyến đường không đề cập đến khóa user:cũng như không nên đi đâu ... Có lẽ các tài liệu cần phải được cải thiện / chỉnh sửa? hoặc tôi đã bỏ lỡ một cái gì đó?
Không có Sssweat

nvm, tôi thấy, đó là dưới _entity_access: và họ đã sử dụng nút làm ví dụ ở đó, do đó tại sao người dùng CTRL + F "của tôi:" không tìm thấy gì.
Không có Sssweat

3

Có hai cách để tải một biểu mẫu bằng cách sử dụng một tuyến đường. Bạn có thể tải lên một cuộc gọi lại tải một biểu mẫu và trả về nó như là một phần của mảng xây dựng hoặc bạn có thể tải trực tiếp biểu mẫu bằng cách đặt tham số _form theo mặc định.

Bạn có thể tìm kiếm cơ sở mã để tìm các ví dụ hoạt động, sao chép chúng vào mymodule.routing.yml, chỉnh sửa chúng theo nhu cầu của bạn và sau đó xây dựng lại bộ đệm.

Đang tải mẫu từ gọi lại:

Có một ví dụ hoạt động trong mô-đun liên hệ:

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

Sau đó, trong /core/modules/contact/src/Controll/ContactControll.php

bạn có thể xem ví dụ về cách tải biểu mẫu trong cuộc gọi lại:

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

Tải mẫu trực tiếp từ tuyến đường:

Nếu bạn muốn tải biểu mẫu trực tiếp bằng cách sử dụng mặc định _form, có một ví dụ trong mô-đun phím tắt tại /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+

Trong trường hợp này, người dùng được chuyển vào dưới dạng tham số cho biểu mẫu, xem /core/modules/shortcut/src/Form/SwitchShortcutSet.php

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

1

Một vài điều tôi có thể nhận ra ...

Bạn đã có MỌI THỨ tên là mymodule.account. Tôi sẽ đa dạng hóa một chút. Xem xét đi với điều này cho trang nhiệm vụ:

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

Tôi cũng không tin rằng bạn cần bất cứ thứ gì trong menu cho việc này.

Giữa hai người đó, bạn nên đi thật tốt! Vui lòng liên hệ trực tiếp với tôi nếu bạn không thể tìm ra điều này bởi vì tôi - CHỈ-- làm cho nó hoạt động trên cổng Áp dụng cho vai trò D8 của tôi!


1

Trong modulename.routing.yml, bạn phải truyền đối số người dùng như bên dưới

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

và trong modulename.links.task.yml bạn có mã như bên dưới

profile.user_information:
  title: User profile
  route_name: profile.user_information
  base_route: entity.user.canonical
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.