ฉันจะรับบันเดิลของเอนทิตีจากประเภทและรหัสได้อย่างไร


11

ฉันต้องระบุbundleของกิจการจากมันและtypeid

ตัวอย่างเช่นถ้าtypeเป็น 'โหนดและidคือ 7 ผมอาจจะได้รับ 'หน้า' bundleเป็น

ขอบคุณ

คำตอบ:


11

ใช้entity_loadเพื่อโหลดเอนทิตีตามที่กล่าวถึงโดย @Nikhil

จากนั้นใช้entity_extract_idsเพื่อแยกบันเดิล ตัวอย่าง:

$entity = entity_load('node', array('7'));

list(, , $bundle) = entity_extract_ids('node', $entity);

echo "Bundle name is : " . $bundle;

ฟังก์ชั่นentity_extract_idsส่งกลับอาร์เรย์ที่ทำดัชนีเป็นตัวเลข (ไม่ใช่ตารางแฮช) ที่มีองค์ประกอบดังนี้

  • 0: ID หลักของเอนทิตี
  • 1: Revision ID ของเอนทิตีหรือ NULL ถ้า $ entity_type ไม่มีเวอร์ชัน
  • 2: ชื่อบันเดิลของเอนทิตีหรือ NULL ถ้า $ entity_type ไม่มีบันเดิล

ที่ไหน0, 1และ2มีดัชนีอาร์เรย์ อย่างไรก็ตามวิธีการที่ใช้โดยหลักและโมดูล contrib คือการใช้list()ฟังก์ชั่น


ฉันคิดว่ามันไม่ดีขึ้นอยู่กับดัชนีตัวเลขของอาร์เรย์
Junaid

3
@Junaid ดัชนีนั้นสามารถคาดเดาได้ดังนั้นมันก็ดี นี่คือวิธีที่ Drupal core จัดการกับงานนี้ หาก 'หมายเลขเวทมนต์' รบกวนคุณเพียงใช้คุณสมบัติภาษา:list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
Clive

@Junaid คุณสามารถขึ้นอยู่กับดัชนีตัวเลขเมื่อคุณแน่ใจว่าพวกเขาจะไม่เปลี่ยนแปลง ดูการแก้ไขสำหรับคำอธิบายว่าทำไมฉันจึงใช้ดัชนีตัวเลข เป็นเพราะฟังก์ชั่น API ได้รับการออกแบบในลักษณะนั้น นอกจากนี้การแก้ปัญหาไม่ได้ขึ้นอยู่กับโมดูลเอนทิตี้ ;-)
AjitS

7

นี่คือหนึ่งที่สะอาดที่สุดที่ฉันได้รับจากรหัสโมดูลกลุ่มอินทรีย์

$wrapper = entity_metadata_wrapper($entity_type, $entity_id);
$bundle = $wrapper->getBundle();

ตัวอย่างเช่นฉันสามารถเรียกว่าชอบ:

$wrapper = entity_metadata_wrapper('node', 1);
$bundle = $wrapper->getBundle();

แก้ไข: ตามที่ @Clive ชี้ให้เห็นวิธีการข้างต้นขึ้นอยู่กับโมดูลนิติบุคคล

นี่คือวิธีการอื่นที่ไม่ได้ขึ้นอยู่กับโมดูลพิเศษใด ๆ มันมีคำอธิบายที่นี่https://forrst.com/posts/Get_the_bundle_of_a_Drupal_7_entity-0xW

คัดลอกการวางวิธีดังกล่าว:

function _entity_get_bundle($entity, $entity_type) {
  $info = entity_get_info($entity_type);
  if (empty($info['entity keys']['bundle'])) {
    return $entity_type;
  } else {
    return $entity->{$info['entity keys']['bundle']};
  }
}

คือ$group_type, $gidอะไร และคุณค่าคืออะไร$bundle ?
niksmac

ขออภัยฉันลืมใช้ชื่อพารามิเตอร์ที่เหมาะสม ได้รับการแก้ไขแล้ว
Junaid

คุณสามารถทำเช่นเดียวกันentity_loadโดยวิธีการที่สะอาดที่สุด?
niksmac

1
โดยส่วนตัวฉันไม่คิดว่าentity_metadata_wrapper()สะอาดกว่าentity_extract_ids()วิธีการ พลัสที่คุณพึ่งพาโมดูลนิติบุคคลที่มีการติดตั้ง ...
ไคลฟ์

มันไม่จำเป็นต้องสะอาดกว่า แต่เป็นทางเลือกที่ถูกต้องโดยเฉพาะอย่างยิ่งถ้าคุณใช้ wraps เมทาดาทาอยู่ดี อาจ @develkar หรือ Junaid สามารถแก้ไขคำตอบเพื่อรวมทั้งทางเลือกอื่นได้หรือไม่ (Junaid คุณอาจเพิ่มลิงก์ไปยังโมดูล Entity และไปยังหน้าเพจเกี่ยวกับ entity_metadata_wrappers ด้วย?)
Alice Heaton

3

ลองใช้entity_load

โหลดเอนทิตีจากฐานข้อมูล

เอนทิตีจะถูกเก็บไว้ในแคชหน่วยความจำแบบสแตติกและจะไม่ต้องการการเข้าถึงฐานข้อมูลหากโหลดอีกครั้งระหว่างการร้องขอหน้าเดียวกัน

พารามิเตอร์

$ entity_type : ประเภทกิจการที่จะโหลดเช่นโหนดหรือผู้ใช้

$ ids : อาร์เรย์ของรหัสเอนทิตีหรือ FALSE เพื่อโหลดเอนทิตีทั้งหมด

$ เงื่อนไข : (คัดค้าน) อาเรย์แบบเชื่อมโยงของเงื่อนไขบนตารางฐานโดยที่คีย์คือฟิลด์ฐานข้อมูลและค่าคือค่าที่ฟิลด์เหล่านั้นต้องมี แต่จะดีกว่าถ้าใช้ EntityFieldQuery เพื่อดึงรายการ ID เอนทิตีที่สามารถโหลดได้โดยฟังก์ชันนี้

$ รีเซ็ต : จะรีเซ็ตแคชภายในสำหรับประเภทเอนทิตีที่ร้องขอหรือไม่

ค่าส่งคืน

อาร์เรย์ของวัตถุเอนทิตีที่จัดทำดัชนีโดยรหัสของพวกเขา เมื่อไม่พบผลลัพธ์อาร์เรย์ที่ว่างเปล่าจะถูกส่งกลับ


3

หากคุณต้องการวิธีที่มีน้ำหนักเบามากฉลาดหลักแหลมประสิทธิภาพในการรับชนิดโหนดจาก node id - คุณสามารถใช้แบบสอบถามแบบใช้เลือกข้อมูลเดียวในตารางโหนด

$type = db_query("SELECT type FROM {node} WHERE nid = :nid", 
                  array(':nid' => $nid))->fetchField();

ด้วยวิธีนี้คุณไม่จำเป็นต้องเรียกใช้เอนทิตี hook ทั้งระบบโดยใช้เอนทิตีเอนทิตี้โหลด

มันเป็นแบบสอบถามแบบใช้เลือกข้อมูลเดียวโดยใช้ ID โหนดที่ทำดัชนี


เราไม่ได้เล่นกับโหนดเท่านั้นที่นี่
Junaid

OP เขียนว่า "ตัวอย่างเช่นหากประเภทคือ 'node' และ id คือ 7 ฉันอาจได้รับ 'page' เป็นบันเดิล" ดังนั้นโหนดตามตัวอย่างคำตอบ
David Thomas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.