Як завантажити вузол на основі його заголовка?


32

Я знаю лише назву вузла, і хочу завантажити вузол за допомогою node_load().

Як це зробити?


Якщо це нормальна сторінка, ви повинні отримати NID, arg(1)вона буде node / X для всіх сторінок. і node_load()працює лише на NID
GoodSp33d

мій URL - це проекти / {ім'я користувача} / {назва вузла}, тому я використовую arg (2)
helxsz

в drupal 7 ви не можете використовувати node_load (), щоб отримати вузол за назвою, просто від nid
abd

Ваші титри унікальні?
Артур

Відповіді:


17

У Drupal 6 ви можете використовувати наступний код.

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

Якщо ви також знаєте тип вузла, то можете використовувати наступний код.

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

node_load () завжди повертає один вузол. Це тому, що функція не перетинає ресурс результатів запиту бази даних, повернутий з 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 Майте на увазі, що заголовки не повинні бути унікальними і їх можна змінити будь-коли. Якщо ви можете перейти на посилання за ідентифікатором вузла, це було б безпечніше.
Девід Л

4
Drupal не є фанатом CamelCase.
Сіваджі

1
Цей приклад також просто не працює в D7. node_load(). Відредагували тег питань, щоб відобразити це.
Чапабу

3
Версія D7 (хоча з використанням застарілого $conditionsпараметра):$nodes = node_load_multiple(array(), array('title' => 'node title'));
Clive

47

У Drupal 7 параметри для node_load()були змінені. Щоб отримати вузли, які відповідають деяким умовам, слід використовувати клас 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 (масив ('title' => 'назва вузла', 'type' => 'сторінка')) - це незабаром застаріє, тому ця відповідь правильна.
Нікіт

1
Це так довго, щоб завантажити один вузол; /
kenorb

12

Drupal 7

Ось простіший спосіб (як уже запропонував Клайв і в SO ):

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

і набагато простіше запам'ятати, ніж використовувати клас EntityFieldQuery .

Дивіться також: Програмно отримання вузлів за назвою в Drupal 7 на SO


1
це має бути прийнята відповідь!
Олексій Скрипник

3
приємний підхід, нещасність намір померти, як викрито в [ api.drupal.org/api/drupal/modules%21node%21node.module/function/… (функція node_load_multiple) @todo Remove $conditions in Drupal 8.
серпень

10

У Drupal 7 ви можете використовувати код, аналогічний наступному.

$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();

ласкаво просимо: D.
абд

6

У Drupal 8 запустіть це:

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

$node буде повністю інстанційованим вузловим об'єктом.


1

Також у Drupal 8

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

і далі:

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

Не забувайте, що вам потрібно

use Drupal\node\Entity\Node;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.