2010-08-20 5 views
23

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

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

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

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

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

благодаря

+1

Я не вижу причин для удаления ссылки редактирования, если тогда пользователям по-прежнему разрешено редактировать узлы. Вкладка просмотра исчезнет, ​​если нет других вкладок, так как вкладка вида является по умолчанию один. – kiamlaluno

+1

В прошлом меня спрашивали незнакомые вещи клиентами, а не удаляли ссылку на редактирование! В конце концов, достаточно легко отредактировать контент, используя фильтр в/admin/content/node. Возможно, OP должен прыгать и уточните, почему они хотят это сделать, однако в любом случае вопрос был ИМХО. – CitrusTree

+1

Да. Я не хочу менять внешний интерфейс. Вот почему я хочу их удалить. Но, конечно же, я хочу, чтобы мой клиент мог редактировать их из исходных текстов. – aneuryzm

ответ

16

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

Проблема с переопределением 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"; 
    } 
} 

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

1

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

function THEME_NAME_menu_local_tasks() { 
    return ''; 
} 

Или вы могли бы ommit :

if ($tabs) echo $tabs; 

из вашего page.tpl.php ...

+0

Вы никогда не должны менять функциональность с помощью темы. Это плохая практика, которая в какой-то момент приведет к проблемам. Это «просто неправильная практика кодирования». – berkes

+0

Я согласен в некоторой степени, но OP не хочет влиять на функциональность, они хотят, чтобы ссылки не показывались, что для меня является проблемой темы. – CitrusTree

+0

Но «не показывать ссылки» аналогично «влиянию на функциональность». Почему еще вы хотите скрыть какой-либо элемент интерфейса, который имеет четкую функциональность? – berkes

1

Просмотр и редактирование весело ctional. У них есть причина быть там.

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

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

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

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

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

+1

OP не хочет удалять функциональность, как указано явно, - просто спрячьте ссылки. – CitrusTree

+1

Название вопроса говорит _disable_, и вопрос требует сокрытия ссылок. В обоих случаях результатом будет то, что никто не сможет редактировать узел, который является функциональной функцией. Если есть необходимость скрыть ссылку на редактирование, тогда можно не дать разрешение на редактирование типа контента для некоторых правил. Я не думаю, что безоговорочно скрыть ссылку на редактирование (что должно было бы скрыть ее даже для пользователя № 1) было бы хорошей идеей. Для меня, кажется, вопрос задан, потому что непонимание того, как работает Drupal. – kiamlaluno

+0

Если название говорит об отключении или скрытии, оно по-прежнему относится к [вкладкам], а не к функциональности. Следует ли скрывать вкладки или нет, это не вопрос, и не следует ли удалять функциональность, поэтому вопрос заключается в том, как ссылки отключены/скрыты и т. Д. Я уверен, что вы согласны с тем, что в некоторых случаях мы делаем вещи, которые не являются «правильными» в наших мнениях, например, клиент, настаивающий на том, что эти вкладки скрыты по их собственным причинам. Независимо от причины, или по другой причине, я не вижу действительного аргумента, который указывает, что эти вкладки должны оставаться, если функциональность все еще существует. – CitrusTree

8

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

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

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

18

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

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

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

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

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

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

+0

Drupal будет печатать только ЛЮБЫЕ вкладки, если их два или более, и единственная причина, по которой будет отображаться вкладка «Редактировать», - это если у пользователя есть разрешение на редактирование страницы (например, пользователь является администратором) ... так что было бы лучше просто контролировать доступ к редактированию этого конкретного типа контента на странице разрешений, чем выполнять избыточную проверку на уровне темы. Одновременно делает сайт более безопасным. – geerlingguy

+1

Какое носовое кровотечение легко реализуется и изящно отвечает. Или, может быть, это просто отвечает на точный вопрос, о котором я думал. Несмотря ни на что, спасибо! – Screenack

+0

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

C13L0

9

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

0

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

Я получаю ответ от @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; 
     } 
    } 

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

0

Самое простое решение, чтобы скрыть вкладки, чтобы добавить этот класс в вашей теме CSS

.tabs{ display:none;} 
1

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

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

/** 
* 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

Пожалуйста, используйте функцию комментариев вместо функции ответа, если вы хотите что-то сказать в существующем ответе. – leymannx

Смежные вопросы