web-dev-qa-db-ja.com

なぜhook_form_alter()はとても厄介なのですか?

これは私が遭遇した例です。私は私のフィールドのラベルにいくつかのHTMLを入れようとしています。

$form['field_feedback']['und']['#title'] <- has the title
$form['field_feedback']['und'][0]['#title'] <- has the title
$form['field_feedback']['und'][0]['value']['#title'] <- has the title. (Works)

3つの#title属性が設定されていて、1つしか使用されないのはなぜですか?

39
Joren

表示されているのは、Drupalがフォームのフィールドを表す方法です。次のように分類されます。

  • 外部配列の子である_$form['field_back']['und']_(_'und'_ for _'undefined'_)は、フィールドが翻訳されたさまざまな言語です。 Drupalでは、コードで_LANGUAGE_NONE_の_'und'_を使用することをお勧めします。
  • 各言語配列内の子。 _$form['field_feedback']['und'][0]_、フィールドのさまざまなエントリを表します。たとえば、フィールドのカーディナリティが無制限で、そのフィールドに複数のエントリがある場合、それらは_$form['field_feedback']['und'][0]_、_$form['field_feedback']['und'][1]_などとして表示されます。
  • 最後に、フィールド値自体のためのフォーム入力要素があります。 _$form['field_feedback']['und'][0]['value']_。この場合、列名はvalueで、ノード参照フィールドタイプの場合はnidとなります。フィールドに複数のデータ列が関連付けられている場合は、さらに多くの子が表示されます。これらはテキストフィールド/選択ボックス/特別なウィジェットで表され、最終的にフィールドの値を提供します。

タイトルが階層全体のさまざまな要素に追加されているという事実は、正直に言うと偶然です。それらのタイトルがフォームに表示されるかどうかは、各_#title_が含まれるレンダリング配列の特定の設定に依存します。

実際のフォームウィジェットのタイトルを変更するには、配列の一番下にあるフォーム要素(つまり、実際の入力要素(_$form['field_feedback']['und'][0]['value']_など))のみを考慮する必要があります。

特定のフィールドに使用される要素/ウィジェットが非常に複雑になる可能性があることは、おそらく注目に値します。まだ持っていない場合は、 Devel module をインストールし、dpm()関数を使用して_$form_配列を検査する必要があります。これにより、ターゲットとする要素が配列のどこにあるかが正確に示されます。

71
Clive