ฉันจะเพิ่มแท็บที่กำหนดเองในหน้าโปรไฟล์ผู้ใช้ได้อย่างไร


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 / กำหนดเองฉันเห็นข้อความไม่พบหน้า


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:และควรไปที่ไหน ... บางทีเอกสารนั้นจำเป็นต้องได้รับการปรับปรุง / แก้ไข? หรือฉันคิดถึงอะไรบางอย่าง?
ไม่มี Sssweat

nvm ฉันเห็นมันอยู่ภายใต้_entity_access:และพวกเขาใช้โหนดเป็นตัวอย่างที่นั่นดังนั้นทำไม CTRL + F "ผู้ใช้ของฉัน:" ไม่พบอะไรเลย
ไม่มี Sssweat

3

มีสองวิธีในการโหลดแบบฟอร์มโดยใช้เส้นทาง คุณสามารถโหลดการเรียกกลับที่โหลดแบบฟอร์มและส่งกลับเป็นส่วนหนึ่งของอาร์เรย์การสร้างหรือคุณสามารถโหลดแบบฟอร์มโดยตรงโดยการตั้งค่าพารามิเตอร์ _form ภายใต้ค่าเริ่มต้น

คุณสามารถค้นหา codebase เพื่อค้นหาตัวอย่างการทำงานคัดลอกลงใน 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.