제목을 기준으로 노드를로드하는 방법은 무엇입니까?


32

노드의 제목 만 알고 있으며를 사용하여 노드를로드하고 싶습니다 node_load().

어떻게합니까?


일반 페이지 인 경우 NID를 가져와야 arg(1)하며 모든 페이지의 node / X가됩니다. 및 node_load()전용 NID에 작품
GoodSp33d

내 URL은 projects / {username} / {node title}이므로 arg (2)를 사용하는 이유
helxsz

drupal 7에서는 node_load ()를 사용하여 제목으로 노드를 가져올 수 없으며 단지 nid로
abd

제목이 독특합니까?
Artur

답변:


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 타이틀은 고유 할 필요가 없으며 언제든지 변경할 수 있습니다. 노드 ID로 참조로 전환 할 수 있다면 더 안전합니다.
David L

4
Drupal은 CamelCase의 팬이 아닙니다.
시바 지

1
이 예제는 D7에서는 일반 기능도 작동하지 않습니다. node_load(). 이것을 반영하기 위해 질문 태그를 편집했습니다.
Chapabu

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'=> 'node title', 'type'=> 'page'))-곧 폐기 될 예정이므로이 답변이 정확합니다.
Nikit

1
단일 노드를로드
하기에는

12

드루팔 7

더 간단한 방법은 다음과 같습니다 ( CliveSO 에서 이미 제안한대로 ).

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

EntityFieldQuery 클래스를 사용하는 것보다 훨씬 쉽게 기억할 수 있습니다.

참조 : 프로그래밍 드루팔 7 제목별로 노드를 받고 SO에


1
이것은 받아 들여야 할 답변입니다!
Alex Skrypnyk

3
[ api.drupal.org/api/drupal/modules%21node%21node.module/function/… (function node_load_multiple) @todo Remove $conditions in Drupal 8.
augusto

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.
abd

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;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.