मैं उपयोगकर्ता प्रोफ़ाइल पृष्ठ में कस्टम टैब कैसे जोड़ूं?


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अपने मॉड्यूल को पूरा करने के लिए एक फ़ाइल (इस मामले में मम्मोडुले नाम दिया गया है)

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

संदर्भ: मार्गों की संरचना


दिलचस्प है कि मार्गों की संरचना में कुंजी का उल्लेख नहीं है user:और न ही इसे कहां जाना चाहिए ... शायद डॉक्स को सुधारने / संपादित करने की आवश्यकता है? या किसी को याद किया था?
कोई Sssweat

nvm, मैं देखता हूं, यह _entity_access के अंतर्गत है : और उन्होंने नोड का उपयोग एक उदाहरण के रूप में किया है, इसलिए मेरे CTRL + F "उपयोगकर्ता:" को कुछ भी नहीं मिला।
कोई Sssweat

3

मार्ग का उपयोग करके फ़ॉर्म को लोड करने के दो तरीके हैं। आप या तो कॉलबैक को लोड कर सकते हैं जो एक फॉर्म लोड करता है और इसे बिल्ड ऐरे के हिस्से के रूप में लौटाता है, या आप डिफॉल्ट के तहत _form पैरामीटर सेट करके सीधे फॉर्म को लोड कर सकते हैं।

आप कार्यशील उदाहरणों को खोजने के लिए कोडबेस को खोज सकते हैं, उन्हें अपने mymodule.rout.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;
  }

मार्ग से सीधे लोड हो रहा है:

यदि आप फॉर्म को सीधे डिफ़ॉल्ट रूप से लोड करना चाहते हैं, तो /core/modules/shortcut/shortcut.rout.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

कुछ चीजें जो मैं हाथ से निकाल सकता हूं ...

आपको EMYTHING का नाम mymodule.account मिला है। मुझे लगता है कि थोड़ा विविधता होगी। कार्य पृष्ठ के लिए इसके साथ जाने पर विचार करें:

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

मैं यह भी नहीं मानता कि आपको इसके लिए मेनू में किसी चीज की जरूरत है।

उन दोनों के बीच, आपको जाना अच्छा होना चाहिए! अगर आप इसे समझ नहीं पा रहे हैं तो सीधे मेरे पास पहुंचें, क्योंकि I --JUST-- को यह मेरे डी 8 पोर्ट ऑन रोल से काम करने के लिए मिला है!


1

Modulename.rout.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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.