プログラムでフィールドの選択されたすべての値のリストを取得するにはどうすればよいですか?


7

フィールドで選択されたすべての値のリストを取得するにはどうすればよいですか?

たとえば、countriesというフィールドがあり、特定のノードに対してすべての国を選択したいとします。

選択した国に応じて、地域を別のフィールド(地域)で自動的に選択したいので、このリストが必要です。

例:国でフランスを選択すると、自動的にヨーロッパ地域が地域で選択されます

今のところ、「国」フィールド、「地域」フィールドで選択した値のみをコピーできます。

$node->field_regions = $node->field_countries;

国フィールドでフランスを選択した場合の結果は次のとおりです。

Country: France

Regions: France

編集:私はfunction:field_get_items()を試しましたが、取得するのは配列だけです:

$items = field_get_items('node', $node, 'field_countries', $node->language);

何かが間違っている?私もこれを試しましたが、同じ結果が得られます...

$items = $node->field_countries[$node->language][0]

回答:


7

フィールドは複数の値を持つことができるため、記述した両方のメソッドが配列を返します。それらの各配列項目は、それ自体がフィールドで可能なすべての列の配列になります。テキストフィールドの場合、本当に心配する必要があるのはvalue列だけです。

特定のフィールドが複数の値を受け入れない、またはそれを受け入れて最初の値のみが必要であると仮定すると、以下が機能するはずです。

$items = field_get_items('node', $node, 'field_countries', $node->language);
$item = array_shift($items);
$value = $item['value'];

または

$value = $node->field_countries[$node->language][0]['value'];

ありがとう、これはまさに私が必要とするものです。あともう一つだけ。私の国フィールドは複数の値を受け入れます。すべての値を取得するにはどうすればよいですか?私はPHPを真剣に勉強しなければならないことを知っています
118218

1
あなただろうとそれらを介して、通常はループforeach、何かのように:foreach ($node->field_countries[$node->language] as $item) { $val = $item['value']; // Do something with $val }
クライヴ

アイテムの配列が空であるか、それとも配列であるかを常に確認することが重要です!編集するには変更が多すぎるので、新しい回答を書きます。
ドンキホーテ2015

6

field_get_items()通常推奨されるソリューションです。ただし、いくつかの注意点があります。

フィールドが空かどうかを確認することが重要です。この場合、field_get_items()はfalseを返します(これは悪いことです)。

$items = field_get_items('node', $node, 'field_countries', $node->language);
if (!empty($items)) {
  $item = reset($items);
  return $item['value'];
}
else {
  return NULL;
}

一般的に、アイテムが存在する場合、そのアイテムはゼロ[0]インデックスにあると確信できます。isset()は非常に堅牢です。したがって、以下も機能します:

$items = field_get_items('node', $node, 'field_countries', $node->language);
return isset($items[0]['value']) ? $items[0]['value'] : NULL;

一部のフィールドタイプでは、値は$ item ['value']ではなく、$ item ['tid']または何か他のものにあります。
通常の場合(例外atmは考えられません)、値は$ item配列の最初のものになります。したがって、以下も機能しますが、これは偶然によるものであり、設計によるものではありません。だから個人的にはそれを当てにしません。
($ itemsが(空ではない)配列の場合、すべての$ itemも配列であり、他のものではないことを安全に(*)想定できます。)

$items = field_get_items('node', $node, 'field_countries', $node->language);
return isset($items[0]) ? reset($items[0]) : NULL;

field_get_items()の戻り値は値によるので、通常は$ items配列を変更しても問題ありません。つまり、array_shift()を使用できます。

$items = field_get_items('node', $node, 'field_countries', $node->language);
return !empty($items) ? array_shift(array_shift($items)) : NULL;

(*)ここで行うほとんどの仮定は、言語レベルの保証に基づくものではなく、Drupalの一般的な動作方法に基づいています。

ところで、次のトリックは役立つ場合がありますが、元の質問の完全な解決策ではありません。

$items = field_get_items(..) ?: array();

これは、$ itemsが常に配列であることを保証します。しかし、上記のスニペットの場合、これは実際には役立ちません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.