web-dev-qa-db-fra.com

Comment cacher Edit | Afficher les onglets?

Puis-je cacher le 

Modifier | Vue

des onglets au-dessus de chaque noeud?

J'ai recherché cette option dans les paramètres de thème (thème global et standard, mais je ne pouvais pas le trouver).

Je souhaite toujours que mon client puisse éditer/administrer le contenu, je ne peux donc pas simplement en retirer l'autorisation.

merci

24
aneuryzm

C'est vraiment une présentation, pas une fonctionnalité, cela devrait donc être fait au niveau du thème. 

Le problème avec le remplacement de theme_menu_local_tasks() est que vous substituez/passez une hachette à l’affichage complet de la tâche locale, alors que vous voulez vraiment y entrer avec un scalpel pour supprimer deux tâches locales spécifiques. Donc, vous devez être un peu plus précis.

theme_menu_local_tasks() récupère les tâches locales de la page en cours et les transmet à menu_local_tasks() . Ici, deux fonctions de thème sont utilisées:

  1. theme_menu_item_link() , qui obtient le balisage de lien pour la tâche
  2. theme_menu_local_task() , qui obtient l'élément <li> pour la tâche.

Vous pouvez donc vous débarrasser des tâches locales View et Edit de manière très robuste en surchargeant theme_menu_item_link() et theme_menu_local_task() pour inclure votre chèque:

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

De cette façon, vous utilisez le chemin du routeur de menu, sans modifier l'élément de routeur de menu, et vous obtenez le résultat souhaité avec un minimum de modifications apportées aux fonctionnalités principales ou à la thématisation.

16
user113292

voici une solution très simple pour vous. (Drupal 7)

  • Ouvrez votre page.tpl.php dans votre modèle actuel et recherchez la variable $ tabs .

  • Supprimez le code de rendu si vous souhaitez le masquer complètement.

  • Si vous voulez l'afficher uniquement aux administrateurs, utilisez ce code

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

    Le code ci-dessus vérifie si l'utilisateur est administrateur. Si c'est le cas, les onglets seront rendus. Sinon, il ne les rendra pas.

18
ANDiTKO

il existe un module pour cela: tab tamer permet de cacher ou de désactiver les tabs et de les renommer.

9
uwe

Du côté du module, vous pouvez faire quelque chose qui dissocie l’entrée de menu Edition des tâches locales pour le noeud:

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

Le chemin d'édition est toujours là, mais il n'est pas associé à l'onglet Vue. Cela inclut la page d’édition elle-même - pas d’onglet Vue.

9
Grayside

Pour toutes les personnes qui tombent sur cette question en cherchant une solution D7: Comme indiqué sur https://drupal.stackexchange.com/a/77964/15055 c'est 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

J'utilise ce qui suit dans template.php par thème (qui est peut-être un peu hacky, je pense que je devrais plutôt envisager de supprimer les onglets $):

function THEME_NAME_menu_local_tasks() {
  return '';
}

Ou vous pouvez omettre:

if ($tabs) echo $tabs;

depuis votre page.tpl.php ...

1
CitrusTree

View et Edit sont des fonctionnalités fonctionnelles. Ils ont une raison d'être là. 

Le meilleur moyen de les "supprimer" est de "supprimer" toutes ces fonctionnalités. Après tout: pourquoi supprimer la interface d’une fonctionnalité, mais pas la la fonctionnalité elle-même? En outre, ne pas simplement imprimer les onglets ne supprime pas les extrémités url . En d'autres termes: si vous n'imprimez pas l'onglet d'édition, les utilisateurs peuvent toujours accéder à la page d'édition. 

Encore une fois, le mieux est de supprimer cette fonctionnalité: le fait que vous ne souhaitiez pas l’onglet edit tab, donne l’impression que vous ne souhaitez pas utiliser la fonctionnalité edit pour certains utilisateurs. Si c'est le cas, supprimez simplement cette autorisation pour ce rôle. C'est tout. Les onglets seront partis.

Si, toutefois, vous souhaitez simplement afficher ces onglets différemment , Drupal est votre ami. Comme vous l'avez peut-être remarqué, elles s'appellent tâches locales et non onglets . C'est parce que le thème décide comment les rendre: le thème est la chose qui décide de les afficher sous forme d'onglets.

Remplacez simplement la theme_menu_local_tasks() pour créer votre propre code HTML pour les "tâches locales". Et dans votre page-tpl, déplacez simplement la variable $tabs vers un endroit où vous le souhaitez.

Mais encore une fois: n'essayez pas de changer le comportement de l'application en supprimant les éléments d'interface. Ce n'est pas la bonne chose à faire: vous devriez changer le comportement, afin de changer le comportement :)

1
berkes

La solution la plus simple pour masquer les onglets est d’ajouter cette classe à votre thème css 

.tabs{ display:none;}
0
Fahad

Merci pour la dernière réponse. Mais soyez conscient de ce détail: si vous l'essayez comme cela ne peut pas fonctionner: les littéraux doivent être simplement arrondis avec "ou", pas les deux à la fois.

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

Une fois pris en charge, ça marche :)

0
oscaral

Ce n'est pas la réponse à la question de ce que l'auteur a demandé. Mais d'une manière ou d'une autre, cela pourrait être utile aux autres utilisateurs qui font face au même problème avec moi. S'il vous plaît laissez-moi savoir si cela ne convient pas à mettre ici.

Je reçois la réponse de @grayside et modifie un peu pour masquer la vue | modifier l'onglet du noeud en fonction du type de contenu que je veux. 

    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 est le nom d'ordinateur de mon type de contenu, je ne veux pas que quiconque y ait accès, y compris l'utilisateur root.

0
cww