Score:1

ตัวจัดการเว็บฟอร์มเพื่อจัดการจำนวนตำแหน่งที่มี

ธง cn

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

ฉันใช้สิ่งนี้: ปิดเว็บฟอร์มเมื่อที่นั่งทั้งหมดถึงจำนวนสูงสุด เพื่อพยายามสร้างตัวจัดการ

นี่คือรหัสของฉัน:

<?php
เนมสเปซ Drupal\webform_reservations\Plugin\WebformHandler;

ใช้ Drupal\Core\Form\FormStateInterface;
ใช้ Drupal\webform\Plugin\WebformHandlerBase;
ใช้ Drupal\webform\webformSubmissionInterface

/**
 * ตัวจัดการการส่งแบบฟอร์ม
 *
 * @เว็บฟอร์มแฮนเลอร์(
 * id = "webform_reservations_handler",
 * label = @Translation("ตัวจัดการการจอง"),
 * หมวดหมู่ = @Translation("ตัวจัดการแบบฟอร์ม"),
 * คำอธิบาย = @Translation("จัดการการจองสูงสุดโดยการส่ง ระวังพารามิเตอร์บางอย่างที่จำเป็นสำหรับการทำงาน !"),
 * จำนวนสมาชิก = \Drupal\webform\Plugin\WebformHandlerInterface::CARDINALITY_SINGLE
 * ผลลัพธ์ = \Drupal\webform\Plugin\WebformHandlerInterface::RESULTS_PROCESSED,
 * )
 */

คลาส ReservationHandler ขยาย WebformHandlerBase {

  /**
   * {@inheritdoc}
   */

  ฟังก์ชันสาธารณะ submitForm (อาร์เรย์ & $form, FormStateInterface $form_state, WebformSubmissionInterface $webform_submission) {
    $webform = $webform_submission->getWebform();
    $formid = $webform->id();
    $event_max_people= $webform_submission->getElementData('event_max_people');

// สอบถามฐานข้อมูลสำหรับการส่งทั้งหมดของการส่งเว็บฟอร์มปัจจุบัน
    $query = \Drupal::entityQuery('webform_submission');
    $query->condition('webform_id', $formid);
    $result = $query->execute();

// โหลดการส่งทั้งหมดจากผลลัพธ์
    $storage = \Drupal::entityTypeManager()->getStorage('webform_submission');
    $submissions = $storage->loadMultiple(ผลลัพธ์ของ $);
    $submission_data = อาร์เรย์();

    foreach ($ การส่งเป็น $ การส่ง) {
      $submission_data[] = $submission->getData();
    }
    $current_reserved = 0;
// เพิ่มค่าทั้งหมดในช่อง 'number_of_people' ของการส่งแต่ละครั้งและบันทึกลงในตัวแปร
    สำหรับ ($i = 0; $i < count($submission_data); $i++){
      $current_reserved += $submission_data[$i]['number_of_people'];
    }

    ถ้า ($event_max_people <= $current_reserved) {
      // โดยปกติสถานะเป็นไปไม่ได้เนื่องจากแบบฟอร์มจะปิดโดยอัตโนมัติเมื่อถึงจำนวนคน
      // TODO : เปลี่ยนสถานะของแบบฟอร์มและไม่เพิ่มการส่งนี้
      $webform->setStatus(WebformInterface::STATUS_CLOSED);
      $webform->save();
      $log_message = "แบบฟอร์มเต็มแล้ว ตอนนี้ปิดไปแล้ว แต่ปกติควรจะปิดอยู่แล้ว!";

    } elseif ( $event_max_people == $current_reserved + $webform_submission->getElementData('number_of_people')) {
      //แค่จำนวนคนปิดรับสมัคร
      // TODO : เปลี่ยนสถานะของแบบฟอร์มเป็นปิดและเพิ่มการส่ง
      $webform->setStatus(เท็จ);
      $webform->save();
      $log_message = "แบบฟอร์มเต็มแล้ว ดังนั้นตอนนี้จึงถูกปิดจาก " .$current_reserved. "/" .$event_max_people. " ถึง ".($current_reserved+$webform_submission->getElementData('number_of_people')). "/" .$event_max_people . ".";

    } elseif ($event_max_people < $current_reserved + $webform_submission->getElementData('nombre_de_personnes')) {
      //สถานที่ไม่พอ
      // สิ่งที่ต้องทำ : ไม่มีการส่งและกลับไปที่แบบฟอร์มพร้อมข้อความ
      $log_message = "มีแต่" ($event_max_people-$current_reserved) ." สถานที่เหลือไม่เพียงพอสำหรับ ".$webform_submission->getElementData('number_of_people') ของคุณ " สถานที่ที่ร้องขอ !";

    } อื่น {
      // ทุกอย่างเรียบร้อย ไม่ต้องทำอะไร มีเพียงข้อความในบันทึก
      $log_message = "แบบฟอร์มมี " .$current_reserved "/" .$event_max_people " people และตอนนี้ มี : ".($current_reserved+$webform_submission->getElementData('number_of_people')). "/" .$event_max_people " ผู้คน.";
    }

// บันทึกผลลัพธ์ไปยัง drupal logger เพื่อระบุว่าเว็บฟอร์มยังคงเปิดหรือปิดอยู่หลังจากการส่งแต่ละครั้ง
    \Drupal::logger('webform_reservations')->info($log_message);
  }
}

ฉันมีปัญหาในการเปลี่ยนสถานะ ? ฉันได้ลอง:

    $webform->setStatus(เท็จ);
    $webform->save();
    
    //หรือ
    
    $webform->setStatus(WebformInterface::STATUS_CLOSED);
    $webform->save();

    //แต่ทุกครั้งที่ฉันมีข้อผิดพลาด: 

    Drupal\webform\WebformException : เว็บฟอร์ม eventVoyage [event_voyage] มีการแทนที่การตั้งค่าและ/หรือคุณสมบัติ และไม่สามารถบันทึกได้ ใน Drupal\webform\Entity\Webform->preSave() (ligne 2296 de /var/www/html/web/modules/contrib/webform/src/Entity/Webform.php)
cn flag
กรุณาถามคำถามเพียงหนึ่งคำถามต่อโพสต์ เหตุผลที่ถามคำถามเพียงข้อเดียวเนื่องจาก *Drupal Answers* มีแนวคิดของ "คำตอบที่ยอมรับ" หากผู้ใช้ A ตอบคำถาม #1 และผู้ใช้ B ตอบคำถาม #2 จะไม่มีวิธีที่ดีในการเลือกคำตอบที่ควรยอมรับ
Ludo Parazoom avatar
cn flag
ตกลง ฉันแก้ไขคำถาม

โพสต์คำตอบ

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