Comment masquer les onglets modifier | afficher?
Puis-je cacher le
Modifier | Afficher
Onglets en haut de chaque nœud ?
J'ai cherché cette option dans les paramètres du thème (thème global et standard mais je ne l'ai pas trouvé).
Je veux toujours pouvoir mon client éditer / administrer du contenu, donc je ne peux pas simplement supprimer l'autorisation pour cela.
Merci
10 réponses
C'est vraiment une chose de présentation, pas une chose de fonctionnalité, donc cela devrait être fait au niveau du thème.
Le problème avec la substitution de theme_menu_local_tasks()
est que vous remplacez / prenez une hachette sur l'ensemble de l'affichage des tâches locales, quand vous voulez vraiment juste y entrer avec un scalpel pour supprimer deux tâches locales spécifiques. Donc, vous avez besoin pour obtenir un peu plus précis.
theme_menu_local_tasks()
obtient la page locale de tâches et les transmet à menu_local_tasks()
. Ici, deux fonctions de thème sont utilisés:
-
theme_menu_item_link()
, qui obtient le lien balisage de la tâche -
theme_menu_local_task()
, qui obtient les<li>
élément de la tâche.
Ainsi, vous pouvez vous débarrasser de la Afficher et Modifier tâches locales dans un très robuste en remplaçant theme_menu_item_link()
et theme_menu_local_task()
inclure votre chèque pour eux:
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 comptez sur le chemin du routeur de menu, ne pas modifier l'élément du routeur de menu, et atteindre le résultat que vous voulez avec un minimum modifications apportées aux fonctionnalités de base ou à la thématique.
Voici une solution très facile 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 voulez le masquer complètement.
-
Si vous souhaitez 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 cela rendra les onglets. Si non il l'habitude de se rendre.
Du côté du module, vous pouvez faire quelque chose qui dissocie l'entrée de menu Edit des tâches locales pour le nœud:
function custom_menu_alter(&$items) {
$items['node/%node/edit']['type'] = MENU_CALLBACK;
}
Le chemin d'édition est toujours là, mais maintenant il n'est pas associé à L'onglet Affichage. Cela inclut la page d'édition elle-même-pas d'onglet Vue là.
J'utilise ce qui suit dans le modèle.php par thème (ce qui est peut-être un peu hacky, je pense que je devrais envisager de désactiver $tabs à la place):
function THEME_NAME_menu_local_tasks() {
return '';
}
Ou vous pourriez ommit:
if ($tabs) echo $tabs;
De votre page.tpl.php...
Voir et Modifier sont des fonctionnalités. Ils ont une raison d'être là.
La meilleure façon de les " supprimer "est de" supprimer " cette fonctionnalité ensemble. Après tout: pourquoi supprimer l'interface d'une fonctionnalité, mais pas la fonctionnalité elle-même? En outre, simplement ne pas imprimer les onglets, ne supprime pas les points de terminaison d'url . En d'autres termes: si vous n'imprimez pas l'onglet Modifier, les utilisateurs peuvent toujours accéder à la page Modifier.
Encore une fois: le mieux est de supprimer cette fonctionnalité: le fait que vous ne voulez pas l'onglet edit semble que vous ne voulez pas la fonctionnalité edit pour certains utilisateurs. Si c'est le cas, supprimez simplement cette autorisation pour ce rôle. C'est tout. Les onglets ont disparu.
Si, cependant, vous souhaitez simplement afficher ces onglets différemment , Drupal est votre ami. Comme vous l'avez remarqué, ils sont appelés tâches locales et pas onglets. C'est parce que le thème décide comment rendre eux: le thème est la chose qui décide de les montrer sous forme d'onglets.
Remplacez simplement le theme_menu_local_tasks()
pour créer votre propre 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:)
Pour toutes les personnes qui trébuchent 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]);
}
}
}
Ce n'est pas la réponse à la question de ce que l'auteur a demandé. Mais de toute façon, il pourrait être utile pour les autres utilisateurs qui font face au problème similaire avec moi. Veuillez me faire savoir si cela ne convient pas à mettre ici.
J'obtiens la réponse de @grayside et modifié un peu pour masquer l'onglet view | edit du nœud 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;
}
}
Le produit est le nom de la machine de mon type de contenu, Je ne veux pas y accéder, y compris l'utilisateur root.
La solution la plus simple pour masquer les onglets est d'ajouter cette classe dans votre thème css
.tabs{ display:none;}
Merci pour la dernière réponse. Mais soyez conscient de ce détail: si vous l'essayez tel quel, cela ne peut pas fonctionner: les littéraux doivent être simplement arrondis par "ou", pas tous les deux. Donc, il devrait être:
/**
* 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, cela fonctionne:)