ฉันต้องการจัดการเว็บฟอร์มให้ปิดโดยอัตโนมัติหากมีคนเข้าถึงครบตามจำนวน หรือปิดการส่งที่ไม่ถูกต้องหากมีที่ว่างไม่เพียงพอ
ฉันใช้สิ่งนี้: ปิดเว็บฟอร์มเมื่อที่นั่งทั้งหมดถึงจำนวนสูงสุด เพื่อพยายามสร้างตัวจัดการ
นี่คือรหัสของฉัน:
<?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)