Bagaimana cara menambahkan tab khusus di halaman profil pengguna?

11

Saya perlu menambahkan tab khusus di halaman profil pengguna. Saya mendefinisikan rute saya seperti di bawah ini:

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

Kemudian setelah tab cache jelas muncul di halaman profil. Tetapi ketika saya membuka url / user / 1 / custom saya melihat halaman tidak menemukan pesan.

ARUN
sumber
1
pengguna: \ d + harus memenuhi persyaratan - buat perubahan itu, kosongkan semua cache, lihat apakah Anda masih mendapatkan halaman yang tidak ditemukan.
Kevin

Jawaban:

5

Masalah Anda ada di mymodule.routing.ymlfile, masalah besar adalah tempat user: \d+, baris ini harus di bawah requirements:bagian, masalah lainnya adalah lekukan. Jadi kode terakhirnya harus:

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

Dan tentu saja Anda memerlukan definisi bentuk kelas di 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) {  }

}

Dan mymodule.info.ymlfile untuk melengkapi modul Anda (dalam hal ini bernama mymodule)

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

Referensi: Struktur rute

Adrian Cid Almaguer
sumber
Menarik bahwa Struktur rute tidak menyebutkan kunci user:atau ke mana harus pergi ... Mungkin dokumen perlu diperbaiki / diedit? atau apakah saya melewatkan sesuatu?
No Sssweat
nvm, saya melihat, itu di bawah _entity_access: dan mereka menggunakan simpul sebagai contoh di sana, maka mengapa CTRL + F "user:" saya tidak menemukan apa pun.
No Sssweat
3

Ada dua cara untuk memuat formulir menggunakan rute. Anda bisa memuat panggilan balik yang memuat formulir dan mengembalikannya sebagai bagian dari susunan bentukan, atau Anda bisa memuat formulir secara langsung dengan mengatur parameter _form di bawah default.

Anda dapat mencari basis kode untuk menemukan contoh yang berfungsi, menyalinnya ke mymodule.routing.yml Anda, mengeditnya sesuai kebutuhan Anda dan kemudian membangun kembali cache.

Memuat formulir dari panggilan balik:

Ada contoh yang berfungsi di modul kontak:

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

Kemudian di /core/modules/contact/src/Controller/ContactController.php

Anda dapat melihat contoh cara memuat formulir di callback:

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

Memuat formulir langsung dari rute:

Jika Anda ingin memuat form secara langsung menggunakan default _form, ada contoh di modul shortcut di /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+

Dalam hal ini, pengguna dilewatkan sebagai parameter ke formulir, lihat /core/modules/shortcut/src/Form/SwitchShortcutSet.php

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

Beberapa hal yang dapat saya temukan begitu saja ...

Anda punya SEMUA yang bernama mymodule.account. Saya akan melakukan diversifikasi sedikit. Pertimbangkan untuk menggunakan ini untuk halaman tugas:

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

Saya juga tidak percaya Anda perlu sesuatu dalam menu baik untuk ini.

Di antara keduanya, Anda harus baik-baik saja! Jangan ragu untuk menghubungi saya secara langsung jika Anda tidak dapat mengetahuinya karena saya - HANYA - membuat ini berfungsi pada port D8 saya dari Terapkan Untuk Peran!

Jnicola
sumber
1

Dalam modulename.routing.yml Anda harus memberikan argumen pengguna seperti di bawah ini

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

dan di modulename.links.task.yml Anda memiliki kode seperti di bawah ini

profile.user_information:
  title: User profile
  route_name: profile.user_information
  base_route: entity.user.canonical
Debasish
sumber