আমি কীভাবে ব্যবহারকারীর প্রোফাইল পৃষ্ঠায় কাস্টম ট্যাব যুক্ত করব?


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

তারপরে পরিষ্কার ক্যাশে ট্যাবটি প্রোফাইল পৃষ্ঠায় উপস্থিত হচ্ছে। তবে আমি যখন ইউআরএল / ব্যবহারকারী / 1 / কাস্টমটি খুলি তখন পৃষ্ঠাটি বার্তা খুঁজে পাওয়া যায়নি।


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:না যেখানে এটি কোথায় যাওয়া উচিত ... সম্ভবত ডকগুলিকে উন্নত / সম্পাদনা করা দরকার? নাকি আমি কিছু মিস করেছি?
কোনও এসসিওয়েট

এনভিএম, আমি দেখতে পাচ্ছি, এটি _entity_access এর অধীনে রয়েছে: এবং তারা সেখানে নোডকে উদাহরণ হিসাবে ব্যবহার করেছে, সুতরাং আমার সিটিআরএল + এফ "ব্যবহারকারী:" কিছুই খুঁজে পেল না।
কোনও এসসিওয়েট

3

একটি রুট ব্যবহার করে কোনও ফর্ম লোড করার দুটি উপায় রয়েছে। হয় আপনি একটি কলব্যাক লোড করতে পারেন যা কোনও ফর্ম লোড করে এবং বিল্ড অ্যারের অংশ হিসাবে এটি প্রদান করে, বা আপনি ডিফল্টর অধীনে _for পরামিতি সেট করে ফর্মটি সরাসরি আপ করতে পারেন up

কার্যকারী উদাহরণগুলি খুঁজে পেতে আপনি কোডবেসটি অনুসন্ধান করতে পারেন, আপনার মাইমডিউল.আউটটিং.আইএমএল এ এটি অনুলিপি করতে পারেন, আপনার প্রয়োজন অনুসারে এডিট করুন এবং তারপরে ক্যাশেটি পুনর্নির্মাণ করতে পারেন।

কলব্যাক থেকে ফর্ম লোড হচ্ছে:

যোগাযোগের মডিউলটিতে একটি কার্যকারী উদাহরণ রয়েছে:

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

তারপরে / কোরআর / মডিউলস / যোগাযোগ / এসআরসি / নিয়ন্ত্রণকারী / কনট্যাক্ট কন্ট্রোলআরএফপি

কলব্যাকে কীভাবে কোনও ফর্ম লোড করবেন তার একটি উদাহরণ দেখতে পাবেন:

  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 ডিফল্ট ব্যবহার করে সরাসরি ফর্মটি লোড করতে চান তবে / কোর / মডুলস / শর্টকাট / শর্টকুট.আরআউটিং.আইএমএল-এর শর্টকাট মডিউলে একটি উদাহরণ রয়েছে

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+

এই ক্ষেত্রে, ব্যবহারকারী ফর্মের প্যারামিটার হিসাবে পাস হয়, দেখুন / কোর / মডুলস / শর্টকাট / এসআরসি / ফার্ম / সুইচশোর্টকসেট.পিপি

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

1

আমি হাতছাড়া করতে পারি এমন কয়েকটি জিনিস ...

আপনি মাইমডিউল.অ্যাকউন্টের নামকরণ করেছেন। আমি কিছুটা বৈচিত্র্যময় করব। টাস্ক পৃষ্ঠার জন্য এটির সাথে যেতে বিবেচনা করুন:

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

আমি বিশ্বাস করি না যে এর জন্য আপনার মেনুতে কোনও কিছুর প্রয়োজন আছে।

এই দুজনের মধ্যে, আপনার যাওয়া ভাল হওয়া উচিত! আপনি যদি এটি নির্ধারণ করতে না পারেন তবে আমার কাছে সরাসরি যোগাযোগ করুন কারণ আমি - জাস্ট-- আমার ডি 8 বন্দরের ভূমিকার জন্য আবেদন করুন!


1

মডিউলনাম.আউটটিং.আইএমএলে আপনাকে নীচের মত ব্যবহারকারীর যুক্তি পাস করতে হবে

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

এবং মডিউলনাম.লিংকস.টাস্ক.আইএমএলে আপনার নীচের মত কোড রয়েছে have

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.