จะโหลดโหนดตามชื่อได้อย่างไร


32

node_load()ฉันเพียงรู้ชื่อของโหนดและฉันต้องการโหลดโหนดใช้

ฉันจะทำอย่างไร


หากเป็นหน้าปกติคุณควรรับ NID ในarg(1)นั้นจะเป็นโหนด / X สำหรับทุกหน้า และnode_load()ใช้ได้เฉพาะ NID
GoodSp33d

url ของฉันคือโครงการ / {ชื่อผู้ใช้} / {ชื่อโหนด} นั่นคือเหตุผลที่ฉันใช้หาเรื่อง (2)
helxsz

ใน drupal 7 คุณไม่สามารถใช้ node_load () เพื่อรับ node โดยชื่อมันเพียงแค่ nid
Abd

หนังสือของคุณมีความโดดเด่นหรือไม่?
อาเธอร์

2
เป็นไปได้ที่ซ้ำกันของวิธีการโหลดโหนดด้วยค่าฟิลด์?
kenorb

คำตอบ:


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 โปรดจำไว้ว่าชื่อเรื่องไม่จำเป็นต้องซ้ำกันและสามารถเปลี่ยนแปลงได้ตลอดเวลา หากคุณสามารถเปลี่ยนเป็นการอ้างอิงโดย node id นั่นจะปลอดภัยกว่า
David L

4
Drupal ไม่ใช่แฟนของ CamelCase
Sivaji

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' => 'ชื่อโหนด', 'type' => 'page')) - สิ่งนี้จะล้าสมัยในไม่ช้าดังนั้นคำตอบนี้จึงถูกต้อง
Nikit

1
เป็นเช่นนี้นานเพื่อโหลดโหนดเดียว; /
kenorb

12

Drupal 7

นี่เป็นวิธีที่ง่ายกว่า (ตามที่Cliveแนะนำและที่SO ):

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

และง่ายต่อการจดจำมากกว่าการใช้คลาสEntityFieldQuery

ดูเพิ่มเติมที่: การรับโหนดแบบเป็นโปรแกรมตามหัวเรื่องใน Drupal 7 at SO


1
นี่ควรเป็นคำตอบที่ยอมรับได้!
Alex Skrypnyk

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;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.