web-dev-qa-db-fra.com

Comment déplacer le formulaire "Réinitialiser le mot de passe"?

Existe-t-il un moyen de masquer et de déplacer le formulaire Réinitialiser le mot de passe à partir de l'emplacement standard? Le formulaire de connexion doit être affiché tel quel.

Je n'ai pas pu faire ce que la réponse Comment imprimer la barre des tâches locale à différents endroits en fonction de l'itinéraire de base? dit de faire.


J'ai trouvé le module No Request New Password . Cependant, j'aimerais toujours accéder à ce formulaire sur un lien spécial.

2
amit

Comment imprimer la barre des tâches locale à différents endroits en fonction de l'itinéraire de base? consiste à modifier l'emplacement d'affichage des onglets des tâches locales dans la page. C'est différent de ce que vous voulez réaliser.

Le module que vous avez trouvé ( Pas de demande de nouveau mot de passe ) sert à supprimer le Demande de nouveau mot de passe lien du bloc et de la page utilisateur. Cela fait probablement partie de la tâche que vous souhaitez accomplir, mais vous ne pouvez pas utiliser ce module car il n'a pas été complètement porté sur Drupal 8, et cela ne fonctionnerait pas. Si vous regardez le contenu du fichier noreqnewpass.module , vous remarquerez qu'il utilise des fonctions qui n'existent plus dans Drupal 8, comme dans l'implémentation de hook suivante.

function noreqnewpass_form_alter(&$form, $form_state, $form_id) {
  if (($form_id == 'user_login_block' || $form_id == 'user_login') && variable_get('noreqnewpass_disabled', true)) {
    $key = array_search('user_login_final_validate', $form['#validate']);
    $form['#validate'][$key] = 'noreqnewpass_user_login_final_validate';
  }
}

La tâche que vous souhaitez accomplir nécessite:

  • Supprimez la tâche locale Réinitialiser votre mot de passe de la page/user/login
  • Modifier le chemin associé à la route user.pass
  • (Finalement) supprimez le lien Réinitialiser votre mot de passe qui apparaît dans le bloc de connexion

La première étape nécessite un module implémentant le crochet suivant.

function custom_menu_local_tasks_alter(&$data, $route_name) {
  // Remove the "Reset your password" tab only from the login page.
  if ($route_name == 'user.login') {
    unset($data['tabs']['0']['user.pass']);
  }
}

La deuxième étape nécessite de modifier un itinéraire défini par un autre module. Il n'y a pas de crochet pour effectuer la tâche, ce qui nécessite d'écrire du code pour un abonné à un événement. Heureusement, Drupal 8 a une classe qui peut être étendue pour faire la tâche.

class CustomSubscriber extends RouteSubscriberBase {

  /**
   * {@inheritdoc}
   */
  protected function alterRoutes(RouteCollection $collection) {
    // Change path '/user/password' to '/hidden/user/reset'.
    if ($route = $collection->get('user.pass')) {
      $route->setPath('/hidden/user/reset');
    }
  }

}

Un abonné à un événement est un service utilisant la balise event_subscriber . Cela signifie qu'il doit être défini dans le fichier .services.yml du module.

Pour la dernière étape, il suffit de modifier le bloc de connexion.

function custom_block_view_user_login_block_alter(array &$build, BlockPluginInterface $block) {
 unset($build['user_links']['#items']['request_password']);
}
1
kiamlaluno

Oui, le module supprime la tâche locale en refusant l'accès à la route. Pour masquer uniquement l'onglet, désactivez-le dans un hook_menu_local_tasks_alter ():

/**
 * Implements hook_menu_local_tasks_alter().
 */
function mymodule_menu_local_tasks_alter(&$data, $route_name) {
  if ($route_name == 'user.login') {
    unset($data['tabs']['0']['user.pass']);
  }
}

Ensuite, vous pouvez toujours accéder à /user/password. Si vous souhaitez également modifier ce chemin, vous devez modifier l'itinéraire, voir https://www.drupal.org/docs/8/api/routing-system/altering-existing-routes-and-adding -new-routes-based-on-dynamic-ones

1
4k4