Як додати спеціальну вкладку на сторінці профілю користувача?


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 + повинен відповідати вимогам - внесіть ці зміни, очистіть весь кеш, побачте, чи все-таки сторінка не знайдена.
Кевін

Відповіді:


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:ні ключового, ні куди він повинен їхати ... Можливо, документи потрібно вдосконалити / відредагувати? чи я щось пропустив?
Без розмивання

nvm, я бачу, це під _entity_access: і вони використовували node як приклад там, отже чому мій CTRL + F "user:" нічого не знайшов.
Без розмивання

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 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.