4

カスタムDrupalノード内の特定のフィールドに格納されている値を取得するための「適切な」方法は何ですか?カスタムノードとカスタムURLフィールドを持つカスタムモジュールを作成しました。次の作品:

$result = db_query("SELECT nid FROM {node} WHERE title = :title AND type = :type", array(
  ':title' => $title,
  ':type' => 'custom',
))->fetchField();
$node = node_load($result);
$url = $node->url['und']['0']['value'];

...しかし、新しいフィールドAPI関数を使用するなど、より良い方法はありますか?

4

3 に答える 3

6

node_load()次に、プロパティとしてフィールドにアクセスするのが適切な方法ですが、ロケールのハードコーディングを避けるために少し異なる方法でアクセスします。

$lang = LANGUAGE_NONE;
$node = node_load($nid);
$url = $node->url[$lang][0]['value'];

nidを取得するために使用している方法は、それを導出するための特に厄介な方法です。私はそれをリファクタリングすることに焦点を当て、代わりにentity_load()EntityFieldQueryを使用します:

$query = new EntityFieldQuery;
$result = $query
  ->entityCondition('entity_type', 'node')
  ->propertyCondition('type', $node_type)
  ->propertyCondition('title', $title)
  ->execute();

// $result['node'] contains a list of nids where the title matches
if (!empty($result['node']) {
  // You could use node_load_multiple() instead of entity_load() for nodes
  $nodes = entity_load('node', $result['node']);
}

タイトルは一意のプロパティではなく、フィールドがノード以外のエンティティに表示される場合は特に、これを行う必要があります。その場合は、を削除しentityCondition()ます。

于 2011-01-17T02:34:37.720 に答える
1

EntityFieldQueryが議論されている理由はわかりませんが、問題ありません。:)実際にはfield_get_items()関数を使用したいと思うでしょう。

if ($nodes = node_load_multiple(array(), array('type' => 'custom', 'title' => $title)) {
  $node = reset($nodes);
  if ($items = field_get_items('node', $node, 'url')) {
    $url = $items[0]['value'];
    // Do whatever
  }
}
于 2011-01-17T05:16:44.100 に答える
-1

propertyCondition('field_order_no'、'value'、'検索キー'、'=')

field_order_noはカスタムフィールドのスラッグであり、検索キーは一致する値です

于 2015-03-11T16:51:01.413 に答える