web-dev-qa-db-ja.com

node_load()を介してリスト(テキスト)のラベルにアクセスする方法

私のモジュールでは、ノードのコンテンツに基づいてjsonを生成しています。

_$node = node_load($nid);
_

ノードのフィールドの1つは、List (text)タイプのfield_sport_typeです。許可される値は次のようになります。

_mens-surfing|Men's Surfing
womens-surfing|Women's Surfing
junior-mens-surfing|Junior Men's Surfing
junior-womens-surfing|Junior Women's Surfing
skate|Skate
_

Var_dump($ node)を実行すると、field_sport_typeセクションは次のようになります。

_["field_sport_type"]=>
      array(1) {
        ["und"]=>
        array(1) {
          [0]=>
          array(1) {
            ["value"]=>
            string(14) "womens-surfing"
          }
        }
      }
_

したがって、「値」は許可された値のキーですが、キーではなくラベルを取得します。つまり、_womens-surfing_は必要ありません。_Women's Surfing_を取得します。

リスト(テキスト)のラベルにアクセスするにはどうすればよいですか?

5
Kenny Wyland

list_allowed_values を使用して、値のリストをキー配列として取得し、それを使用して、任意のロジックで「キー」を表示できます。

APIコメントセクションの例は次のとおりです。

<?php
/*
assuming there's a field named machine name is 'field_my_field_name' whose
type is a list (float, integer or text), and you want to get the values that 
were entered into the "Allowed values list" textarea on the edit screen for the field
*/
$all_fields_on_my_website = field_info_fields();
$allowed_values =       list_allowed_values($all_fields_on_my_website["field_my_field_name"]);
/*
$allowed_values is now an array of $key=>value pairs that
can be dropped into the '#options' value for a form field array, for instance
*/
//example:
$form = array();
$form['my_form_element'] = array(
  '#type' => 'select',
  '#title' => t('Choose something, sucka!'),
  '#description' => t('Descriptive text under form elements rather than above them is a great UX choice, really.'),
  '#options' => $allowed_values,
);
return $form;

drupalの「フィールド」であることは、バンドルに添付されたリストフィールドインスタンスには、アイテムのカスタムリスト、デフォルト値、必須かどうかなど)の構成と設定があります。

6
tenken

エンティティメタデータラッパーを使用して、簡単な方法でキーラベルにアクセスできます。

$wrapper = entity_metadata_wrapper('node', $nid);
$label = $wrapper->field_sport_type->label();

または、node_load()でロードされた$ nodeを使用します。

$wrapper = entity_metadata_wrapper('node', $node);
$label = $wrapper->field_sport_type->label();

Entity API モジュールが必要になりますが、このモジュールはカスタムモジュールコーディングでほぼ必須であると思います。

5
sanzante