ユーザープロファイルページにカスタムタブを追加する必要があります。私は以下のように私のルートを定義しました:
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を開くと、ページが見つかりませんというメッセージが表示されます。
あなたの問題は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
参考:ルートの構造
ルートを使用してフォームをロードする方法は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) {
手に負えないことがいくつかあります...
Mymodule.accountという名前のものがすべてあります。少し多様化させたいと思います。タスクページについては、これを検討してください。
mymodule.account_tab:
title: Mymodule Settings
route_name: mymodule.account
base_route: entity.user.canonical
また、メニューに何か必要なものはないと思います。
それらの2つの間に、あなたは行ってもいいはずです!これがわからない場合は、直接私に連絡してください。私はこれを自分のD8ポートのApply For Roleで機能させるためです。
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