hook_form_alter()がとても面倒なのはなぜですか?


40

ここに私が出会ったばかりの例があります。私は自分のフィールドのラベルに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)

使用されているのが1つだけの#title属性が3つあるのはなぜですか?


1
この$ form配列はどこで生成されますか?私が知っているように、hook_form_alterにこの構造を持つ$ formはありません
モハマド

これありがとう。私は髪を引っ張っていました。配列構造はとんでもないです。
JM01

回答:


72

表示されているのは、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モジュールをインストールし、dpm()関数を使用して$form配列を検査する必要があります。これは、ターゲットとする要素が配列内のどこにあるかを正確に示します。


3
つまり、DrupalがフォームAPI配列を考慮しないものに#titleを追加しても効果はありません。その場合でも、#titleはDrupalが実装するすべてのフォーム要素の属性ではないため、#titleが考慮されているとは言えません。フィールドAPIは、フォーム配列に通常の配列を追加するため、問題を複雑にしますが、#typeを探してフォーム要素を認識するDrupalを混同しません。
kiamlaluno
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.