it-swarm-ja.com

言語を使用する際のベストプラクティスは何ですか[und]?

このフォームを使用して、モジュール内のデータにアクセスし始めています。 ( コメント#1 を参照してください。)

_$node->field_test[$node->language][0]['value']
_

私はそれがかなり良い解決策のように見えたと思ったが、さらに同じ質問を見つけた this

「und」が言語のないエンティティのフィールドであると想定しないでください。これは、翻訳できないフィールドであり、すべてのフィールドであるエンティティ変換モジュールがない場合にも当てはまります。さらに、Drupalのさまざまな7.xバージョン間でこれに違いがあります。
field_get_items()関数を使用することをお勧めします。これは、データが格納されている言語コードの下で分類します。

そして今、私が使用しているものが将来、何かを壊す可能性があるかどうかわかりません。

51
Merrick

Entity API モジュールを使用すると非常に役立ち、コードが読みやすくなります。上記のコードは、ノードの言語とフィールドの言語が異なる場合があるため、常に機能するとは限りません。

エンティティAPIモジュールとそのラッパーを使用すると、次のコードを使用できます。

_ $node_wrapper = entity_metadata_wrapper('node', $node);
 $field_val = $node_wrapper->field_test->value();
_

これは弾丸の証拠になるはずです。エンティティモジュールの使用に関する1つのことは、存在しないフィールドにアクセスしようとすると、通知や間違った動作の代わりに、厄介なエラーと例外がスローされることです。

これを回避するには、次のようにtry/catchを実行します

_try {
  $field_val = $node_wrapper->field_doesnt_exist->value();
} catch (EntityMetadataWrapperException $e) {
  $field_val = 'default/fallback value';
}
_

または、EntityMetadataWrapperが内部で処理するisset()を使用できます。

_$field_val = 'default/fallback value';
if (isset($node_wrapper->field_doesnt_exist)) {
  $field_val = $node_wrapper->field_doesnt_exist->value();
}
_
39
googletorp

読み取りには、常に field_get_items() を使用できる必要があります。これにより、正しい言語が選択され、フィールドに値があるかどうかも確認されます。

残念ながら、フィールドAPIは7.xでは非常に制限されており、取得する方法はありません。最初のフィールドアイテムです。あえて1回の関数呼び出しで値を取得することについて尋ねる必要はありません...そして、対応するfield_set_items()はありません。

はい、エンティティAPIモジュールdoesは、APIを提供しますが、かなりのオーバーヘッドも伴います(基本的に、すべての値を多数のネストされたプロパティ情報配列がアタッチされているラッパーオブジェクト)。エンティティラッパーをダンプしようとすると、通常、何も起こらないか、読み取り不可能な配列の壁になります。

19
Berdir