it-swarm-ja.com

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

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

たとえば、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
118218

フィールドは複数の値を持つことができるため、記述した両方のメソッドが配列を返します。それらの各配列アイテムは、それ自体がフィールドで可能なすべての列の配列になります。テキストフィールドの場合、本当に心配する必要があるのは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'];
7
Clive

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が常に配列であることを保証します。しかし、上記のスニペットの場合、これは実際には役立ちません。

6
donquixote