Score:1

ไม่สามารถบันทึกค่าของฟิลด์วันที่และเวลาที่กำหนดเองได้

ธง in

ฉันติดต่อมาเพราะไม่พบสาเหตุที่ช่องวันที่และเวลาที่กำหนดเองของฉันไม่บันทึกค่าหลังจากที่ฉันส่ง

บริบท:

ฉันได้สร้างฟิลด์ที่มีฟิลด์วันที่และเวลาสองฟิลด์ ฉันจะใช้เพื่อเพิ่มหรือลบกิจกรรมออกจากรายการกิจกรรม ขึ้นอยู่กับว่าผ่านหรือไม่ (เช่น หากเทศกาลมีกำหนดตั้งแต่วันที่ 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 ยังมีจำกัด อย่าลังเลหากคุณต้องการข้อมูลเพิ่มเติมเกี่ยวกับรหัสของฉัน ตราบใดที่มันช่วยแก้ปัญหาได้!

โพสต์คำตอบ

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