Come caricare un nodo in base al suo titolo?


32

Conosco solo il titolo di un nodo e voglio caricare il nodo usando node_load().

Come lo faccio?


Se è una Pagina normale, dovresti ottenere NID in arg(1)esso sarà nodo / X per tutte le pagine. e node_load()funziona solo con NID
GoodSp33d,

il mio url è progetti / {username} / {nodo titolo}, ecco perché uso arg (2)
helxsz

in drupal 7 non puoi usare node_load () per ottenere il nodo in base al titolo, solo per nid
abd

I tuoi titoli sono unici?
Artur,

Risposte:


17

In Drupal 6, puoi usare il seguente codice.

$node = node_load(array('title' => 'node title'));

Se conosci anche il tipo di nodo, puoi usare il seguente codice.

$node = node_load(array('title' => 'node title', 'type' => 'page'));

node_load () restituisce sempre un singolo nodo. Questo perché la funzione non esegue il ciclo sulla risorsa del risultato della query del database restituita da db_query () .

  if ($revision) {
    array_unshift($arguments, $revision);
    $node = db_fetch_object(db_query('SELECT ' . $fields . ' FROM {node} n INNER JOIN {users} u ON u.uid = n.uid INNER JOIN {node_revisions} r ON r.nid = n.nid AND r.vid = %d WHERE ' . $cond, $arguments));
  }
  else {
    $node = db_fetch_object(db_query('SELECT ' . $fields . ' FROM {node} n INNER JOIN {users} u ON u.uid = n.uid INNER JOIN {node_revisions} r ON r.vid = n.vid WHERE ' . $cond, $arguments));
  }

3
@sokratis Tieni presente che i titoli non devono essere unici e possono essere modificati in qualsiasi momento. Se è possibile passare al riferimento tramite ID nodo, sarebbe più sicuro.
David L

4
Drupal non è un fan di CamelCase.
Sivaji

1
Anche questo esempio semplicemente non funzionerà in D7. node_load(). Ho modificato il tag della domanda per riflettere questo.
Chapabu,

3
Versione D7 (anche se usando il $conditionsparametro obsoleto ):$nodes = node_load_multiple(array(), array('title' => 'node title'));
Clive

47

In Drupal 7, i parametri per node_load()sono stati modificati. Per ottenere i nodi che soddisfano alcune condizioni, è necessario utilizzare la classe EntityFieldQuery .

$query = new EntityFieldQuery();


 $entities = $query->entityCondition('entity_type', 'node')
  ->propertyCondition('type', 'your_node_type')
  ->propertyCondition('title', 'your node title')
  ->propertyCondition('status', 1)
  ->range(0,1)
  ->execute();

  if (!empty($entities['node'])) {
    $node = node_load(array_shift(array_keys($entities['node'])));
  }

1
node_load (array ('title' => 'node title', 'type' => 'page')) - questo sarà presto obsoleto, quindi questa risposta è corretta.
Nikit,

1
Questo è così lungo per caricare un singolo nodo; /
Kenorb

12

Drupal 7

Ecco un modo più semplice (come già suggerito da Clive e SO ):

$nodes = node_load_multiple(NULL, array("title" => "Foo Bar"));
$node = current($nodes);

e molto più facile da ricordare rispetto all'utilizzo della classe EntityFieldQuery .

Vedi anche: Ottenere a livello di codice nodi per titolo in Drupal 7 a SO


1
questa dovrebbe essere la risposta accettata!
Alex Skrypnyk,

3
approccio bello, unfortunalty intented a morire, come esposto in [ api.drupal.org/api/drupal/modules%21node%21node.module/function/... (funzione node_load_multiple) @todo Remove $conditions in Drupal 8.
Augusto

10

In Drupal 7, puoi usare un codice simile al seguente.

$result = db_query("SELECT n.nid FROM {node} n WHERE n.title = :title AND n.type = :type", array(":title"=> $title, ":type"=> $type));  
$nid = $result->fetchField();

prego: D.
abd

6

In Drupal 8, esegui questo:

$nodes = \Drupal::entityTypeManager()
  ->getStorage('node')
  ->loadByProperties(['title' => $title]);
foreach ( $nodes as $node ) {
  $node->doSomething(...);
}

$node sarà un oggetto nodo completamente istanziato.


1

Anche in Drupal 8

$nids = \Drupal::entityQuery('node')
->condition('title', 'YourNodeTitle')
->sort('nid', 'DESC')
->execute();

e poi:

$node = \Drupal\node\Entity\Node::load(HEREYOUNODEID);

Non dimenticare di aver bisogno

use Drupal\node\Entity\Node;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.