如何在用户个人资料页面中添加自定义标签?


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 +应该满足要求-进行更改,清除所有缓存,看看是否仍然找不到页面。
凯文

Answers:


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:也没有提到密钥的位置...也许需要改进/编辑文档?还是我错过了什么?
没有Sssweat

我看到nvm_entity_access他们在那里使用node作为示例,因此为什么我的CTRL + F“ user:”找不到任何东西。
没有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

我也认为您也不需要菜单中的任何内容。

在这两者之间,您应该很好!如果您无法解决问题,请直接与我联系,因为我-只是-可以在我的D8端口“申请角色”上使用它!


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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.