Как скрыть Править | Посмотреть вкладки? - PullRequest
24 голосов
/ 20 августа 2010

Могу ли я скрыть

Редактировать |Просмотреть

вкладок в верхней части каждого узла?

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

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

спасибо

Ответы [ 10 ]

19 голосов
/ 16 июля 2011

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

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

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

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

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

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

16 голосов
/ 20 августа 2010

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

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

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

  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";  
  }
}

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

9 голосов
/ 18 октября 2011

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

9 голосов
/ 20 августа 2010

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

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

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

1 голос
/ 30 апреля 2014

Для всех, кто сталкивается с этим вопросом при поиске решения 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 голос
/ 20 августа 2010

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

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

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

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

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

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

1 голос
/ 20 августа 2010

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

function THEME_NAME_menu_local_tasks() {
  return '';
}

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

if ($tabs) echo $tabs;

с вашей страницы.tpl.php ...

0 голосов
/ 03 ноября 2014

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

/**
 * 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 голосов
/ 15 ноября 2013

Самое простое решение для скрытия вкладок - добавить этот класс в вашу тему. Css

.tabs{ display:none;}
0 голосов
/ 28 апреля 2012

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

Я получил ответ от @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.

...