2011-01-17 2 views
4

Was ist der "richtige" Weg, um den in einem bestimmten Feld innerhalb eines benutzerdefinierten Drupal-Knotens gespeicherten Wert zu erhalten? Ich habe ein benutzerdefiniertes Modul mit einem benutzerdefinierten Knoten mit einem benutzerdefinierten Feld URL erstellt. Folgendes funktioniert:Wie soll ich den Wert erhalten, der in einem bestimmten Feld eines benutzerdefinierten Drupal 7-Knotens enthalten ist?

$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']; 

... aber gibt es einen besseren Weg, vielleicht mit den neuen Field API-Funktionen?

Antwort

6

node_load() dann Zugriff auf das Feld als eine Eigenschaft der richtige Weg ist, auch wenn ich es anders Hartcodierung das Gebietsschema zu vermeiden, etwas tun würde:

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

Die Methode, die Sie verwenden die nid zu bekommen ist eine besonders kluge Art, es abzuleiten; Ich würde konzentrieren sich auf das Refactoring und verwenden EntityFieldQuery und entity_load() statt:

$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']); 
} 

Sie wollen würde dies vor allem tun, da Titel nicht eine einzigartige Eigenschaft ist und wenn das Feld auf andere Stellen als Knoten angezeigt. In diesem Fall entfernen Sie die entityCondition().

+0

gelegt werden, ist Danke für die Rückmeldung! Kennen Sie einen besseren Weg, um die NID zu bekommen, nur den Titel eines Knotens weiter zu geben? –

+0

@Matt Ich würde 'EntityFieldQuery' und die Entity-API verwenden, besonders wenn man bedenkt, dass Felder auf anderen Dingen als Knoten erscheinen können. Ich habe meine Antwort mit einem möglichen Refactoring aktualisiert. –

1

Nicht sicher, warum EntityFieldQuery diskutiert wird, aber ok. :) Sie werden tatsächlich die field_get_items() Funktion verwenden wollen.

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 
    } 
} 
+3

'EntityFieldQuery' wird diskutiert, weil der Bedingungsparameter für' node_load_multiple() ', den Sie in Ihrem Code verwenden, veraltet ist (http://api.drupal.org/api/drupal/modules--node--node .module/function/node_load_multiple/7) zugunsten von 'EntityFieldQuery'. Und ['field_get_items()'] (http://api.drupal.org/api/drupal/modules--field--field.module/function/field_get_items/7) ist der lange Weg, genau dasselbe zu tun Zugreifen auf das Feld als eine Eigenschaft auf dem Knoten. –

+0

Es stimmt, dass der Parameter veraltet ist, aber ['node_load()'] (http://api.drupal.org/api/drupal/modules--node--node.module/function/node_load/7) ist benutze es immer noch. Es wird wahrscheinlich nicht auf Drupal 8 verwendet werden, aber ich denke, dass es sicher ist, es mit Drupal 7 zu verwenden. – kiamlaluno

-1

propertyCondition ('field_order_no', 'Wert', 'Suchschlüssel', '=')

field_order_no ist der Butzen von benutzerdefinierten Feld & Suchschlüssel der Wert mit

Verwandte Themen