Làm thế nào để tải một nút dựa trên tiêu đề của nó?


32

Tôi chỉ biết tiêu đề của một nút và tôi muốn tải nút bằng cách sử dụng node_load().

Làm thế nào để làm điều đó?


Nếu đó là Trang bình thường, bạn sẽ nhận được NID trong arg(1)đó sẽ là nút / X cho tất cả các trang. và chỉ node_load()hoạt động trên NID
GoodSp33d

url của tôi là dự án / {tên người dùng} / {tiêu đề nút}, đó là lý do tại sao tôi sử dụng arg (2)
helxsz

trong drupal 7, bạn không thể sử dụng node_load () để lấy nút theo tiêu đề của nó, chỉ bằng nid
abd

Tiêu đề của bạn là duy nhất?
Artur

Câu trả lời:


17

Trong Drupal 6, bạn có thể sử dụng mã sau đây.

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

Nếu bạn biết loại của nút là tốt, thì bạn có thể sử dụng mã sau đây.

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

node_load () luôn trả về một nút. Đó là bởi vì hàm không lặp qua tài nguyên kết quả truy vấn cơ sở dữ liệu được trả về từ 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 Hãy nhớ rằng các tiêu đề không phải là duy nhất và có thể thay đổi bất cứ lúc nào. Nếu bạn có thể chuyển sang tham chiếu theo id nút, điều đó sẽ an toàn hơn.
David L

4
Drupal không phải là fan hâm mộ của CamelCase.
Sivaji

1
Ví dụ này cũng không hoạt động trong D7. node_load(). Đã chỉnh sửa thẻ câu hỏi để phản ánh điều này.
Chapabu

3
Phiên bản D7 (mặc dù sử dụng $conditionstham số không dùng nữa ):$nodes = node_load_multiple(array(), array('title' => 'node title'));
Clive

47

Trong Drupal 7, các tham số cho node_load()đã được thay đổi. Để có được các nút phù hợp với một số điều kiện, bạn nên sử dụng lớp 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 (mảng ('title' => 'tiêu đề nút', 'type' => 'page')) - điều này sẽ sớm lỗi thời, vì vậy câu trả lời này là chính xác.
Nikit

1
Quá lâu để tải một nút; /
kenorb

12

Drupal 7

Đây là một cách đơn giản hơn (như đã được Clive đề xuất và tại SO ):

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

và dễ nhớ hơn nhiều so với sử dụng lớp EntityFieldQuery .

Xem thêm: Lập trình nhận các nút theo tiêu đề trong Drupal 7 tại SO


1
đây sẽ là câu trả lời được chấp nhận
Alex Skrypnyk

3
Cách tiếp cận tốt đẹp, không may có ý định chết, như được phơi bày trong [ api.drupal.org/api/drupal/modules%21node%21node.module/feft/ đấm (chức năng node_load_multipl) @todo Remove $conditions in Drupal 8.
augusto

10

Trong Drupal 7, bạn có thể sử dụng mã tương tự như sau.

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

chào mừng bạn: D.
abd

6

Trong Drupal 8, chạy này:

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

$node sẽ là một đối tượng nút khởi tạo đầy đủ.


1

Cũng trong Drupal 8

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

và tiếp theo:

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

Đừng quên bạn cần

use Drupal\node\Entity\Node;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.