Jak załadować węzeł na podstawie jego tytułu?

32

Znam tylko tytuł węzła i chcę go załadować za pomocą node_load().

W jaki sposób mogę to zrobić?

sokratis
źródło
Jeśli jest to normalna strona, powinieneś mieć w arg(1)niej identyfikator NID , będzie to węzeł / X dla wszystkich stron. i node_load()działa tylko na NID
GoodSp33d
mój adres URL to projekty / {nazwa użytkownika} / {tytuł węzła}, dlatego używam arg (2)
helxsz
w drupal 7 nie można użyć node_load (), aby uzyskać węzeł według jego tytułu, po prostu przez nid
abd
Czy twoje tytuły są wyjątkowe?
Artur

Odpowiedzi:

17

W Drupal 6 możesz użyć następującego kodu.

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

Jeśli znasz również typ węzła, możesz użyć następującego kodu.

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

node_load () zawsze zwraca pojedynczy węzeł. Wynika to z faktu, że funkcja nie zapętla się nad zasobem wyniku zapytania bazy danych zwróconym z 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));
  }
Blake Senftner
źródło
3
@sokratis Pamiętaj, że tytuły nie muszą być unikalne i można je zmienić w dowolnym momencie. Jeśli możesz przejść do odwoływania według identyfikatora węzła, byłoby to bezpieczniejsze.
David L
4
Drupal nie jest fanem CamelCase.
Sivaji
1
Ten przykład również po prostu nie działa w D7. node_load(). Zredagowałem tag zapytania, aby to odzwierciedlić.
Chapabu
3
Wersja D7 (choć z użyciem przestarzałego $conditionsparametru):$nodes = node_load_multiple(array(), array('title' => 'node title'));
Clive
47

W Drupal 7 parametry dla node_load()zostały zmienione. Aby uzyskać węzły spełniające określone warunki, należy użyć klasy 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'])));
  }
Tamer Zoubi
źródło
1
node_load (array ('title' => 'node title', 'type' => 'page')) - wkrótce się to utraci, więc odpowiedź jest poprawna.
Nikit
1
Jest to tak długo, aby załadować pojedynczy węzeł; /
kenorb
12

Drupal 7

Oto prostszy sposób (jak już zasugerował Clive i w SO ):

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

i znacznie łatwiejsze do zapamiętania niż przy użyciu klasy EntityFieldQuery .

Zobacz także: Programowe pobieranie węzłów według tytułu w Drupal 7 w wersji SO

kenorb
źródło
1
to powinna być zaakceptowana odpowiedź!
Alex Skrypnyk
3
miłe podejście, nieszczęście zamierzające umrzeć, jak ujawniono w [ api.drupal.org/api/drupal/modules%21node%21node.module/function/… (funkcja node_load_multiple) @todo Remove $conditions in Drupal 8.
sierpień
10

W Drupal 7 możesz użyć kodu podobnego do następującego.

$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();
abd
źródło
nie ma za co: D.
abd
6

W Drupal 8 uruchom to:

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

$node będzie w pełni utworzonym obiektem węzła.

użytkownik1359
źródło
1

Również w Drupal 8

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

i dalej:

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

Nie zapomnij, że potrzebujesz

use Drupal\node\Entity\Node;
Yaina Villafañes
źródło