サイトのセカンダリメニューにある[マイアカウント]リンクをクリックすると、ユーザーはユーザーのプロフィールページにリダイレクトされます。
このページには多くのタブがあります。一部のタブは元々そこにあり、いくつかのタブはいくつかのモジュールによって作成されました。このメニューにタブを追加する方法を理解しました(ビューを作成して/user/%user/XXX
のパスを与えるだけです)。
別の方法はありますか?
ユーザーのプロファイルメニューからタブを削除するにはどうすればよいですか?
このユーザープロファイルメニューがDrupalのメニューセクションにないのはなぜですか?
私の目標は、次のタブ(下のスクリーンショットを参照)を削除することです:「HybridAuth」、「あなたの質問」、および「ポイント」タブ。
あなたは Tab Tamer モジュールを探しているかもしれません:
タブテイマーは、タブとサブタブの簡単な並べ替え、非表示、非アクティブ化を提供する管理ユーティリティです。タブラベルの名前を変更することもできます。
TabTamer のようなcontribモジュールを使用したくない場合は、Drupal 7の場合、 hook_menu_alterを使用できます。 access callback
を使用してMENU TABを無効にします
/**
* Implementing hook_menu_alter
* Restrict MENU TABS access
*/
function MODULE_NAME_menu_alter(&$items) {
if(/* check your conditions */) {
$items['user/%user/hybridauth']['access callback'] = FALSE;//Change the MENU PATH as per your requirement.
}
}
注意
$items
変数を出力して、MENU PATHを取得します。Drupal 8の場合、2つの方法でこれに対処できました。
ユーザーアカウントのタブアイテムの名前を変更/タブアイテムを削除hook_menu_local_tasks_alter :
/**
* Implements hook_menu_local_tasks_alter().
*/
function MYMODULE_menu_local_tasks_alter(&$data, $route_name) {
if ($route_name == 'entity.user.canonical') {
foreach ($data['tabs'][0] as $type => &$tab) {
// Replace the "View" tab name with "Hola"
if ($type == 'entity.user.canonical' && $tab['#link']['title'] == 'View') {
$tab['#link']['title'] = 'Hola';
}
unset($tab);
}
// Hide the "Edit" tab entirely
unset($data['tabs'][0]['entity.user.edit_form']);
}
}
注意すべきことの1つは、これによって実際にユーザーの編集リンクにアクセスできなくなるわけではなく、ユーザープロファイルの上部にあるタブから単に非表示になるだけです。実際に何かを非表示にするには、ルーティングを実装する必要があります。
新しいタブ項目を追加します。この場合は、「ステータス」フォームです。
mymodule.links.menu.yml:
mymodule.account_status:
title: 'Status'
parent: 'entity.user.canonical'
route_name: 'mymodule.account_status'
mymodule.links.task.yml:
mymodule.account_status:
title: 'Status'
route_name: 'mymodule.account_status'
base_route: 'entity.user.canonical'
mymodule.routing.yml:
mymodule.account_status:
path: '/user/{user}/status'
defaults:
_form: 'Drupal\mymodule\Form\AccountStatusForm'
_title: 'Status'
requirements:
_permission: 'access content'
user: \d+
mymodule/src/Form/AccountStatusForm.php:
namespace Drupal\subscription\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
/**
* Account status form
*/
class AccountStatusForm extends FormBase {
/**
* {@inheritdoc}
*/
public function getFormId() {
return 'mymodule_account_status_form';
}
/**
* {@inheritdoc}
*/
public function buildForm(array $form, FormStateInterface $form_state) {
// TODO: Build form
return $form;
}
/**
* {@inheritdoc}
*/
public function submitForm(array &$form, FormStateInterface $form_state) {
// TODO: Handle submit
}
}
この回答はかなり詳細なので、不明な点がある場合はD8ドキュメントを確認するように、私が任せることにします。このコードを実装するには、少なくとも、カスタムフォーム(および/またはここで必要なものに応じてコントローラー)を使用するプロセスを理解する必要があります。
別の方法はありますか?
Drupalでは、常に別の方法があります。実際、より簡単な方法は見過ごされがちです。
ユーザーのプロファイルメニューからタブを削除するにはどうすればよいですか?
Drupal生成されたタブを特にユーザーページから非表示にして、独自のタブに追加することができます。
/user/*
をテキスト領域に表示し、[リストされたページを非表示にする]を選択します。このユーザープロファイルメニューがDrupalのメニューセクションにないのはなぜですか?
「タブ」ブロックはコンテキスト依存です。つまり、アクセスしているページとそれに接続されているモジュールに応じて自動的に生成されます。この場合、ユーザーページからのみ除外する必要があるのはこのためです。それらをすべて一緒に除外すると、(おそらく)望ましくない結果になります。
Drupal 8.では、タブの名前を変更するのがはるかに簡単になります。
function mymodule_menu_local_tasks_alter(&$data, $route_name) {
foreach ($data['tabs'][0] as $type => &$tab) {
// Replace the "View" tab name with "view account"
if ($type == 'entity.user.canonical') {
$tab['#link']['title'] = t('view account');
}
// Replace the "Edit" tab name with "edit account"
if ($type == 'entity.user.edit_form') {
$tab['#link']['title'] = t('change password');
}
}
}
私のDrupalインストールのユーザーページでhook_menu_alter()がトリガーされなかったため、私はhook_menu_local_tasks_alter()を使用して別の方法でそれを行うことができました:
function hook_menu_local_tasks_alter(&$data, $router_item, $root_path) {
unset($data['tabs'][0]['output'][2]);
}
2は、削除するタブの位置です。
このアプローチの問題は、削除したいタブの位置が、おそらく別のモジュールによって変更される可能性があることです。その後、contribモジュールをさらにインストールすると、問題が発生する可能性があります。
少なくとも私のユースケースではそれで十分です。
クリーンなDrupal 8の方法では、 documentation で説明されているように、 modulename_local_tasks_alter ()を使用してタスクを変更できます
/**
* Implements hook_local_tasks_alter().
*/
function modulename_local_tasks_alter(&$local_tasks) {
// Remove unwanted tabs
// Here, we'll remove the "Payment method" tasks from the user edit tasks
unset($local_tasks['entity.commerce_payment_method.collection']);
}