web-dev-qa-db-fra.com

Hook_form_alter pour changer les étiquettes de champ ne fonctionne pas sur la page d'enregistrement de l'utilisateur

Quelqu'un peut-il me dire pourquoi cela ne fonctionne pas (dans le code ci-dessous, ou d'autres facteurs empêchant l'insertion par le crochet)? Je ne reçois ni message d'erreur ni page, les étiquettes de champ ne sont tout simplement pas écrasées ...

J'ai créé mon propre module avec le hook suivant sur Drupal 8.5.7:

function MYMODULE_form_alter(&$form, Drupal\Core\Form\FormStateInterface $form_state, $form_id){

  if ($form_id == 'user_register_form') {

    $form['field_user_first_name']['widget']['0']['#title'] = 'First Name';
    $form['field_user_last_name']['widget']['0']['#title'] = 'Last Name';
    $form['field_user_phone_number']['widget']['0']['#title'] = 'Phone Number';
    $form['field_user_country_of_residence']['widget']['0']['#title'] = 'Country (of residence)';
  }
}
3
Dendreten
  1. Solution simple changez simplement ['0']['#title'] Par [0]['value']['#title'].

/**
 * @param $form
 * @param \Drupal\Core\Form\FormStateInterface $form_state
 * @param $form_id
 */
function MYMODULE_form_alter(&$form, Drupal\Core\Form\FormStateInterface $form_state, $form_id){
    if ($form_id == 'user_register_form') {
        $form['field_user_first_name']['widget'][0]['value']['#title'] = 'First Name';
        $form['field_user_last_name']['widget'][0]['value']['#title'] = 'Last Name';
        $form['field_user_phone_number']['widget'][0]['value']['#title'] = 'Phone Number';
        $form['field_user_country_of_residence']['widget'][0]['value']['#title'] = 'Country (of residence)';
    }
}
  1. Cette solution un peu compliquée.
    Après avoir testé votre code, j'ai fait quelques recherches, j'ai trouvé ce message dites

    Il est évident que nous modifions n'importe quel formulaire dans drupal en implémentant hook_form_alter (). Mais il y a des cas où même hook_form_alter () ne peut pas offrir de solution pour modifier les champs du formulaire.

J'ai essayé d'utiliser hook_element_info_alter car il a suggéré de modifier les champs. Dans votre cas, voici le code ci-dessous.


/**
* Implements hook_element_info_alter().
*/
function MYMODULE_element_info_alter(&$type) {
  if (isset($type['textfield'])) {
    $type['textfield']['#process'][] = 'MYMODULE_process_textfield';
  }
}


/** * Process Callback Function * * Callback to process the User fields. */ function MYMODULE_process_textfield($element) { //- get the current route name $route_name = \Drupal::routeMatch()->getRouteName(); if ($route_name == 'user.register' && isset($element['#array_parents'][0])) { switch ($element['#array_parents'][0]) { case 'field_user_first_name': $element['#title'] = 'New first name label'; break; case 'field_user_last_name': $element['#title'] = 'New last name label'; break; case 'field_user_phone_number': $element['#title'] = 'New phone numbe label'; break; case 'field_user_country_of_residence': $element['#title'] = 'New country of residence label'; break; } } return $element; }

Remarque : les quatre champs doivent être de type textfieldText (plain), sinon vous devez ajouter un autre processus à un autre type, voir l'exemple dans l'article pour le type password_confirm.

7
berramou

suivant le lien publié par @leymannx, j'ai cliqué sur ne autre question , qui avait la solution quelque part dans les commentaires.

J'ai oublié de mettre ['value'] dans la chaîne, donc ça devait être:

$form['field_user_first_name']['widget']['0']['value']['#title'] = 'First Name';

Je peux confirmer que cela fonctionne avec les deux:

  • ['0'] et [0]

  • = t ('prénom') et = 'prénom'

Je ne travaille pas, du moins pour moi, en omettant ['widget'] ['0'] ['value'] , comme suggéré dans modifier les étiquettes utilisées sur le formulaire de connexion - berramo

2
Dendreten

Essayez-le sans [0], Je ne pense pas que vous en ayez besoin.


Modifier D'accord, permettez-moi de reformuler mes mots par @leymannx. J'ai testé le code sur ma machine et j'ai supprimé [0] résout le problème et met à jour le texte de l'étiquette. Je donnais une réponse et ne demandais pas plus d'informations ou quoi que ce soit à l'auteur.

0
cchen