ฉันจะเข้าถึงค่าฟิลด์สำหรับวัตถุ (เช่นโหนด) ได้อย่างไร


63

node_load((int) $nid)โหลดเอนทิตีโหนดที่มีประชากรเต็ม $node->title->valueรับหัวเรื่อง แต่ฉันจะเข้าถึงค่าฟิลด์ใน Drupal 8 ได้อย่างไร

คำตอบ:


89

ฉันเดาว่าคุณไม่จำเป็นต้องแปลง$entityเป็นอาเรย์

$entity->get('field_name')->getValue();

FYI: การใช้kint()จากdevel_kintโมดูลจะแจ้งให้คุณทราบถึงวิธีการที่มีอยู่ทั้งหมดที่สามารถใช้เพื่อเข้าถึงองค์ประกอบวัตถุดังนั้นการเปรียบเทียบจึงvar_dump()มีประโยชน์น้อยกว่า


14
จริงๆแล้วมันควรจะเป็น: $ entity-> get ('field_name') -> value;
Ed Hollinghurst

1
คุณรู้หรือไม่ว่าเหตุใดจึงเป็น @EdHollinghurst getValue ทำข้อผิดพลาดให้ฉันจริง ๆ แต่ (โดยใช้ dpm) แสดงอยู่ในวิธีการที่ใช้ได้ในขณะที่ 'value' ไม่ใช่
autopoietic

2
getValue()ใช้งานได้สำหรับฉัน (ทั้งบน 8.1.x และ 8.2.x) ดูการอ้างอิง api
leon.nk

16
->getValue()เป็นเรื่องทั่วไปและจะทำงานโดยไม่คำนึงถึงประเภทของฟิลด์ หากคุณใช้จะใช้งาน->valueได้เฉพาะเมื่อค่าฟิลด์ถูกเก็บไว้ในvalueคุณสมบัติ มันจะไม่ทำงานสำหรับประเภทที่ซับซ้อนมากขึ้น (เช่นวันที่หรือการอ้างอิงนิติบุคคล)
Pierre Buyle

4
รหัสนี้เพียงอย่างเดียวจะเกิดข้อผิดพลาดหากเอนทิตีไม่มีฟิลด์ชื่อ "field_name" ตรวจสอบให้แน่ใจรหัสนี้เท่านั้นที่ได้รับการทำงานในหน่วยงานที่คุณรู้ว่าข้อมูลที่มีอยู่คุณสามารถใช้ $ entity-> Hasfield ( 'FIELD_NAME') เพื่อทดสอบหรือถ้า (ที่ว่างเปล่า ($ entity-> FIELD_NAME)!)
oknate

56

ใน drupal 8, $ node เป็นคลาสโหนด

 $node->field_machine_name->getValue();

หรือ

$node->get('field_machine_name')->getValue();

จะส่งกลับอาร์เรย์ของค่า

หากคุณคาดหวังเพียงหนึ่งเดียวคุณก็อาจสร้างอาร์เรย์ด้วย

$node->field_machine_name->getString();

หรือ

 $node->get('field_machine_name')->getString();

ฉันไม่ได้ "รับ" (สตริงและค่า) "มัน" คุณช่วยเพิ่มรายละเอียดเพิ่มเติมเพื่ออธิบายคำตอบนี้ได้ไหม? FYI: การไม่ทำเช่นนั้นจะทำให้คำตอบของคุณเสี่ยงต่อการถูกลบผ่านการกลั่นกรอง (ขออภัย ... )
Pierre.Vriens

34

สำหรับเขตข้อมูลที่คุณควรจะสามารถใช้$node->body->valueเป็นตัวอย่าง หากคุณไม่ได้รู้ว่าสิ่งที่ชื่อเขตที่มีผมขอแนะนำให้ติดตั้งDevelโมดูล Drupal 8 dsm($node)และตรวจสอบโหนดผ่านเช่น


1
คุณแสดงฟิลด์นั้นอย่างไร
อเล็กซ์

1
ดูเหมือนว่าจะล้าสมัย
อเล็กซ์

1
@Alex ฉันขอแนะนำให้คุณถามคำถามใหม่กับปัญหาที่คุณมี ในเวลานี้เป็นคำตอบที่ใช้ได้ดูเหมือนว่าไม่พอใจที่จะแก้ไขคำตอบในขณะนี้ซึ่งเป็นคำตอบในหน้านี้ที่มีคะแนนมากกว่าคำตอบนี้
tenken

5
ตรวจสอบบทความนี้สำหรับคำอธิบายที่ดี คุณสามารถใช้ค่า $ node-> field_name-> เพื่อรับค่าเดียว (หรือคีย์แรกของฟิลด์ที่มีหลายค่า) หรือคุณสามารถใช้ $ node-> field_name-> getValue () เพื่อรับค่าทั้งหมดของฟิลด์เป็นอาร์เรย์
Mirsoft

2
@tenken: ที่จริงแล้วการอัปเดตคำตอบที่มีอยู่นั้นดีกว่าการเพิ่มคำถามซ้ำซ้อนด้วยคำตอบใหม่
Pierre Buyle

17

คุณสามารถทำได้$entity->toArray()เพื่อดูว่ามีอะไรอยู่ในเอนทิตี แม้เมื่อใช้ xdebug (เช่น phpstorm) การทำความเข้าใจวัตถุเอนทิตี้ของตัวเองนั้นเป็นเรื่องยากมาก ฉันสงสัยdsm($node)ใน Drupal 8 ไม่สมเหตุสมผล หากคุณยืนยันในการแก้จุดบกพร่องในเบราว์เซอร์ (แต่คุณไม่ควร Drupal 8 นั้นซับซ้อนเกินกว่าที่จะทำการดีบักโดยไม่มี xdebug) dsm($node->toArray())เป็นสิ่งที่คุณต้องการ


$ node-> toArray () ไม่ทำงานสำหรับฉันที่ Drupal 8
Axel Briche

โปรดเพิ่มคำถามใหม่ที่มีรายละเอียด มีDrupal\Core\Entity\EntityInterface toArray

1
คำตอบนี้ไม่ได้ให้โซลูชัน downvoting
colan

ในขณะที่คำตอบนี้ไม่จำเป็นต้องเป็นคำตอบโดยตรงกับคำถามนี้มันเป็นฟังก์ชั่นที่ยอดเยี่ยม ขอบคุณ
Stef Van Looveren

14

ใช้โค้ดต่อไปนี้เพื่อรับค่าฟิลด์โหนด

สิ่งนี้ใช้เพื่อรับ node id จาก url

$nid = \Drupal::routeMatch()->getRawParameter($node_id);

ในการโหลดข้อมูลโหนดโดยใช้ nid

$node = \Drupal::entityTypeManager()->getStorage('node')->load($nid);

ใช้เพื่อรับค่าฟิลด์

$terms = $node->get('field_Name')->getValue();  

สิ่งนี้ใช้เพื่อรับชื่อโหนด

$product_name = $node->getTitle();

2
โหลดโหนดดังนี้: $ nid = \ Drupal :: routeMatch () -> getRawParameter ('node'); $ node = \ Drupal :: entityTypeManager () -> getStorage ('node') -> load ($ nid);
rémy

8

สำหรับฉันการมี$entity(โหนด) สิ่งนี้ทำงาน:

$entity->field_name->getValue();

ใช้ 8.1


2
อันนี้ได้รับค่าทั้งหมดของเขตข้อมูลหลายค่าลงในอาร์เรย์ แน่นอนว่าสามารถใช้เพื่อรับค่าของเขตข้อมูลค่าเดียวเช่นกันอย่างไรก็ตามผลลัพธ์จะมีอาร์เรย์ที่มีค่าเดียว ในการรับค่าหนึ่งฟิลด์ (หรือค่าแรกของฟิลด์ที่มีหลายค่า) ให้ใช้ $ entity-> field_name-> value
Mirsoft

7

ในขณะที่ใช้ (วิธีที่ถูกต้องจริง):

$node = \Drupal\node\Entity\Node::load($nid);
$node->get('nid')->value; // returns a raw value - Node ID

// Following both returns array structure containing value/target id nested value.
$node->get('nid')->value(); 
$node->nid->getValue();


4

มันเป็นเพียง:

$node->get('field_name')->getValue()

ถ้าเขตข้อมูลนั้นเป็นเขตข้อมูลการอ้างอิงเอนทิตีมีวิธีพิเศษบางอย่างในการรับเอนทิตีที่อ้างอิง

วิธีรับรหัสเป้าหมาย (องค์ประกอบแรก):

$entity->get('field_entity_reference')->target_id

ในการรับเอนทิตีที่โหลด (องค์ประกอบแรก):

$entity->get('field_entity_reference')->entity

เมื่อใช้งาน->entityบนสนามมันจะโหลดเอนทิตีโดยอัตโนมัติ

หากฟิลด์สามารถมีการอ้างอิงหลายรายการคุณสามารถดึงข้อมูลเหล่านี้ได้ทั้งหมด:

$entities = $entity->get('field_entity_reference')->referencedEntities();

ที่จะทำให้คุณมีหลายหน่วยงาน

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