如何隐藏编辑|查看标签?

时间:2010-08-20 12:20:07

标签: drupal drupal-6

我可以隐藏

  

编辑|图

每个节点顶部的

标签?

我在主题设置中搜索了这个选项(全局和标准主题,但我找不到它)。

我仍然希望我的客户能够编辑/管理内容,因此我不能仅删除其权限。

感谢

11 个答案:

答案 0 :(得分:19)

这是一个非常简单的解决方案。 (Drupal 7)

  • 在当前模板中打开 page.tpl.php ,然后搜索 $ tabs 变量。

  • 如果要完全隐藏它,请删除渲染代码。

  • 如果您只想向管理员显示它,请使用此代码

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

    上面的代码检查用户是否是管理员。如果是,它将呈现标签。如果不是它不会渲染它们。

答案 1 :(得分:16)

这确实是一个表达性的东西,而不是功能性的东西,所以它应该在主题层面完成。

覆盖theme_menu_local_tasks()的问题在于,当你真的只想用手术刀去除两个特定的本地任务时,你可以覆盖整个本地任务显示器。所以,你需要更具体一点。

theme_menu_local_tasks()获取当前页面的本地任务并将其传递给menu_local_tasks()。这里使用了两个主题函数:

  1. theme_menu_item_link(),获取任务的链接标记
  2. theme_menu_local_task(),获取任务的<li>元素。
  3. 因此,您可以通过覆盖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 :(得分:9)

在模块方面,您可以执行一些操作,将Edit的菜单项与节点的本地任务分离:

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

编辑路径仍然存在,但现在它与“视图”选项卡无关。这包括编辑页面本身 - 没有“视图”选项卡。

答案 3 :(得分:9)

有一个模块:tab tamer允许隐藏或禁用标签并重命名它们。

答案 4 :(得分:1)

我在template.php中使用了以下主题(这可能有点hacky,我觉得我应该考虑取消设置$ tabs):

function THEME_NAME_menu_local_tasks() {
  return '';
}

或者你可以省略:

if ($tabs) echo $tabs;

来自你的page.tpl.php ...

答案 5 :(得分:1)

查看和编辑是功能特性。他们有理由在那里。

“删除”它们的最佳方法是完全“删除”该功能。毕竟:为什么要删除一个功能的接口,而不是功能本身? 此外,只是不打印选项卡,不会删除 url端点。换句话说:如果您不打印编辑选项卡,人们仍然可以访问编辑页面。

再次:最好是删除该功能:您不想要编辑标签,听起来好像您不想要编辑功能某些用户。 如果是这样,那么只需删除该角色的权限。就这些。标签将消失。

但是,如果您只想以不同方式显示这些标签,Drupal就是您的朋友。您可能已经注意到,它们被称为本地任务而不是标签。这是因为主题决定如何渲染它们:主题是决定将它们显示为标签的东西。

只需覆盖theme_menu_local_tasks()即可为“local-tasks”创建自己的HTML。在您的page-tpl中,只需将$tabs变量移动到您想要的位置即可。

但同样:不要试图通过删除interface-elements来改变应用程序的行为。这不是正确的做法:你应该改变行为,以改变行为:)

答案 6 :(得分: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]);
    }
  }
}

答案 7 :(得分: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;
      }
    }

product是我的内容类型的机器名称,我不希望任何人访问它,包括root用户。

答案 8 :(得分:0)

隐藏标签的最简单方法是在主题css中添加此类

.tabs{ display:none;}

答案 9 :(得分: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]);
    }
  }
}

一旦处理完毕,它就有效:)

答案 10 :(得分:0)

D8解决方案:如果要在某些页面上隐藏所有“本地”选项卡,请记住,块库中列出了“制表符”:在“内容”区域中找到它,并按内容类型,页面URL或用户角色。