Подтвердить что ты не робот

Как скрыть Редактировать | Просмотреть вкладки?

Можно ли скрыть

Изменить | Вид

вкладки вверху каждого node?

Я искал эту опцию в настройках темы (как для глобальной, так и для стандартной темы, но я не мог ее найти).

Я все еще хочу, чтобы мой клиент мог редактировать/администрировать контент, поэтому я не могу просто удалить его.

спасибо

4b9b3361

Ответ 1

Это действительно презентационная вещь, а не функциональная вещь, поэтому ее нужно делать на уровне темы.

Проблема с переопределением theme_menu_local_tasks() заключается в том, что вы переопределяете/принимаете топор на весь локальный экран задач, когда вы действительно хотите попасть туда с помощью скальпеля для удаления двух конкретных локальных задач. Итак, вам нужно получить более конкретную информацию.

theme_menu_local_tasks() получает текущие локальные задачи и передает их menu_local_tasks(). Здесь используются две функции темы:

Итак, вы можете избавиться от 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";  
  }
}

Таким образом, вы полагаетесь на путь маршрутизатора меню, не изменяя элемент меню маршрутизатора, и добиваясь результата, который вы хотите с минимальными изменениями в функциональности ядра или тематике.

Ответ 2

здесь очень простое решение для вас. (Drupal 7)

  • Откройте page.tpl.php в текущем шаблоне и найдите переменную $tabs.

  • Удалите код рендеринга, если вы хотите полностью его скрыть.

  • Если вы хотите отобразить его только для администраторов, используйте этот код

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

    Вышеприведенный код проверяет, является ли пользователь администратором. Если он отобразит вкладки. Если нет, это не сделает их.

Ответ 3

На стороне модуля вы можете сделать что-то, что отделяет запись меню Edit от локальных задач для node:

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

Путь редактирования все еще существует, но теперь он не связан с вкладкой "Вид". Это включает в себя страницу редактирования - нет вкладки "Просмотр".

Ответ 4

для этого есть модуль: tab tamer позволяет скрывать или отключать вкладки и также переименовывать их.

Ответ 5

Я использую следующее в template.php по теме (что, возможно, немного взломано, я чувствую, что я должен рассматривать возможность отмены $tabs вместо):

function THEME_NAME_menu_local_tasks() {
  return '';
}

Или вы можете опустить:

if ($tabs) echo $tabs;

на странице page.tpl.php...

Ответ 6

Просмотр и редактирование - это функциональные функции. У них есть причина быть там.

Лучший способ "удалить" их - это "удалить" эту функцию alltogether. В конце концов: зачем удалять интерфейс части функциональности, но не самой функциональности? Кроме того, просто не распечатывая вкладки, не удаляет конечные точки url. Другими словами: если вы не распечатываете вкладку редактирования, люди могут получить доступ к странице редактирования.

Опять же: лучше всего удалить эту функциональность. Тот факт, что вы не хотите вкладку редактирования, звучит так, как будто вы не хотите, чтобы функции редактирования для определенных пользователей. Если да, то просто удалите это разрешение для этой роли. Вот и все. Вкладки исчезнут.

Если, однако, вы просто хотите отображать эти вкладки по-разному, Drupal - ваши друзья. Как вы могли заметить, они называются локальными задачами, а не вкладками. Это потому, что тема решает, как их отображать: тема - это то, что решает показать их как вкладки.

Просто переопределите theme_menu_local_tasks(), чтобы создать свой собственный HTML для "локальных задач". И в вашей странице-tpl просто переместите переменную $tabs в нужное место, где вы хотите.

Но опять же: не пытайтесь изменить поведение приложения, удалив интерфейсные элементы. Это неправильная вещь: вы должны изменить поведение, чтобы изменить поведение:)

Ответ 7

Для всех людей, которые наткнулись на этот вопрос, ища решение 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]);
    }
  }
}

Ответ 8

Это не ответ на вопрос о том, что автор спросил. Но почему-то это может быть полезно для других пользователей, которые сталкиваются с подобной проблемой со мной. Пожалуйста, дайте мне знать, если это не подходит для ввода здесь.

Я получаю ответ от @grayside и немного изменил, чтобы скрыть представление | отредактировать вкладку из node в зависимости от типа содержимого, которое я хочу.

    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 - это имя моего типа содержимого, я не хочу, чтобы anywant имел к нему доступ, включая пользователя root.

Ответ 9

Простейшим решением скрыть вкладки является добавление этого класса в тему css

.tabs{ display:none;}

Ответ 10

Спасибо за последний ответ. Но имейте в виду эту деталь: если вы попробуете ее как есть - она ​​не может работать: литералы должны быть просто округлены с помощью "или", а не с ними обоими. Так что это должно быть:

/**
 * 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]);
    }
  }
}

Как только он позаботится об этом, он работает:)

Ответ 11

Решение D8: Если вы хотите скрыть все "локальные" вкладки на определенных страницах, помните, что "Вкладки" перечислены в библиотеке блоков: найдите их в области "Содержимое" и исключите по типу содержимого, URL-адресу страницы или роли пользователя.