web-dev-qa-db-ja.com

ユーザープロファイルにタブを追加/削除する方法は?

サイトのセカンダリメニューにある[マイアカウント]リンクをクリックすると、ユーザーはユーザーのプロフィールページにリダイレクトされます。

このページには多くのタブがあります。一部のタブは元々そこにあり、いくつかのタブはいくつかのモジュールによって作成されました。このメニューにタブを追加する方法を理解しました(ビューを作成して/user/%user/XXXのパスを与えるだけです)。

別の方法はありますか?
ユーザーのプロファイルメニューからタブを削除するにはどうすればよいですか?

このユーザープロファイルメニューがDrupalのメニューセクションにないのはなぜですか?

私の目標は、次のタブ(下のスクリーンショットを参照)を削除することです:「HybridAuth」、「あなたの質問」、および「ポイント」タブ。 enter image description here

5
EB84

あなたは Tab Tamer モジュールを探しているかもしれません:

タブテイマーは、タブとサブタブの簡単な並べ替え、非表示、非アクティブ化を提供する管理ユーティリティです。タブラベルの名前を変更することもできます。

6
Clive

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を取得します。
8
inizio

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ドキュメントを確認するように、私が任せることにします。このコードを実装するには、少なくとも、カスタムフォーム(および/またはここで必要なものに応じてコントローラー)を使用するプロセスを理解する必要があります。

4
Anton

別の方法はありますか?

Drupalでは、常に別の方法があります。実際、より簡単な方法は見過ごされがちです。

ユーザーのプロファイルメニューからタブを削除するにはどうすればよいですか?

Drupal生成されたタブを特にユーザーページから非表示にして、独自のタブに追加することができます。

  1. / admin/structure/blockに移動します
  2. 「コンテンツ」領域で「タブ」ブロックを見つけ、「構成」をクリックします。
  3. [表示]セクションで[ページ]を選択します。
  4. 入る /user/*をテキスト領域に表示し、[リストされたページを非表示にする]を選択します。
  5. 必要なリンクを含む新しいメニューを作成します。
  6. 以前に使用したブロックページで、目的の領域の下にある[ブロックを配置]を選択します。
  7. 新しいメニューを選択します。
  8. 前の手順を使用して、ユーザーページにのみブロックを表示します。
  9. 必要に応じてブロックのテーマを設定します。

このユーザープロファイルメニューがDrupalのメニューセクションにないのはなぜですか?

「タブ」ブロックはコンテキスト依存です。つまり、アクセスしているページとそれに接続されているモジュールに応じて自動的に生成されます。この場合、ユーザーページからのみ除外する必要があるのはこのためです。それらをすべて一緒に除外すると、(おそらく)望ましくない結果になります。

1
dimmech

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');

        }   

    }

}

0
DesignWork

私の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モジュールをさらにインストールすると、問題が発生する可能性があります。

少なくとも私のユースケースではそれで十分です。

0
118218

クリーンな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']);
}
0
Ben Cassinat