ตรวจสอบว่าฟิลด์ว่างเปล่าหรือไม่


18

คุณจะตรวจสอบได้อย่างไรว่าเขตข้อมูลว่างเปล่าเมื่อคุณมีวัตถุ $ node?

ฉันพบสิ่งนี้เป็นวิธีแก้ปัญหาที่เป็นไปได้:

$field = field_get_items('node', $node, 'field_post_image');

ฉันสามารถตรวจสอบตอนนี้:

UPDATE .Ups! สิ่งนี้ไม่น่าเชื่อถือแม้ว่าฉันจะสัญญาว่าจะทำงานให้ฉันเมื่อวานนี้

isset($field);

แต่ฉันสงสัยว่ามีวิธีที่ดีกว่า

สอนฉัน

คำตอบ:


30

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

$field = field_get_items('node', $node, 'field_post_image');
if ($field) {
   //Do something with the field
}
else{
   //There are no results
}

ดูเหมือนว่านี่เป็นวิธีที่ดีที่สุด ถ้ามันว่างเปล่าจะคืนค่า FALSE หากมีข้อมูลใด ๆ มันจะส่งคืนอาร์เรย์ดังนั้นจึงไม่ต้องกังวลว่า $ field จะประเมินค่าเป็น FALSE ในกรณีที่เขตข้อมูลตัวเลข 0 เป็นต้น
corbacho

สิ่งนี้ไม่ได้ผลสำหรับฉันเพราะมันคืนค่าเริ่มต้นเมื่อไม่มีการตั้งค่าใด ๆ
แม่น้ำ

@ Sam152 ขอบคุณ! สิ่งนี้ใช้งานได้ดีเมื่อฉันลงชื่อเข้าใช้ แต่เมื่อฉันออกจากระบบแล้วจะไม่แสดงอะไรเลย มีเหตุผลสำหรับสิ่งนั้นและทางออกใดบ้าง?
ด่าน

สวัสดีแดน การเข้าสู่ระบบไม่ควรมีผลกระทบใด ๆ กับรหัสข้างต้น บางทีคุณกำลังใช้ devel เพื่อดีบักตัวแปรและผู้ใช้ anon ไม่มี "เข้าถึงข้อมูลผู้พัฒนา"?
Sam152

นี่เป็นวิธีที่ผิดในการตรวจสอบว่าเขตข้อมูลว่างเปล่าหรือไม่คุณควรใช้วิธีที่อธิบายด้วยการเรียกใช้ hook_field_is_empty ที่กำหนดโดยโมดูลที่ใช้ฟิลด์ดูโพสต์โดย kiamlaluno
lslinnet

8

คุณสามารถใช้ตัวอย่างต่อไปนี้เพื่อตรวจสอบว่าเขตข้อมูลว่างเปล่า

$info = field_info_field($field_name);
$function = $info['module'] . '_field_is_empty';

if (function_exists($function)) {
  $value = field_get_items('node', $node, $field_name);
  $is_empty = $function($value[0], $info);
}

รหัสนี้ปลอดภัยกว่าเนื่องจากเขตข้อมูลอื่นถือว่าว่างเปล่าภายใต้เงื่อนไขที่แตกต่างกัน ดูที่ตัวอย่างเช่นความแตกต่างระหว่างfile_field_is_empty () , number_field_is_empty ()และtaxonomy_field_is_empty () : taxonomy_field_is_empty()ตรวจสอบคุณสมบัติtidของ$itemพารามิเตอร์ในขณะที่number_field_is_empty()ตรวจสอบคุณสมบัติค่าของพารามิเตอร์เดียวกัน ฟิลด์ที่กำหนดเองอาจต้องมีเงื่อนไขที่ซับซ้อนมากขึ้นในการตรวจสอบเพื่อพิจารณาว่าฟิลด์ว่างเปล่า

คำอธิบายสำหรับhook_field_is_empty () ที่ให้ไว้ในเอกสารมีดังต่อไปนี้:

กำหนดสิ่งที่ถือเป็นรายการที่ว่างเปล่าสำหรับประเภทฟิลด์


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

1
นั่นคือสิ่งที่ไม่ว่างเปล่า () เมื่อคุณผ่านตัวแปรที่มี 0 หรือสตริง "0" มันอาจเป็นสนามที่ใช้ค่าเมื่อมันว่างเปล่าและการเรียกใช้ hook_field_is_empty () เป็นวิธีเดียวที่จะรู้ว่าฟิลด์นั้นว่างเปล่าหรือไม่
kiamlaluno

มีข้อผิดพลาด ควรเป็น $ function ($ value [0], $ info); ดูapi.drupal.org/api/drupal/modules!field!field.api.php/function/…
volocuga

2

เราพบค่าดิบใน ( $content['field_name']['#items'][0][value]) เพื่อให้คุณสามารถตรวจสอบว่าเขตข้อมูลว่างเปล่าหรือไม่พร้อมกับการแสดงออก

(! ที่ว่างเปล่า ($ เนื้อหา [ 'FIELD_NAME'] [ '# รายการ'] [0] [ค่า]))

ที่field_nameตรงกับชื่อของเขตข้อมูลที่ต้องการ


ไม่คีย์ "value" เป็นเพียงชื่อคอลัมน์ db มันอาจแตกต่างกันไปขึ้นอยู่กับประเภทของฟิลด์ ฉันคิดว่าวิธีที่ดีที่สุด - ตรวจสอบ hook_field_is_empty () (ซึ่งจำเป็น) ตามที่เสนอข้างต้น
volocuga

1

Drupal 8

หากใครต้องการคำตอบเดียวกันใน D8 นั่นคือสิ่งที่ฉันทำเพื่อทดสอบภาคสนามของฉัน:

if ($entity->hasField('field_event_date_start')
  && !$entity->get('field_event_date_start')->isEmpty()) {
  // Do something ...
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.