วิธีรับรายการประเภทฟิลด์?


10

ฉันกำลังย้ายโมดูลจาก Drupal 7 ไปยัง Drupal 8 ในการตั้งค่าการกำหนดค่าของโมดูลนี้ฉันต้องได้รับรายการประเภทฟิลด์ที่มีอยู่ในปัจจุบัน

ใน Drupal 7 สิ่งนี้สามารถทำได้โดยใช้field_info_field_types()ฟังก์ชั่น

ใน Drupal 8 (8.0.0-rc3) ฉันได้รับข้อผิดพลาด "ไม่มีฟังก์ชั่น" แม้จะมีข้อมูลที่ระบุไว้ในหน้าช่วยเหลือการอ้างอิง Drupal APIชัดเจนว่าล้าสมัย

จากนั้นตรวจสอบผมพบว่าหน้า DrupalContribDrupal::service('plugin.manager.entity.field.field_type')->getDefinitions()ที่ฟังก์ชั่นที่มีการประกาศเลิกใช้และเสนอให้ใช้งานในขณะนี้

แต่การใช้มันทำให้เกิดข้อผิดพลาดอื่น "บริการที่ไม่รู้จัก plugin.manager.entity.field.field_type" โชคดีที่เกี่ยวข้องกับคำแนะนำ "คุณหมายถึง plugin.manager.field.field_type หรือไม่"

ดังนั้นฉันจึงลองใช้Drupal::service('plugin.manager.field.field_type')->getDefinitions()และว้าว: ฉันได้อาร์เรย์ประเภทฟิลด์ที่คาดหวัง

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

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


จะเป็นการดีกว่าถ้าคุณดูที่ api.drupal.org ซึ่งเป็นการอัพเดตเพิ่มเติม อันที่จริงไม่มีหน้าสำหรับฟังก์ชั่นนั้น
kiamlaluno

ขอบคุณสำหรับเคล็ดลับ "ดูที่ api.drupal.org" ในทางกลับกัน (และนี่ค่อนข้างเกี่ยวข้องกับ meta ขออภัย) ถ้าฉันเข้าใจได้ง่ายว่าคุณแก้ไขตัวย่อของฉัน (D7 -> Drupal 7) ฉันสงสัยว่าทำไมคุณถึงปล่อย "Drupal 8" ลงในชื่อ? ฉันมักจะคิดว่าจะมีกฎบางอย่างบอกว่ามันเป็น redcake ด้วยแท็ก "8" แต่ในฐานะที่เป็นผู้อ่านฉันใช้เพื่อค้นหาชื่อของฉันมากกว่าแท็ก: ที่ตาของฉันแท็กเป็นหลักในการค้นหากระบวนการในขณะที่การอ่านตามลำดับฉันไม่ค่อยสนใจพวกเขามากนัก
cFreed

ไม่จำเป็นต้องทำซ้ำแท็กในชื่อเนื่องจากจะปรากฏตลอดเวลาเมื่อมีคำถามอยู่ในรายการ ผู้ใช้ Stack Exchange ให้ความสนใจกับแท็ก
kiamlaluno

คำตอบ:


16

ระดับแรกคืออาร์เรย์ กุญแจคือ id ของปลั๊กอิน คุณสามารถแสดงรายการพวกเขา:

$defs = Drupal::service('plugin.manager.field.field_type')->getDefinitions();
foreach ( $defs as $key => $value ) {
   echo $key, "\n";
}

นี่คือผลลัพธ์ที่ได้:

comment
datetime
file
image
link
list_string
list_float
list_integer
path
text_with_summary
text
text_long
email
boolean
created
changed
timestamp
string_long
language
decimal
uri
float
password
string
integer
entity_reference
uuid
map
taxonomy_term_reference

คุณสามารถเลือกหนึ่งและทิ้งข้อกำหนดปลั๊กอิน

var_dump($defs['comment']);

หากคุณสนใจวัตถุพิเศษคุณสามารถเจาะลึกลงไปได้ด้วยความช่วยเหลือของ api.drupal.org แต่มันจะง่ายขึ้นถ้าคุณค้นหาปลั๊กอินในไดเรกทอรีหลัก

ในการเข้าถึงวัตถุให้ค้นหามันใน var_dump และใช้วิธีการ:

$defs['comment']['description']->render();

ในกรณีนี้มันเป็นวัตถุTranslatableMarkupซึ่งมีวิธีการเรนเดอร์เพื่อเข้าถึงสตริงที่แปล


ขอบคุณ แต่นี่คือสิ่งที่ฉันทำไปแล้ว นอกจากนั้นปัญหาของฉันยังคงอยู่: ฉันจะเข้าถึงข้อมูลภายในวัตถุเหล่านี้โดยทางโปรแกรมได้อย่างไร
cFreed

คุณต้องการค้นหาอะไรในคำจำกัดความของฟิลด์ โดยทั่วไปแล้วคุณค้นหาคุณสมบัติและวิธีการของวัตถุใน API แล้วคุณเข้าถึงพวกเขาด้วย `-> ' คำจำกัดความของฟิลด์ง่ายต่อการค้นหาในแหล่งที่มา
4k4

ผมดึงlabel, descriptionและmoduleและแสดงไว้ในรูปแบบการกำหนดค่าที่ผู้ใช้สามารถตรวจสอบคนที่มันต้องการโมดูลของฉัน ( MMS ) สร้างราชสกุลโคลนสำหรับสาขาที่เกี่ยวข้อง
cFreed

ฉันเพิ่มตัวอย่าง
4k4

อ๊ะ! ฉันเห็นความคิดเห็นล่าสุดของคุณ แต่ไม่ได้สังเกตการแก้ไขของคุณดังนั้นฉันจึงรอต่อไป ฉันจะลองคำแนะนำของคุณ ขอบคุณ
cFreed

4

ทุกสตริงที่ส่งผ่าน t () เป็นวัตถุทันที คุณสามารถเข้าถึงได้เป็นสตริงในความเป็นจริงคุณควรทำเช่นนั้น

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

PS: เอกสารอย่างเป็นทางการ API เป็นhttp://api.drupal.org/api/drupal/8 ใช้สำหรับแกนกลาง

แหล่งข้อมูลที่ดีอีกแหล่งหนึ่งคือบันทึกการเปลี่ยนแปลง: https://www.drupal.org/list-changes/published?keywords_description=field_info_field_ty_&&&_eventum=5&value=5&v=5 5D =

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

$definitions = Drupal::service('plugin.manager.field.field_type')->getDefinitions();
foreach ( $definitions as $field_type => $definition) {
  print $definition['label'];
  print $definition['description'];
  print $definition['provider'];
}

อีกครั้งเพียงละเว้นป้าย / คำอธิบายที่เป็นวัตถุ พวกเขามี __toString () วิธีการที่ถูกเรียกโดยอัตโนมัติเมื่อคุณพิมพ์ / ใช้พวกเขา


ขอบคุณสำหรับคำตอบนี้ ลิงก์ที่เสนอล่าสุดของคุณดูมีแนวโน้มมากและฉันจะตรวจสอบตามข้อมูลนี้ สั้น ๆ ว่าฉันผิดถ้าผมเดาว่าสำหรับความต้องการของฉัน (สารสกัดlabel, description, moduleสตริงของแต่ละฟิลด์ชนิด) ฉันควร: 1) ได้รับรายชื่อจากDrupal::service('plugin.manager.field.field_type')->getDefinitions()ชอบทำมาแล้ว; 2) จากนั้นใช้แต่ละคีย์ของอาเรย์ที่ส่งคืน (ชื่อฟิลด์ชนิด) สำหรับการเรียกคลาสเฉพาะ (ค้นหาว่าอันไหนและที่ไหนคือสิ่งที่ฉันต้องตรวจสอบลึก) ที่จะให้วิธีการรับข่าวสารที่จำเป็น? TIA สำหรับความแม่นยำนี้
cFreed

อัปเดตคำตอบของฉัน
Berdir

โอ๊ะโอ ... ไม่เข้าใจ! สิ่งที่คุณเสนอในการแก้ไขของคุณเป็นเพียงสิ่งที่ฉันทำใน D7 และมันไม่ทำงานใน D8 เนื่องจาก$definitionไม่ใช่อาเรย์ของสตริงใน D8 แต่เป็นอาเรย์ของวัตถุ! ผมใช้ DPM () 'label' => array(..., 'label' => Drupal\Core\StringTranslation\TranslatableMarkup Object {..., string, ...}, ...)เพื่อตรวจสอบพวกเขาและเห็นว่าแต่ละสายที่จำเป็นปรากฏซ้อนกันด้วยวิธีนี้: ฉันขาดอะไรที่ชัดเจนหรือไม่
cFreed

เพิ่งค้นพบ (เมื่อเร็ว ๆ นี้) แก้ไขล่าสุดของ 4k4 ซึ่งใช้งานได้ ในความเป็นจริงปัญหาสำหรับฉันคือการรู้ที่จะหาTranslatableMarkupชั้นเรียนและความเป็นประโยชน์ของrender()วิธีการ print $definition['label']->render();สุดท้ายวิธีที่ถูกต้องเพื่อให้ได้ข้อมูลของฉันคือ อย่างไรก็ตามขอขอบคุณสำหรับข้อมูลอื่น ๆ ของคุณ
cFreed

ไม่อีกคุณไม่จำเป็นต้อง -> render () ใช้ $ นิยาม [ 'ป้าย'] ก็แค่ทำงานไว้วางใจฉัน :)
Berdir

1

อัปเดตเวอร์ชันสำหรับคำตอบ @Berdir แล้ว ใช้ในเปลือก

$definitions = Drupal::service('plugin.manager.field.field_type')->getDefinitions();
foreach ( $definitions as $field_type => $definition) {
  print 'Label: '. $definition['label']. PHP_EOL;
  print 'Machine name: '. $field_type. PHP_EOL;
  print 'Descritpion: '. $definition['description']. PHP_EOL;
  print 'Provider: '. $definition['provider']. PHP_EOL . ' ---' . PHP_EOL;
}

ออกที่นี่: https://gist.github.com/sobi3ch/70635cc62defff606242


1

Google ดูเหมือนจะพบคำถามนี้เมื่อค้นหาสิ่งเหล่านี้

หากคุณใช้ Drupal Console คุณสามารถใช้:

drupal plugin:debug field.field_type

นอกจากนี้ยังมีสิ่งนี้บน Drupal.org ซึ่งสามารถช่วย:

การกำหนดและการใช้คำจำกัดความของฟิลด์เอนทิตีเนื้อหา

มันไม่ง่ายเลยที่จะหาตัวอย่างของการใช้งานได้

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