web-dev-qa-db-ja.com

hook_form_alterの「und」の言語キーのベストプラクティス

カスタムモジュールのフォームを変更しています。コードは次のようになります。

function my_module_form_alter(&$form, &$form_state, $form_id) {

    if ($form_id == "someID") {

        $form['field_charity_author']['und'][0]['value']['#value'] = arg(3);
        //$form['field_charity_author']['#type'] = 'hidden';

    }

}

しかし、undをハードコーディングするのは悪いことだと思います。この場合、フォームフィールドを適切に変更する適切な方法は何ですか?

30
Shafiul

残念ながら、あなたの自己回答はそれほど普遍的ではありません。フィールド言語とノード言語は同じものではありません。
フィールド言語は、フィールド変換APIを使用している場合にのみ必要です(例 エンティティ変換 )。使用を開始すると、一部のフィールドが翻訳可能に変換されます。

翻訳可能なフィールドには言語コードがあり、それは本当に理にかなっています。ただし、フィールドが翻訳可能でない場合、言語コードは常に(およびすべてのコンテンツタイプ、エンティティなど)— LANGUAGE_NONEになります(LANGUAGE_NONEではなく'und'定数を使用するのが最適です)。
したがって、あなたの解決策では、ノードがロシア語であるという状況を得ることができますが、ノードのフィールドはLANGUAGE_NONEを使用します。
幸いなことに、フィールドは'#language'キーでフォームに添付されます。これには常に正しい言語コードが含まれています。

$lang = $form['FIELDNAME']['#language'];
$form['FIELDNAME'][$lang][0]['value']['#value'] = $value;

添付フォームにアクセスできない場合は、 Field Language API関数 が役立ちます。

40
kalabro

エンティティタイプとバンドルがわかっている場合は、次のコードのようなものを使用します。このコードは、 field_language() を呼び出します。

$field_language = field_language('node', $node, 'field_charity_author');  
$form['field_charity_author'][$field_language][0]['value']['#value'] = arg(3);

それは適切な言語を理解し、多言語サイトで動作します。

field_get_items() もご覧ください。

10
Attiks

全体のund取引は、Drupal 7で設計されたときと同じように実際には機能しなかった、より厄介なものの1つです。

とにかく、次のようにarray_keysを使用して最初の言語を取得できます。

function my_module_form_alter(&$form, &$form_state, $form_id) {

  if ($form_id == "someID") {
      $langs = array_keys($form['field_charity_author']);
      $form['field_charity_author'][$langs[0]][0]['value']['#value'] = arg(3);
  }
}

それはいつもうまくいくはずです。

4
googletorp

re:kalabroの答え

彼のコードは私にとってはうまくいきませんでした-私のコードは少し異なります

$lang = $form['FIELDNAME']['#language'];
$form['FIELDNAME'][$lang]['#value'] = $value;

[$ lang] [0]は "u"を返しましたが、[$ lang]の完全な値は "und"であり、['value']も必要ありませんでした。$ form ['FIELDNAME'] ['#language' ]は配列ではなく、文字列でした。

0
decibel.places

(誰かを助けるために自分の質問に答える。答えは私のために働いた。)

言語を取得するために次の行を書くことができます:

$lang = $form['language']['#value'];    //  Instead of "und"
0
Shafiul