Score:0

FieldItemList::getValue จะคืนค่าสตริงเสมอ แม้จะเป็นฟิลด์บูลีนก็ตาม

ธง gr

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

เมื่อฉันได้รับค่าฟิลด์ด้วย $value = node->get('field_custom')->getValue(); มูลค่า $ มีอาร์เรย์ต่อไปนี้

0 => อาร์เรย์ (1)
  ค่า => สตริง (1) "1"

มีวิธีรับค่าฟิลด์ที่สะท้อนถึงประเภทฟิลด์ บูลีน ในกรณีนี้หรือไม่

0 => อาร์เรย์ (1)
  ค่า => บูลีนจริง

ฉันส่งค่าด้วยตนเอง เช่น ด้วยโค้ดที่คล้ายกับค่าต่อไปนี้

// บูลีน
$value = (บูลีน) $value;

// จำนวนเต็ม
$value = intval($value);

ฉันยังพยายาม รับ ('x') -> ค่า และใช้ __รับ().

Drupal รู้ประเภทฟิลด์ซึ่งส่งคืนจาก $field->getFieldDefinition()->getType(). ฉันมีวิธีในการส่งค่าฟิลด์อย่างถูกต้อง

Kevin avatar
in flag
Drupal จะไม่ส่งค่ากลับ
Kevin avatar
in flag
คุณสามารถแปลงเป็น `$value = (boolean) $value;`
Score:3
ธง cn

โดยปกติแล้วการหล่อพิมพ์จะไม่สำคัญ: https://softwareengineering.stackexchange.com/questions/24378/type-casting-variables-in-php-what-is-the-practical-reason-for-doing-this.

ดังนั้นการดึงค่าฟิลด์เอนทิตีไม่จำเป็นต้องเป็นแบบหล่อ:

$node->field_bool->value

ส่งคืนสตริง '0'/'1' หรือ โมฆะ หากฟิลด์นั้นว่างเปล่า ค่าที่เป็นไปได้ทั้งสามค่าทำงานตามที่คาดไว้ใน PHP '1' ผลลัพธ์เป็นตรรกะจริงและอีกสองค่าเป็นตรรกะเท็จ สิ่งนี้สะท้อนถึงลักษณะที่มองเห็นได้ใน UI โดยที่ช่องทำเครื่องหมายสามารถมีได้เพียงสองสถานะเท่านั้น ยกเลิกการเลือกว่าง ทำเครื่องหมายถูกบันทึกเป็น '1' และเมื่อยกเลิกการเลือกอีกครั้ง ระบบจะบันทึกเป็น '0'.

อย่างไรก็ตาม ระบบเอนทิตีของ Drupal สร้างขึ้นจากข้อมูลที่พิมพ์ และหากคุณต้องการเขียนโค้ด OOP ด้วยการคัดแยกประเภท คุณสามารถ:

$node->field_bool->first()->get('value')->getCastedValue()

ผลตอบแทน เท็จ/จริง.

ข้อแม้: สิ่งนี้ใช้ไม่ได้ในระดับฟิลด์ คุณต้องได้รับรายการฟิลด์เพื่อรับข้อมูลที่พิมพ์บูลีนและคุณต้องจับฟิลด์ว่างเพื่อหลีกเลี่ยงการ get() เป็น NULL

john Smith avatar
gr flag
ขอบคุณมากสำหรับคำตอบของคุณ ฉันเห็นด้วยอย่างยิ่ง โดยเฉพาะกับ "ปกติ" ดังนั้นสำหรับกรณีของฉัน สิ่งนี้มีประโยชน์มากและใช้งานได้ดีสำหรับ primitive เช่น integer, float boolean และ string จะไม่ส่ง datetime
4uk4 avatar
cn flag
ในการ *cast* วัตถุวันที่จะแทนที่ getCastedValue() ด้วย [DateTimeIso8601::getDateTime()](https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21TypedData%21Type%21DateTimeInterface.php /function/DateTimeInterface%3A%3AgetDateTime/9.2.x)

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา