ฉันมีโมดูลแบบกำหนดเองที่สร้างประเภทฟิลด์ เป็นช่องข้อความธรรมดาและฉันได้เพิ่มลงในประเภทเนื้อหาโดยใช้ Drupal UI ความสำคัญของฟิลด์นี้คือ "ไม่จำกัด"
นี่คือวิธีที่ฉันสร้างฟิลด์ในรหัส:
คลาส MyItem ขยาย FieldItemBase {
/**
* {@inheritdoc}
*/
สคีมาของฟังก์ชันสแตติกสาธารณะ (FieldStorageDefinitionInterface $field_definition) {
กลับ [
'คอลัมน์' => [
'ค่า' => [
'ประเภท' => 'ข้อความ',
'ขนาด' => 'เล็ก',
'ไม่เป็นโมฆะ' => FALSE
]
'ค่าที่ปลอดภัย' => [
'ประเภท' => 'ข้อความ',
'ขนาด' => 'เล็ก',
'ไม่เป็นโมฆะ' => FALSE
]
]
];
}
/**
* {@inheritdoc}
*/
คุณสมบัติฟังก์ชันคงสาธารณะคำนิยาม (FieldStorageDefinitionInterface $field_definition) {
$properties['value'] = DataDefinition::create('สตริง')
->setLabel(t('ค่า'));
$properties['safevalue'] = DataDefinition::create('สตริง')
->setLabel(t('มูลค่าที่ปลอดภัย'))
->setComputed(จริง);
ส่งคืนคุณสมบัติ $;
}
}
อย่างที่คุณเห็นมีสองคอลัมน์: ค่า
ควรจะเก็บข้อมูลดิบของผู้ใช้ มูลค่าความปลอดภัย
ควรจะจัดเก็บข้อมูลในเวอร์ชันที่ผ่านการฆ่าเชื้อแล้ว
สำหรับการทดสอบนี้ ฉันแค่ทำสิ่งนี้ภายใน hook_node_presave()
:
ฟังก์ชัน mymodule_node_presave (\ Drupal\Core\Entity\EntityInterface $entity) {
สวิตช์ ($entity->getBundle()) {
กรณี 'mybundle':
$entity->field_myfield = ['หนึ่ง', 'สอง', 'สาม'];
$entity->field_myfield->safevalue = ['หนึ่ง', 'สอง', 'สาม'];
หยุดพัก;
}
}
หากฟิลด์มีจำนวนสมาชิกเป็น 1 (เช่น ค่าที่แทรกเป็นสเกลาร์) วิธีนี้ใช้ได้ดี
อย่างไรก็ตาม ถ้าฉันแทรกอาร์เรย์ เมื่อฉันตรวจสอบฐานข้อมูล และดูที่ตาราง node__field_myfield
ฉันเห็นว่าคอลัมน์ field_myfield_value
และ field_myfield_safevalue
ทั้งสองมีอยู่ด้วยการกำหนดค่าที่เหมือนกัน
ถ้าฉันสร้างโหนดโดยใช้ UI ฉันจะสังเกตสิ่งนี้:
field_myfield_value
คอลัมน์มีสามแถวที่มีสตริง 'หนึ่ง' 'สอง' และ 'สาม' ถูกต้อง.
field_myfield_safevalue
มีสตริง 'Array' ในแถวแรกและ NULL ในอีกสองแถว นั่นผิด
ฉันเดาว่าสิ่งที่ทำให้สิ่งต่าง ๆ ผิดพลาดคือฟิลด์นี้มีหลายค่าและฉันต้องใช้การกระทำอื่นเพื่อใส่ค่าให้ถูกต้อง
ฉันจะใส่ฟิลด์หลายค่าอย่างถูกต้องในไฟล์ได้อย่างไร มูลค่าความปลอดภัย
คอลัมน์?