Как загрузить узел на основе его заголовка?


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
Друпал не фанат 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 (array ('title' => 'title title', 'type' => 'page')) - это скоро устареет, поэтому этот ответ правильный.
Никит

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.