web-dev-qa-db-ja.com

ユーザー登録フォームを変更する

ユーザーアカウント作成フォームの名前フィールドのラベルとフィールドの説明を変更しようとしています。私はコーディングに慣れていないので、これは簡単な作業だと思いました。

カスタムモジュールが有効になっていて、キャッシュをクリアしましたが、変更が表示されません。これが私のコードです。さまざまなバリエーションと検索を試しましたが、これが機能しているという兆候は一度も見られません。

<?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

これが正しいコードです:

/**
 * 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 (').");
}

お気軽に:)お楽しみください!

5
Kladrian

学んだ教訓についての自己メモ

ここで問題が発生しました

  • フック名は非常に直感的ではありません。
  • フォームIDを正しく取得するのは難しい場合があります。
  • ボイラープレートは古くなる可能性があります。

これが私が改善できる方法です

定型文を使用する場合

  • Drupalボイラープレート用コンソールを引き続き使用します。
  • ただし、長期間使用するためにコミットする前、または何かが機能しない場合は、api.drupal.orgを確認してください。
  • この予防策は非常に退屈になる可能性がありますが、学習者にとっては最善のアプローチである可能性があります。

フック名を解読するとき

  • 名前のどの部分を「トークン」に置き換えるかを慎重に決定します。
  • 次に、その部分だけを慎重に交換します。
  • フック名の何かが間違っている限り、ブロックされたままになるので、ダブルチェックとトリプルチェックを行ってください。
  • この場合、トークンはすべて大文字でした。ボイラープレートによって提供されるコメントでそれを参照してください。
  • 「フォーム」の小文字のインスタンスを保持する必要がありました。

フォームIDを決定するとき

  • フォームIDの唯一の信頼できるソースは、レンダリングされたフォームHTMLを検査することです。
  • フォームIDは(論理的に)<form>開始タグ内に含まれます。
  • フォームIDの何かが間違っている限り、ブロックされたままになるので、ダブルチェックとトリプルチェックを行ってください。
  • この場合、フォームIDはAccountForm.phpに記述されているオブジェクトからのものであると考え、その仮定に基づいてバリエーションを試しました。説明や例をオンラインで見ると、どういうわけかその前提にこだわり、正しいIDを取得できませんでした。

残りの課題

  • 値のプリントアウトを取得する-私が試したもののどれも:kint()、dsm()、print_r($ form);死ぬ;。良いドキュメントが見つかれば、この部分はそれほど難しくありません。
  • ネストされたオブジェクトが正しく呼び出される方法を理解する。おそらくそこに良い説明があります。
  • Drupalドキュメントを修正しています。この部分は複雑です。
4
lacuna

ユーザー登録フォームに変更が表示されない理由は、user_register_formフォームのhook_form_FORM_ID_alter()の名前が間違っているためです。
mymodule_form_account_alter(&$form, FormStateInterface $form_state, $form_id)(マシン名がmymoduleのモジュールに定義されていると想定)ではなく、mymodule_form_user_registration_form_alter(&$form, FormStateInterface $form_state, $form_id)。まだマシン名がmymodule;であるモジュールに対してフックが定義されていると想定しています。たとえば、マシン名がmy_custom_moduleであるモジュールに対してフックが定義されている場合、そのフックはmy_custom_module_form_user_registration_form_alter(&$form, FormStateInterface $form_state, $form_id)として定義する必要があります。

フック名を修正しましたが、表示しているコードにはまだエラーがあります。

  1. if ($form_id == 'user_register_form')のような行は必要ありません。 hook_form_FORM_ID_alter()を実装しているので、どのフォームを呼び出すかをすでにDrupalに伝えているため、どのフォームが呼び出されるかを確認する必要はありません。

  2. フォーム要素の一部のプロパティを変更する必要がある場合は、$form['name'] = array( /* .... */);を使用しないでください。これにより、そのフォーム要素のすべてのプロパティが削除され、only追加したプロパティが追加されます配列に。

正しいコードは次のようになります。

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 (').");
}

次のことに注意してください。

  • $form_idはフックに渡されるパラメーターの1つですが、フックがどのフォームで呼び出されるかを理解する必要はありません。実際、フォームIDを別の文字列に連結する必要がある場合を除いて、hook_form_FORM_ID_alter()がそのパラメーターを使用する理由は考えられません。 (その場合、$form_id . 'another string'を使用します。)

  • フックが呼び出されたときにテストしている場合は、drupal_set_message()(これも非推奨の関数です)を使用しないでください。 Drupalロガーを使用します。たとえば、\Drupal::logger('mymodule')->notice('mymodule_form_account_alter() executed.');のような行を使用します。

1
kiamlaluno