カスタムモジュールのフォームを変更しています。コードは次のようになります。
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
をハードコーディングするのは悪いことだと思います。この場合、フォームフィールドを適切に変更する適切な方法は何ですか?
残念ながら、あなたの自己回答はそれほど普遍的ではありません。フィールド言語とノード言語は同じものではありません。
フィールド言語は、フィールド変換APIを使用している場合にのみ必要です(例 エンティティ変換 )。使用を開始すると、一部のフィールドが翻訳可能に変換されます。
翻訳可能なフィールドには言語コードがあり、それは本当に理にかなっています。ただし、フィールドが翻訳可能でない場合、言語コードは常に(およびすべてのコンテンツタイプ、エンティティなど)— LANGUAGE_NONE
になります(LANGUAGE_NONE
ではなく'und'
定数を使用するのが最適です)。
したがって、あなたの解決策では、ノードがロシア語であるという状況を得ることができますが、ノードのフィールドはLANGUAGE_NONE
を使用します。
幸いなことに、フィールドは'#language'
キーでフォームに添付されます。これには常に正しい言語コードが含まれています。
$lang = $form['FIELDNAME']['#language'];
$form['FIELDNAME'][$lang][0]['value']['#value'] = $value;
添付フォームにアクセスできない場合は、 Field Language API関数 が役立ちます。
エンティティタイプとバンドルがわかっている場合は、次のコードのようなものを使用します。このコードは、 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() もご覧ください。
全体の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);
}
}
それはいつもうまくいくはずです。
re:kalabroの答え
彼のコードは私にとってはうまくいきませんでした-私のコードは少し異なります
$lang = $form['FIELDNAME']['#language'];
$form['FIELDNAME'][$lang]['#value'] = $value;
[$ lang] [0]は "u"を返しましたが、[$ lang]の完全な値は "und"であり、['value']も必要ありませんでした。$ form ['FIELDNAME'] ['#language' ]は配列ではなく、文字列でした。
(誰かを助けるために自分の質問に答える。答えは私のために働いた。)
言語を取得するために次の行を書くことができます:
$lang = $form['language']['#value']; // Instead of "und"