Bagaimana cara memuat simpul berdasarkan judulnya?

32

Saya hanya tahu judul node, dan saya ingin memuat node menggunakan node_load().

Bagaimana aku melakukan itu?

sokratis
sumber
Jika itu adalah Halaman normal, Anda harus mendapatkan NID di arg(1)dalamnya akan menjadi simpul / X untuk semua halaman. dan node_load()hanya bekerja pada NID
GoodSp33d
url saya adalah projects / {username} / {node title}, itulah mengapa saya menggunakan arg (2)
helxsz
dalam drupal 7 Anda tidak dapat menggunakan node_load () untuk mendapatkan node dengan judulnya, hanya dengan nid
abd
Apakah judul Anda unik?
Artur
2
Kemungkinan duplikat dari Cara memuat simpul dengan nilai bidang?
kenorb

Jawaban:

17

Di Drupal 6, Anda dapat menggunakan kode berikut.

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

Jika Anda tahu jenis node juga, maka Anda dapat menggunakan kode berikut.

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

node_load () selalu mengembalikan satu node. Itu karena fungsi tidak mengulangi sumber daya hasil query database yang dikembalikan dari 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
sumber
3
@sokratis Ingatlah bahwa judul tidak harus unik dan dapat diubah kapan saja. Jika Anda dapat beralih ke referensi dengan id node, itu akan lebih aman.
David L
4
Drupal bukan penggemar CamelCase.
Sivaji
1
Contoh ini juga tidak akan berfungsi di D7. node_load(). Telah mengedit tag pertanyaan untuk mencerminkan ini.
Chapabu
3
Versi D7 (walaupun menggunakan $conditionsparameter yang tidak digunakan lagi ):$nodes = node_load_multiple(array(), array('title' => 'node title'));
Clive
47

Di Drupal 7, parameter untuk node_load()telah diubah. Untuk mendapatkan node yang cocok dengan beberapa kondisi, Anda harus menggunakan kelas 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'])));
  }
Penjinak Zoubi
sumber
1
node_load (array ('title' => 'title node', 'type' => 'page')) - ini akan segera usang, jadi jawaban ini benar.
Nikit
1
Ini sangat lama untuk memuat satu node; /
kenorb
12

Drupal 7

Ini cara yang lebih sederhana (seperti yang disarankan oleh Clive dan di SO ):

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

dan jauh lebih mudah diingat daripada menggunakan kelas EntityFieldQuery .

Lihat juga: Secara pemrograman mendapatkan node dengan judul di Drupal 7 di SO

kenorb
sumber
1
ini harus menjadi jawaban yang diterima!
Alex Skrypnyk
3
pendekatan yang bagus, ketidakberuntungan ingin mati, seperti yang terungkap di [ api.drupal.org/api/drupal/modules%21node%21node.module/function/… (function node_load_multiple) @todo Remove $conditions in Drupal 8.
augusto
10

Di Drupal 7, Anda dapat menggunakan kode yang mirip dengan yang berikut ini.

$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
sumber
Anda menyambut: D.
abd
6

Di Drupal 8, jalankan ini:

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

$node akan menjadi objek node sepenuhnya instantiated.

pengguna1359
sumber
1

Juga di Drupal 8

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

dan selanjutnya:

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

Jangan lupa Anda butuhkan

use Drupal\node\Entity\Node;
Yaina Villafañes
sumber