web-dev-qa-db-ja.com

drupal 8にフォーム変更フックを追加する方法

drupal 8、私はカスタムコンテンツタイプ "Question"でフォームを変更しようとしています。フォームにはID "node-question-form"があります。

モジュールをセットアップし、hook_FORM_ID_alter()を追加しようとしましたが、呼び出されません。最も単純なフックでも機能しません。例えば:

function constellator_form_alter(&$form, &$form_state, $form_id){ echo "alter the form"; exit; }

ここで、「constellator」はモジュール名です。

私は朝から立ち往生しており、何の効果もありません。

おかげでガウラヴ・メーラ

6
Gaurav

これは、私がプロジェクトからプルし、モジュール名を持つように変更した実際の例です。

これを.moduleファイルの先頭に追加します。

use Drupal\Core\Form\FormStateInterface;

次にこれをコピーします

/**
 * Implements hook_form_alter().
 */
function constellator_form_alter(&$form, FormStateInterface $form_state, $form_id) {

  // Adding custom validation for the welcome page type field.
  if ($form_id == 'node_article_edit_form' || $form_id == 'node_article_form') {
    // Do some stuff.
  }
}

おそらく、あなたがしていないことは、Drupalキャッシュをクリアしてフックを登録することです。「すべてのキャッシュをクリア」をクリックすることができます。あるいは、drushコマンドラインユーティリティをインストールして、 「drush cr」を使用します。

enter image description here

10
oknate

カスタムテーマを設定した場合、名前空間の要件を追加せずに、theme_name.themeファイルのhook_form_form_id_alter()を使用してフォームを簡単に変更できます。

function bootstrap_ga_form_user_login_form_alter(&$form, &$form_state, $form_id) {
  global $base_url;
  $form['#validate'][] = '_bootstrap_ga_form_user_login_form_validate';
}

ユーザーのログインフォームにカスタム検証を追加しました。 bootstrap_gaはカスタムテーマの名前です。

3
Vinodhini

カスタムモジュールでこれを試してください

以下の名前空間を使用する

    use Drupal\node\Entity\Node;
    use Drupal\Core\Form\FormStateInterface;

特定のノードにこのhook_form_alterを使用します

    //constellator_form_node_question_form_alter
function modulename_form_Form_ID_form_alter(&$form, &$form_state, $form_id){   
  //echo <pre>; print_r($form); die;
}

そして、このフックは、特定のノードフォームIDを編集するために使用されます

1
logeshvaran