En cliquant sur le lien "Mon compte" qui dans le menu secondaire du site, l'utilisateur redirige vers la page de profil de l'utilisateur.
Dans cette page, il existe de nombreux onglets. Certains onglets sont là à l'origine, et certains onglets créés par certains modules. J'ai compris comment ajouter des onglets à ce menu (en créant simplement une vue et en lui donnant le chemin de /user/%user/XXX
).
Y a-t-il un autre moyen?
Comment puis-je supprimer des onglets du menu de profil de l'utilisateur?
Pourquoi ce menu de profil utilisateur n'est pas dans la section des menus de Drupal?
Mon objectif est de supprimer les onglets suivants (voir capture d'écran ci-dessous): "HybridAuth", "Vos questions" et l'onglet "Points".
Vous cherchez peut-être le module Tab Tamer :
Tab Tamer est un utilitaire d'administration qui permet de réorganiser, masquer et désactiver facilement les onglets et les sous-onglets. Vous pouvez également renommer les étiquettes des onglets.
Si vous ne voulez pas utiliser un module contrib comme TabTamer alors, dans Drupal 7, vous pouvez utiliser hook_menu_alter pour désactiver l'onglet MENU en utilisant access callback
/**
* Implementing hook_menu_alter
* Restrict MENU TABS access
*/
function MODULE_NAME_menu_alter(&$items) {
if(/* check your conditions */) {
$items['user/%user/hybridauth']['access callback'] = FALSE;//Change the MENU PATH as per your requirement.
}
}
Remarque
$items
variable.Pour Drupal 8, j'ai pu résoudre ce problème de 2 manières:
Modifiez le nom d'un élément d'onglet de compte d'utilisateur/supprimez un élément d'onglet avec hook_menu_local_tasks_alter :
/**
* Implements hook_menu_local_tasks_alter().
*/
function MYMODULE_menu_local_tasks_alter(&$data, $route_name) {
if ($route_name == 'entity.user.canonical') {
foreach ($data['tabs'][0] as $type => &$tab) {
// Replace the "View" tab name with "Hola"
if ($type == 'entity.user.canonical' && $tab['#link']['title'] == 'View') {
$tab['#link']['title'] = 'Hola';
}
unset($tab);
}
// Hide the "Edit" tab entirely
unset($data['tabs'][0]['entity.user.edit_form']);
}
}
Une chose à noter est que cela ne rend pas réellement le lien utilisateur d'édition inaccessible - il le cache simplement dans les onglets en haut du profil utilisateur. Vous devrez implémenter le routage pour masquer réellement quelque chose.
Ajoutez un nouvel élément d'onglet , dans ce cas un formulaire "Statut":
mymodule.links.menu.yml:
mymodule.account_status:
title: 'Status'
parent: 'entity.user.canonical'
route_name: 'mymodule.account_status'
mymodule.links.task.yml:
mymodule.account_status:
title: 'Status'
route_name: 'mymodule.account_status'
base_route: 'entity.user.canonical'
mymodule.routing.yml:
mymodule.account_status:
path: '/user/{user}/status'
defaults:
_form: 'Drupal\mymodule\Form\AccountStatusForm'
_title: 'Status'
requirements:
_permission: 'access content'
user: \d+
mymodule/src/Form/AccountStatusForm.php:
namespace Drupal\subscription\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
/**
* Account status form
*/
class AccountStatusForm extends FormBase {
/**
* {@inheritdoc}
*/
public function getFormId() {
return 'mymodule_account_status_form';
}
/**
* {@inheritdoc}
*/
public function buildForm(array $form, FormStateInterface $form_state) {
// TODO: Build form
return $form;
}
/**
* {@inheritdoc}
*/
public function submitForm(array &$form, FormStateInterface $form_state) {
// TODO: Handle submit
}
}
Cette réponse est assez détaillée, donc je laisse le soin aux gens de parcourir les documents D8 si quelque chose n'est pas clair. Au minimum, vous devez comprendre le processus d'utilisation des formulaires personnalisés (et/ou des contrôleurs selon ce dont vous avez besoin ici) pour implémenter ce code.
Y a-t-il un autre moyen?
À Drupal, il y a toujours une autre façon. En fait, des moyens plus faciles sont souvent négligés.
Comment puis-je supprimer des onglets du menu de profil de l'utilisateur?
Vous pouvez masquer les onglets générés Drupal spécifiquement dans les pages utilisateur et ajouter les vôtres:
/user/*
dans la zone de texte et sélectionnez "Masquer pour les pages répertoriées".Pourquoi ce menu de profil utilisateur n'est pas dans la section des menus de Drupal?
Le bloc "Tabs" est contextuel, ce qui signifie qu'il est généré automatiquement en fonction de la page que vous visitez et des modules qui y sont connectés. C'est pourquoi vous ne devez les exclure des pages utilisateur que dans ce cas. Les exclure tous ensemble aurait (probablement) des résultats indésirables.
Renommer les onglets peut être beaucoup plus facile dans Drupal 8.
function mymodule_menu_local_tasks_alter(&$data, $route_name) {
foreach ($data['tabs'][0] as $type => &$tab) {
// Replace the "View" tab name with "view account"
if ($type == 'entity.user.canonical') {
$tab['#link']['title'] = t('view account');
}
// Replace the "Edit" tab name with "edit account"
if ($type == 'entity.user.edit_form') {
$tab['#link']['title'] = t('change password');
}
}
}
Comme hook_menu_alter () n'a pas été déclenché sur la page utilisateur dans mon Drupal, j'ai réussi à le faire d'une autre manière, en utilisant hook_menu_local_tasks_alter ():
function hook_menu_local_tasks_alter(&$data, $router_item, $root_path) {
unset($data['tabs'][0]['output'][2]);
}
Où 2 est la position de l'onglet que vous souhaitez supprimer.
Le problème avec cette approche est que la position de l'onglet que vous souhaitez supprimer est susceptible d'être modifiée par un autre module, je suppose. Ensuite, en installant plus de modules contrib, cela pourrait être problématique.
Au moins pour mon cas d'utilisation, c'est suffisant.
D'une manière propre Drupal 8 voies, vous pouvez modifier les tâches en utilisant modulename_local_tasks_alter (), comme décrit dans la documentation
/**
* Implements hook_local_tasks_alter().
*/
function modulename_local_tasks_alter(&$local_tasks) {
// Remove unwanted tabs
// Here, we'll remove the "Payment method" tasks from the user edit tasks
unset($local_tasks['entity.commerce_payment_method.collection']);
}