web-dev-qa-db-ja.com

フィールドラベルを変更するためのHook_form_alterがユーザー登録ページで機能しない

これが機能しない理由を誰かに教えてもらえますか(以下のコード、またはフックによる挿入を妨げるその他の要因で)エラーメッセージやページは表示されません。フィールドラベルは単に上書きされません...

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. Simple Solutionは_['0']['#title']_を_[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. このソリューションは少し複雑です。
    あなたのコードをテストした後、私はいくつかの検索を行いました、私は見つけました this Post 言う

    drupal内のすべてのフォームをhook_form_alter()を実装することによって変更していることは明らかです。)しかし、hook_form_alter()でもフォームフィールドを変更するソリューションを提供できない場合があります。

hook_element_info_alter を使用して、フィールドの変更を提案しました。あなたの場合ここに以下のコードがあります。

 _
/**
* 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; }
_

:4つのフィールドはすべてtextfieldText (plain)型である必要があります。それ以外の場合は、別のプロセスを他のプロセスに追加する必要がありますtype、記事の_password_confirm_タイプの例を参照してください。

7
berramou

@leymannxによって投稿されたリンクをたどって、クリックして 別の質問 をクリックしましたが、コメントのどこかに解決策がありました。

['value']を文字列に入れるのを忘れたため、次のようにする必要があります。

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

私はそれが両方で動作することを確認できます:

  • ['0']と[0]

  • = t( '名')および= '名'

少なくとも私にとっては、['widget'] ['0'] ['value']を省略して動作しません。 ログインフォームで使用されるラベルを変更– berramo

2
Dendreten

[0]なしでお試しください。これは必要ないと思います。


編集さて、@ leymannxに従って私の言葉を言い換えましょう。自分のマシンでコードをテストし、[0]を削除すると問題が解決し、ラベルテキストが更新されます。私は答えを出していましたが、作者にそれ以上の情報や何かを求めることはしていませんでした。

0
cchen