ฉันติดต่อมาเพราะไม่พบสาเหตุที่ช่องวันที่และเวลาที่กำหนดเองของฉันไม่บันทึกค่าหลังจากที่ฉันส่ง
บริบท:
ฉันได้สร้างฟิลด์ที่มีฟิลด์วันที่และเวลาสองฟิลด์ ฉันจะใช้เพื่อเพิ่มหรือลบกิจกรรมออกจากรายการกิจกรรม ขึ้นอยู่กับว่าผ่านหรือไม่ (เช่น หากเทศกาลมีกำหนดตั้งแต่วันที่ 12 ถึง 14 ธันวาคม กิจกรรมจะถูกลบหลังจากวันที่ 14)
เหตุการณ์ในกรณีของฉันสร้างขึ้นจากเอนทิตีแบบกำหนดเอง ฉันสามารถจัดการฟิลด์ได้จากแบ็คออฟฟิศของฉัน เป้าหมายของฉันคือรับวันที่จากฟิลด์วันที่และเวลาที่กำหนดเองบนทวิกเพื่อกรองเหตุการณ์ที่จะแสดง
ฉันรู้ว่าฉันสามารถเพิ่มฟิลด์วันที่ได้สองฟิลด์ แต่ฉันพบว่ามันขาดความสง่างามที่ฉันมองหา
รหัสของฉัน:
ดังนั้นฉันจึงสร้างฟิลด์ที่กำหนดเองซึ่งมีฟิลด์วันที่และเวลาสองฟิลด์ ฉันทำตามบทช่วยสอนมากมายเพื่อค้นหาเวอร์ชันที่เหมาะกับฉัน และนี่คือโค้ดสำหรับประเภทฟิลด์ วิดเจ็ต และตัวจัดรูปแบบ
- ประเภทฟิลด์: ตารางรายการ.php
class ScheduleItem ขยาย FieldItemBase {
/**
* {@inheritdoc}
*/
ฟังก์ชั่นสาธารณะ isEmpty () {
$isEmpty =
ว่างเปล่า ($ this->get('start')->getValue()) &&
ว่างเปล่า ($ this->get ('เสร็จสิ้น') -> getValue ());
ส่งคืน $isEmpty;
}
/**
* {@inheritdoc}
*/
คุณสมบัติฟังก์ชันคงสาธารณะคำนิยาม (FieldStorageDefinitionInterface $field_definition) {
คุณสมบัติ $ = [];
$properties['start'] = DataDefinition::create('datetime_iso8601')
->setLabel(t('วันที่เผยแพร่'));
$properties['finish'] = DataDefinition::create('datetime_iso8601')
->setLabel(t('วันที่ยกเลิกการระงับ'));
ส่งคืนคุณสมบัติ $;
}
/**
* {@inheritdoc}
*/
สคีมาของฟังก์ชันสแตติกสาธารณะ (FieldStorageDefinitionInterface $field_definition) {
$คอลัมน์ = [
'เริ่มต้น' => [
'type' => 'วาร์ชาร์',
'mysql_type' => 'วันที่และเวลา',
'ไม่เป็นโมฆะ' => FALSE
'default' => NULL,
]
'เสร็จสิ้น' => [
'type' => 'วาร์ชาร์',
'mysql_type' => 'วันที่และเวลา',
'ไม่เป็นโมฆะ' => FALSE
'default' => NULL,
]
];
กลับ [
'value' => $คอลัมน์
// @DCG เพิ่มดัชนีที่นี่หากจำเป็น
];
}
ไม่มีอะไรจะพูดมากที่นี่ ฉันไม่รู้ว่ามีความขัดแย้งในประเภทที่ฉันใช้หรือไม่ เช่น mysql_type
, พิมพ์
และ DataDefinition::สร้าง
มีค่าต่างกัน...
- วิดเจ็ตภาคสนาม: วิดเจ็ตกำหนดการ
คลาส ScheduleWidget ขยาย DateTimeWidgetBase {
/**
* {@inheritdoc}
*/
ฟังก์ชั่นสาธารณะ formElement(
FieldItemListInterface $รายการ
$เดลต้า
อาร์เรย์ $องค์ประกอบ
อาร์เรย์ &$ ฟอร์ม
FormStateInterface $formState
) {
$องค์ประกอบ += อาร์เรย์(
'#เดลต้า' => $เดลต้า,
);
$องค์ประกอบ['เริ่มต้น'] = [
'#type' => 'วันที่และเวลา',
'#title' => $this->t('วันที่ตีพิมพ์'),
// ตั้งค่าปัจจุบันสำหรับฟิลด์นี้หรือค่าเริ่มต้น (หรือ
// null) ถ้าไม่มีค่า
'#default_value' => isset($items[$delta]->start) ?
$items[$delta]->start : null,
'#empty_value' => '',
];
$องค์ประกอบ['เสร็จสิ้น'] = [
'#type' => 'วันที่และเวลา',
'#title' => $this->t('วันที่ยกเลิกการระงับ'),
'#default_value' => isset($items[$delta]->finish) ?
$items[$delta]->เสร็จสิ้น : null,
'#empty_value' => '',
];
ส่งคืนองค์ประกอบ $;
}
}
ตรงกันข้ามกับวิดเจ็ตฟิลด์ที่กำหนดเองส่วนใหญ่ที่ฉันขยายออกไป DateTimeWidgetBase
และไม่ WidgetBase
ประเด็นคือการใช้สิ่งที่ทำไว้ล่วงหน้า ค่ารูปแบบการนวด
ฟังก์ชั่นจากชั้นเรียน มันควรจะแปลงค่าของฉันเป็นรูปแบบพร้อมฐานข้อมูลหากฉันเข้าใจถูกต้อง แต่จนถึงตอนนี้มันก็ไม่ได้ช่วยฉัน
- ตัวจัดรูปแบบฟิลด์: ScheduleDefaultFormatter.php
คลาส ScheduleDefaultFormatter ขยาย FormatterBase {
/**
* {@inheritdoc}
*/
ฟังก์ชั่นสาธารณะ viewElements (FieldItemListInterface $items, $langcode)
{
$องค์ประกอบ = [];
foreach ($items เป็น $delta => $item) {
$องค์ประกอบ[$เดลต้า] = [
'#start' => $item->เริ่ม,
'#finish' => $item->เสร็จสิ้น
];
}
ส่งคืนองค์ประกอบ $;
}
}
นั่นก็เพียงพอแล้วสำหรับรหัสของฉัน ฉันคิดว่ามันดี มันดูเป็นเช่นนั้นสำหรับฉัน แต่...
ปัญหา
เมื่อฉันเพิ่มฟิลด์ที่กำหนดเองใหม่ลงในเอนทิตีเหตุการณ์ของฉันในส่วน "จัดการฟิลด์" สร้างเหตุการณ์ใหม่และเพิ่มวันที่ลงไป ฉันได้...
ค่านี้ควรเป็นประเภทดั้งเดิมที่ถูกต้อง
สิ่งที่ฉันพยายาม
ฉันทิ้ง ค่า $
ก่อนหน้านี้ ค่ารูปแบบการนวด
ส่งคืนและนี่คือลักษณะ:
คำถามของฉันสำหรับคุณ ทำไมมันไม่ทำงาน
ฉันพยายามทำให้ชัดเจนที่สุดเท่าที่จะเป็นไปได้ แต่ประสบการณ์ของฉันบน Drupal ยังมีจำกัด อย่าลังเลหากคุณต้องการข้อมูลเพิ่มเติมเกี่ยวกับรหัสของฉัน ตราบใดที่มันช่วยแก้ปัญหาได้!