ユーザープロファイルページにカスタムタブを追加するにはどうすればよいですか?


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:やどこに行くべきかについて言及していないことは興味深いです...おそらく、ドキュメントを改善/編集する必要がありますか?または何かを逃したのですか?
Sssweatなし2017

nvm、なるほど、それは_entity_access:の下にあり、そこで例としてnodeを使用したので、CTRL + F "user:"が何も見つからなかったのはなぜですか
Sssweatなし17

3

ルートを使用してフォームをロードする方法は2つあります。フォームをロードしてビルド配列の一部として返すコールバックをロードするか、デフォルトで_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

また、メニューに何か必要なものはないと思います。

それらの2つの間に、あなたは行ってもいいはずです!これがわからない場合は、直接私に連絡してください。私はこれを自分の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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.