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


30

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

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は悪いと思います。この場合、フォームフィールドを適切に変更する適切な方法は何ですか?


このコメントは、かなり前に尋ねられているため、おそらく無関係です。foreachループを使用して使用する1つの簡単な方法。LANGUAGE_NONEのみの場合、それは1回の実行です。form_alterの意味では、フォームに含まれる言語を技術的に変更する必要があります。
AyeshK 14

回答:


40

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

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

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

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


4
これは、このスレッドの唯一の正しい答えです。
ボヤンジバノビッチ

このメソッドは、ノード/コンテンツタイプの画像フィールドパスを取得するときにも使用できます。ありがとう
ジャヤラムR

10

エンティティの種類とバンドルがわかっている場合、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()もご覧ください。


これはAPIとして正しい方法です。
ニキット

ノードが作成されていない場合はどうですか?
AgAを

@Nikit表示言語とフォーム言語が同じではないため、わかりません。作成者は何らかの形式を変更し、新しいノードを作成したり、既存のノードの新しい翻訳を追加したりすることができます。
kalabro 14年

@kalabro-表示言語とフォーム言語-現在のコンテキストで同じ。
ニキット14年

4

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);
  }
}

それは常に機能するはずです。


ご回答有難うございます。この問題を解決するために行ったことを別の回答に貼り付けています。:)
シャフィウル

form_stateの同じフィールドの値にアクセスするために$ langsを使用できますか?
AgA 14年

これは本当に安全ですか?$ langs [0]が常に正しい配列項目であることを確認できますか?
ルービー14

0

(誰かに役立つ場合に備えて、自分の質問に答えます。答えは私のために働きました。)

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

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

5
これは間違っています。kalabroの答えをご覧ください。
ボヤンジバノビッチ

0

re:kalabroの答え

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

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

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


1
「und」の0番目の文字は「u」です。曲がりくねった小さな通路、すべてのアレイの迷路にいます。
クリスバージェス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.