web-dev-qa-db-ja.com

編集を非表示にする方法|タブを表示しますか?

隠してもいいですか

編集|見る

各ノードの上部にあるタブ?

このオプションをテーマ設定で検索しました(グローバルテーマと標準テーマの両方ですが、見つかりませんでした)。

顧客がコンテンツを編集/管理できるようにしたいので、コンテンツの権限を削除することはできません。

ありがとう

24
aneuryzm

これは実際には機能的なものではなく、プレゼンテーション的なものであるため、テーマレベルで行う必要があります。

theme_menu_local_tasks()のオーバーライドの問題は、2つの特定のローカルタスクを削除するためにメスで本当にそこにアクセスしたい場合に、ローカルタスクディスプレイ全体を変更または変更することです。したがって、もう少し具体的にする必要があります。

theme_menu_local_tasks() は、現在のページのローカルタスクを取得し、それらを menu_local_tasks() に渡します。ここでは、2つのテーマ関数が使用されています。

  1. theme_menu_item_link() 、タスクのリンクマークアップを取得します
  2. theme_menu_local_task() 、タスクの_<li>_要素を取得します。

したがって、ViewおよびEditローカルタスクをtheme_menu_item_link()およびtheme_menu_local_task()をオーバーライドして、それらのチェックを含めることによる、非常に堅牢な方法:

_function mytheme_menu_item_link($link) {
  // Local tasks for view and edit nodes shouldn't be displayed.
  if ($link['type'] & MENU_LOCAL_TASK && ($link['path'] === 'node/%/edit' || $link['path'] === 'node/%/view')) {
    return '';
  }
  else {
    if (empty($link['localized_options'])) {
      $link['localized_options'] = array();
    }

    return l($link['title'], $link['href'], $link['localized_options']);
  }
}

function mytheme_menu_local_task($link, $active = FALSE) {
  // Don't return a <li> element if $link is empty
  if ($link === '') {
    return '';
  }
  else {
    return '<li '. ($active ? 'class="active" ' : '') .'>'. $link ."</li>\n";  
  }
}
_

これにより、メニュールーターのアイテムを変更するのではなく、メニュールーターのパスに依存し、コアの機能やテーマに最小限の変更を加えるだけで、目的の結果を得ることができます。

16
user113292

これは非常に簡単な解決策です。 (Drupal 7)

  • 現在のテンプレートでpage.tpl.phpを開き、$ tabs変数を検索します。

  • 完全に非表示にする場合は、レンダリングコードを削除します。

  • 管理者のみに表示したい場合は、このコードを使用してください

    <?php if ($tabs and $is_admin): ?>
    <div class="tabs">
      <?php print render($tabs); ?>
    </div>
    

    上記のコードは、ユーザーが管理者であるかどうかを確認します。ある場合は、タブがレンダリングされます。そうでない場合は、レンダリングされません。

19
ANDiTKO

そのためのモジュールがあります: tab tamer タブを非表示または無効にして、名前を変更することもできます。

9
uwe

モジュール側では、ノードのローカルタスクから編集のメニューエントリを切り離すことができます。

function custom_menu_alter(&$items) {
  $items['node/%node/edit']['type'] = MENU_CALLBACK;
}

編集パスはまだ残っていますが、[表示]タブに関連付けられていません。これには編集ページ自体が含まれます-そこには[表示]タブがありません。

9
Grayside

D7ソリューションを探しているときにこの質問に遭遇したすべての人にとって: https://drupal.stackexchange.com/a/77964/15055 に記載されているように、それはhook_menu_local_tasks_alter()です

/**
 * Implements hook_menu_local_tasks_alter() to unset unwanted tabs
 */
function MYMODULE_menu_local_tasks_alter(&$data) {
  foreach ($data['tabs'][0]['output'] as $key => $value) {
    if ($value['#link']['path'] == 'node/%/view') {
      unset($data['tabs'][0]['output'][$key]);
    }
  }
}
1
leymannx

私はテーマごとにtemplate.phpで以下を使用します(おそらく少しハッキーですが、代わりに$ tabsの設定を解除することを検討する必要があると思います):

function THEME_NAME_menu_local_tasks() {
  return '';
}

または省略できます:

if ($tabs) echo $tabs;

あなたのpage.tpl.phpから...

1
CitrusTree

表示と編集は機能的な機能です。彼らはそこにいる理由があります。

それらを「削除」する最良の方法は、その機能をすべて「削除」することです。結局のところ、なぜinterfaceを削除するのですかfunctionality自体を削除しないのですか?その上、単にタブを印刷せず、rl endpointsを削除しません。つまり、編集タブを印刷しなくても、編集ページにアクセスできます。

繰り返しますが、その機能を削除するのが最善です。editタブが必要ないという事実は、特定のユーザーに対してedit機能が不要であるかのように聞こえます。その場合は、そのロールの権限を削除してください。以上です。タブはなくなります。

ただし、単にこれらのタブを別の方法で表示する、Drupalはあなたの友達です。お気づきのように、これらはローカルタスク)と呼ばれますではなくtabs。これは、テーマがレンダリング方法を決定するためです。テーマは、タブとして表示することを決定するものです。

単にtheme_menu_local_tasks()をオーバーライドして、「local-tasks」用の独自のHTMLを作成します。そして、あなたのpage-tplで、単に$tabs変数を必要な場所に移動します。

ただし、繰り返しになります。インターフェイス要素を削除して、アプリの動作を変更しようとしないでください。それは正しいことではありません。動作を変更するには、動作を変更する必要があります:)

1
berkes

タブを非表示にする最も簡単な解決策は、テーマのCSSにこのクラスを追加することです

.tabs{ display:none;}
0
Fahad Ur Rehman

D8ソリューション:特定のページでall「ローカル」タブを非表示にする場合は、「タブ」がブロックライブラリにリストされていることを忘れないでください。「コンテンツ」領域で見つけ、コンテンツタイプで除外します。ページのURLまたはユーザーの役割。

0
William Turrell

最後の答えをありがとう。ただし、この詳細に注意してください。そのまま使用すると機能しません。リテラルは「または」で丸める必要があります。両方を丸める必要はありません。したがって、次のようにする必要があります。

/**
 * Implements hook_menu_local_tasks_alter() to unset unwanted tabs
 */
function MYMODULE_menu_local_tasks_alter(&$data) {
  foreach ($data['tabs'][0]['output'] as $key => $value) {
    if ($value['#link']['path'] == "node/%/view") {
      unset($data['tabs'][0]['output'][$key]);
    }
  }
}

それを世話したら、それは機能します:)

0
oscaral

これは、作者が尋ねた質問に対する答えではありません。しかし、どういうわけか私と同じような問題に直面している他のユーザーにとっては便利かもしれません。これをここに入力するのに適していない場合はお知らせください。

@graysideから回答を得て、ビューを非表示にするように少し変更しました。必要なコンテンツタイプに基づいてノードからタブを編集します。

    function MYMODULE_menu_alter(&$items) { 
      $items['node/%node/view']['access callback'] = 'MYMODULE_disable_node_view';
      $items['node/%node/view']['access arguments'] = array(1); 
    } 

    function MYMODULE_disable_node_view($node){
      if($node->type == 'product'){
        return false;
      }
    }

productは私のコンテンツタイプのマシン名です。rootユーザーを含めてそれにアクセスしたくありません。

0
cww