web-dev-qa-db-fra.com

Modifier le formulaire d'inscription de l'utilisateur

J'essaie de modifier les instructions d'étiquette et de champ pour le champ de nom sur le formulaire de création de compte d'utilisateur. Je suis nouveau dans le codage et pensais que ce serait une tâche facile.

Mon module personnalisé est activé et j'ai effacé les caches, mais aucune de mes modifications n'apparaît. Voici mon code. J'ai essayé un tas de variations et un tas de recherches, mais je ne vois jamais un seul signe de ce fonctionnement.

<?php

/**
 * @file
 * Contains mymodule.module.
 */

use Drupal\Core\Form\FormStateInterface;

/**
 * Implements hook_form_FORM_ID_alter() on behalf of mymodule.module.
 * @see \Array method Array at Array
 */
function mymodule_form_account_alter(&$form, FormStateInterface $form_state, $form_id) {
  // print_r($form); die;
  // ksm($form_id);
  if ($form_id == 'user_register_form') {
    // print_r($form); die;
    // kint($form_id);
    $form['name'] = array(
      '#type' => 'textfield',
      '#title' => $this->t('First and last name'),
      '#maxlength' => USERNAME_MAX_LENGTH,
      '#description' => $this->t("Rewrite this about spaces, periods (.), hyphens (-) and apostrophes (')."),
    );
  }
  drupal_set_message('mymodule_form_account_alter() executed.');
}
5
lacuna

Voici le bon code:

/**
 * Implements hook_form_FORM_ID_alter().
 */
function <your_module>_form_user_register_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
  $form['account']['name']['#title'] = t('First and last name');
  $form['account']['name']['#description'] = t("Rewrite this about spaces, periods (.), hyphens (-) and apostrophes (').");
}

n'hésitez pas à demander :) amusez-vous!

5
Kladrian

Notes à soi sur les leçons apprises

Voici où j'ai rencontré des problèmes

  • Les noms de crochet sont très peu intuitifs.
  • Les ID de formulaire peuvent être difficiles à obtenir correctement.
  • La chaudière peut devenir obsolète.

Voici comment je peux m'améliorer

Lors de l'utilisation de passe-partout

  • Continuez à utiliser Drupal Console pour passe-partout.
  • Cependant, avant de vous y engager pour une utilisation à long terme, ou si quelque chose ne fonctionne pas, consultez api.drupal.org.
  • Il semble que cette précaution puisse devenir très fastidieuse, mais peut être la meilleure approche pour les apprenants.

Lors du déchiffrement des noms de hook

  • Déterminez soigneusement quelle partie du nom est le "jeton" à remplacer.
  • Remplacez ensuite soigneusement cette pièce.
  • Tant que quelque chose dans le nom du crochet est erroné, vous resterez bloqué, donc revérifiez et triple-vérifiez.
  • Dans ce cas, le jeton était en majuscules. Voyez-le dans le commentaire fourni par le passe-partout.
  • L'instance minuscule de "forme" devait être préservée.

Lors de la détermination des ID de formulaire

  • Il semblerait que la seule source fiable pour les ID de formulaire inspecte le formulaire HTML rendu.
  • L'ID du formulaire est (logiquement) contenu dans la balise d'ouverture <form>.
  • Tant que quelque chose dans l'ID du formulaire est erroné, vous resterez bloqué, donc revérifiez et triomphez.
  • Dans ce cas, je pensais que l'ID de formulaire provenait de l'objet tel qu'écrit dans AccountForm.php et j'ai essayé des variantes basées sur cette hypothèse. Lorsque je regarde des explications et des exemples en ligne, je suis en quelque sorte resté avec cette hypothèse et je n'ai jamais obtenu l'ID correct.

Défis restants

  • Obtenir une impression des valeurs - rien de ce que j'ai essayé n'a fonctionné: kint (), dsm (), print_r ($ form); mourir;. Cette pièce ne devrait pas être trop difficile une fois que j'ai trouvé une bonne documentation.
  • Comprendre comment l'objet imbriqué est appelé correctement. Il y a probablement une bonne explication.
  • Correction de la documentation Drupal. Cette pièce est complexe.
4
lacuna

La raison pour laquelle vous ne voyez aucun changement dans le formulaire d'enregistrement d'utilisateur est que la hook_form_FORM_ID_alter() pour le formulaire user_register_form a le mauvais nom .
Au lieu de mymodule_form_account_alter(&$form, FormStateInterface $form_state, $form_id) (ce qui suppose qu'il est défini pour un module dont le nom de machine est mymodule ), il devrait être mymodule_form_user_registration_form_alter(&$form, FormStateInterface $form_state, $form_id). Je suppose toujours que le crochet est défini pour un module dont le nom de la machine est mymodule ; si le hook est défini pour un module dont le nom de machine est my_custom_module , par exemple, ce hook doit être défini comme my_custom_module_form_user_registration_form_alter(&$form, FormStateInterface $form_state, $form_id).

Correction du nom du hook, il y a toujours des erreurs dans le code que vous affichez.

  1. Une ligne comme if ($form_id == 'user_register_form') n'est pas nécessaire. Puisque vous implémentez hook_form_FORM_ID_alter(), vous n'avez pas besoin de vérifier quel formulaire est appelé, car vous dites déjà Drupal pour quel formulaire il doit être appelé.

  2. Si vous devez modifier certaines propriétés d'un élément de formulaire, vous n'utilisez pas $form['name'] = array( /* .... */); qui supprime toutes les propriétés de cet élément de formulaire et ajoute niquement celles que vous ajouter au tableau.

Le code correct serait similaire au suivant.

function mymodule_form_user_register_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  $form['name']['#title'] = $this->t('First and last name');
  $form['name']['#description'] = $this->t("Rewrite this about spaces, periods (.), hyphens (-) and apostrophes (').");
}

Remarquerez que:

  • Bien que $form_id Soit l'un des paramètres transmis au hook, vous n'en avez pas besoin pour comprendre sous quelle forme le hook est appelé. En fait, je ne vois aucune raison pour que hook_form_FORM_ID_alter() utilise ce paramètre, sauf dans le cas où l'ID du formulaire doit être concaténé à une autre chaîne. (Dans ce cas, j'utiliserais $form_id . 'another string'.)

  • Si vous testez lorsqu'un hook est invoqué, n'utilisez pas drupal_set_message() (qui est également une fonction obsolète). Utilisez l'enregistreur Drupal, par exemple avec une ligne comme \Drupal::logger('mymodule')->notice('mymodule_form_account_alter() executed.');.

1
kiamlaluno