อะไรคือวิธีปฏิบัติที่ดีที่สุดเมื่อทำงานกับภาษา [und]?


51

ฉันเริ่มใช้แบบฟอร์มนี้เพื่อเข้าถึงข้อมูลในโมดูลของฉัน (ดูความคิดเห็น # 1 )

$node->field_test[$node->language][0]['value']

ฉันคิดว่ามันดูเหมือนเป็นคำตอบที่ดี แต่ฉันก็พบคำถามต่อไปนี้ :

อย่าสันนิษฐานว่า 'und' มีไว้สำหรับฟิลด์ของเอนทิตีที่ไม่มีภาษา แต่ยังใช้สำหรับฟิลด์ที่ไม่สามารถแปลได้และไม่มีโมดูลการแปลเอนทิตีที่เป็นฟิลด์ทั้งหมด นอกจากนี้ยังมีข้อแตกต่างระหว่าง Drupal รุ่น 7.x ที่หลากหลาย
ดีกว่าที่จะใช้field_get_items()ฟังก์ชั่นที่จะสังคายนาคุณภายใต้รหัสภาษาที่ข้อมูลจะถูกเก็บไว้

และตอนนี้ฉันไม่รู้ว่าสิ่งที่ฉันใช้จะทำให้บางอย่างพังทลายลงมา

คำตอบ:


39

ฉันพบว่าการใช้โมดูลEntity APIเป็นวิธีที่ยอดเยี่ยมและทำให้โค้ดอ่านง่ายขึ้น รหัสข้างต้นอาจไม่ทำงานเนื่องจากภาษาของโหนดและภาษาของฟิลด์อาจแตกต่างกัน

ด้วยโมดูล entity API และ wrapper ของมันคุณสามารถใช้รหัสต่อไปนี้:

 $node_wrapper = entity_metadata_wrapper('node', $node);
 $field_val = $node_wrapper->field_test->value();

นี่ควรเป็นหลักฐานแสดงหัวข้อย่อย สิ่งหนึ่งที่เกี่ยวกับการใช้โมดูลเอนทิตี้คือถ้าคุณพยายามเข้าถึงฟิลด์ที่ไม่มีอยู่คุณจะได้รับข้อผิดพลาดที่น่ารังเกียจและมีข้อผิดพลาดเกิดขึ้นแทนการแจ้งเตือนและพฤติกรรมที่ผิด

เพื่อหลีกเลี่ยงปัญหานี้คุณสามารถลอง / จับเช่นนี้

try {
  $field_val = $node_wrapper->field_doesnt_exist->value();
} catch (EntityMetadataWrapperException $e) {
  $field_val = 'default/fallback value';
}

หรือคุณสามารถใช้isset()ที่EntityMetadataWrapperจัดการภายใน:

$field_val = 'default/fallback value';
if (isset($node_wrapper->field_doesnt_exist)) {
  $field_val = $node_wrapper->field_doesnt_exist->value();
}

ฟังก์ชั่นนี้entity_metadata_wrapper()เลิกใช้แล้วหรือยัง? ฉันลองโทรหามันในโมดูลของฉันและฉันได้Fatal error: Call to undefined function entity_metadata_wrapper()- ฉันก็ทำการค้นหาซอร์สในการติดตั้ง Drupal 7.12 ใน Dreamweaver ของฉันและได้ผลลัพธ์ 0 รายการจากที่อื่นในรหัสด้วย!
Aditya MP

1
aditya - นี่คือโมดูล Entity API - ไม่ใช่ในแกน
lazysoundsystem

1
@adityamenon อย่างขี้เกียจบอกว่านี่ไม่ใช่ในแกน ... แต่อาจเป็นสำหรับ Drupal 8 อย่างน้อย API ของเอนทิตีจะได้รับการปรับปรุงอย่างมาก ไม่มีเวลาที่จะสร้าง API ทั้งหมดที่จำเป็นสำหรับระบบเอนทิตีสำหรับ Drupal 7 ดังนั้นนั่นคือสิ่งที่โมดูลเอนทิตี API พยายามที่จะบรรลุ
googletorp

ขอบคุณพวกฉันโง่ที่จะไม่อ่านคำตอบอย่างถูกต้องและไปตามลิงก์ไปยังหน้าโครงการ Entity API :)
Aditya MP

1
เมื่อฉันดูซอร์สโค้ดสำหรับ entity_metadata_wrapper และติดตามเส้นทางกระต่ายผ่านทุกคลาสที่มีอินสแตนซ์และขยายเพื่อให้ฉันจัดการฟิลด์ได้ง่ายขึ้นฉันสงสัยว่ามันคุ้มค่าหรือไม่ การเพิ่มโค้ดอีก 3k + บรรทัดลงใน bootstrap ของฉันและใช้หน่วยความจำมากขึ้นเพื่อจัดการกับการกำหนดตัวแปรทั้งหมด ... มีอะไรที่เบากว่านี้อีกไหม? ดูเหมือนว่า$node->field_name[LANGUAGE_NONE][0]['value'] = 'foo';เป็นวิธีที่มีประสิทธิภาพมากที่สุด
Charlie Schliesser

19

สำหรับการอ่านคุณควรใช้field_get_items ()ซึ่งจะเลือกภาษาที่ถูกต้องสำหรับคุณและตรวจสอบว่าฟิลด์นั้นมีค่าใด ๆ หรือไม่

น่าเสียดายที่ฟิลด์ API มีข้อ จำกัด มากใน 7.x ไม่มีวิธีรับเช่นรายการฟิลด์แรกไม่กล้าถามเกี่ยวกับการรับค่าด้วยการเรียกใช้ฟังก์ชันเดียว ... และไม่มี field_set_items ( )

ดังนั้นใช่โมดูลเอนทิตี API จะให้ข้อเสนอที่ดีกว่าด้วยข้อเสียเปรียบที่มาพร้อมกับค่าใช้จ่ายเล็กน้อย (โดยทั่วไปจะแปลงทุกค่าเดียวเป็นออบเจกต์ห่อหุ้ม ความพยายามที่จะถ่ายโอนข้อมูล wrapper เอนทิตีมักจะทำให้คุณไม่มีอะไรหรือกำแพงของอาร์เรย์ที่อ่านไม่ได้


1
ฉันได้รับความประทับใจจากสิ่งที่คุณพูดว่าสิ่งที่ miight พัฒนาขึ้นใน Drupal 8 นี้หรือไม่? ถ้าเป็นเช่นนั้นเราจะรู้ได้อย่างไรว่าสิ่งต่าง ๆ เหล่านี้มีความก้าวหน้าอย่างไร? นอกเหนือจากหน้าโมดูลอย่าเป็นเหมือนเขาวงกตสำหรับฉัน! :)
Clive

1
มีความหวังอยู่เสมอ :) และมันยากที่จะรักษาภาพรวมระดับสูงของสิ่งที่เกิดขึ้นใน Drupal 8 วิธีหนึ่งคือการติดตาม iniatives นี่ไม่ใช่เป้าหมายโดยตรงของคำสั่งที่มีอยู่ บางส่วนของเอนทิตี API โมดูลจะถูกย้าย / ถูกย้ายไปยังแกน (ตอนนี้มี Entity class และเอนทิตีที่มีอยู่จะถูกแปลงเป็นระบบใหม่) จึงมีโอกาสที่เราจะได้รับวิธีการโดยตรงในชั้นเรียนเหล่านั้นเพื่อจัดการกับสาขา สำหรับการเปลี่ยนแปลงมุ่งมั่นเป็นทรัพยากรที่ดีคือระบบการเปลี่ยนแปลงบันทึกใหม่ดูdrupal.org/list-changes/drupal
Berdir

ยอดเยี่ยมนั่นคือสิ่งที่ฉันกำลังมองหาขอบคุณมากจริงๆ! :) หวังว่าคุณจะไม่รังเกียจการถามของฉันฉันรู้ว่ามันไม่ได้อยู่ในหัวข้อสำหรับเว็บไซต์ ... ฉันชอบที่จะมีส่วนร่วมในการสนับสนุนหลัก แต่ไม่เคยมีส่วนร่วมในโอเพ่นซอร์สจริง ๆ ฉันพบทุกสิ่ง บิตที่น่ากลัว ... มันเป็นเรื่องดีที่จะมีการเริ่มต้นที่ดี :)
ไคลฟ์

คลีฟ: ลองดูdrupalofficehours.org - มันช่วยให้ผู้คนเริ่มต้นด้วยการมีส่วนร่วมได้อย่างแม่นยำ แหล่งข้อมูลเพิ่มเติมที่นั่น ฉันขอแนะนำให้ไปประชุมกลุ่มผู้ใช้ที่ core devs บ่อยขึ้นหรือเป็นไปได้มากขึ้นว่า DrupalCamp จะมี core dev หรือสองคน ค้นหากลุ่มในท้องถิ่นของคุณบนgroups.drupal.orgและคุณควรจะสามารถทำงานได้ drupical.orgก็มีประโยชน์เช่นกัน
wizonesolutions

-2
$node = node_load($lot_id);
$field_language = field_language('node', $node, 'field_name');
$node->field_name[$field_language][0]['value'] = $custom_value;

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