Tôi muốn quản lý một biểu mẫu web để tự động đóng biểu mẫu đó nếu đạt được số lượng người hoặc gửi không hợp lệ nếu không có đủ chỗ.
Tôi đã sử dụng cái này: Đóng biểu mẫu web khi tổng số chỗ đạt tối đa để cố gắng làm một bộ xử lý
đây là mã của tôi:
<?php
không gian tên Drupal\webform_reservations\Plugin\WebformHandler;
sử dụng Drupal\Core\Form\FormStateInterface;
sử dụng Drupal\webform\Plugin\WebformHandlerBase;
sử dụng Drupal\webform\webformSubmissionInterface;
/**
* Trình xử lý gửi biểu mẫu.
*
* @WebformHandler(
* id = "webform_reservations_handler",
* nhãn = @Translation("Trình xử lý đặt trước"),
* danh mục = @Translation("Trình xử lý biểu mẫu"),
* description = @Translation("Quản lý đặt trước tối đa bằng cách gửi. Hãy cẩn thận, một số tham số cần thiết để hoạt động!"),
* cardinality = \Drupal\webform\Plugin\WebformHandlerInterface::CARDINALITY_SINGLE,
* kết quả = \Drupal\webform\Plugin\WebformHandlerInterface::RESULTS_PROCESSED,
* )
*/
lớp ReservationHandler mở rộng WebformHandlerBase {
/**
* {@inheritdoc}
*/
hàm công khai submitForm(mảng &$form, FormStateInterface $form_state, WebformSubmissionInterface $webform_submission) {
$webform = $webform_submission->getWebform();
$formid = $webform->id();
$event_max_people= $webform_submission->getElementData('event_max_people');
// truy vấn db cho tất cả các lần gửi biểu mẫu web hiện tại
$query = \Drupal::entityQuery('webform_submission');
$query->condition('webform_id', $formid);
$result = $query->execute();
// tải tất cả các đệ trình từ kết quả
$storage = \Drupal::entityTypeManager()->getStorage('webform_submission');
$submissions = $storage->loadMultiple($result);
$submission_data = mảng();
foreach ($submissions dưới dạng $submission) {
$submission_data[] = $submission->getData();
}
$current_reserve = 0;
// cộng tất cả các giá trị trong trường 'số_người' của mỗi lần gửi và lưu vào một biến.
for ($i = 0; $i < đếm($submission_data); $i++){
$current_reserve += $submission_data[$i]['number_of_people'];
}
if ($event_max_people <= $current_reserve) {
// trạng thái bình thường là không thể vì form tự động đóng khi đủ số người.
// TODO : thay đổi trạng thái của biểu mẫu và không thêm nội dung gửi này
$webform->setStatus(WebformInterface::STATUS_CLOSED);
$webform->save();
$log_message = "Mẫu đơn đã đầy, vì vậy nó hiện đã được đóng lại, nhưng bình thường thì nó đã được đóng rồi!?";
} elseif ( $event_max_people == $current_reserve + $webform_submission->getElementData('number_of_people')) {
// chỉ số người đóng đăng ký
// TODO : Vì vậy, hãy thay đổi trạng thái biểu mẫu thành đóng và thêm nội dung gửi.
$webform->setStatus(false);
$webform->save();
$log_message = "Mẫu đã đầy, vì vậy nó hiện đang đóng.Từ " .$current_reserve."/" .$event_max_people." đến ".($current_reserve+$webform_submission->getElementData('number_of_people'))."/".$event_max_people .".";
} elseif ($event_max_people < $current_reserve + $webform_submission->getElementData('nombre_de_personnes')) {
// Không đủ chỗ
// TODO : Không gửi và quay lại biểu mẫu với một tin nhắn
$log_message = "Chỉ có " . ($event_max_people-$current_reserve) ." các địa điểm còn lại không đủ cho ".$webform_submission->getElementData('number_of_people') ." các địa điểm được yêu cầu của bạn !";
} khác {
// mọi thứ đều ổn, vì vậy không có gì để làm, chỉ có một thông báo trong nhật ký
$log_message = "Biểu mẫu có " .$current_reserve. "/".$event_max_people. " mọi người và hiện tại, nó có : ".($current_reserve+$webform_submission->getElementData('number_of_people')). "/" .$event_max_people . " Mọi người.";
}
// ghi đầu ra vào trình ghi nhật ký drupal, để cho biết biểu mẫu web vẫn mở hay đóng sau mỗi lần gửi.
\Drupal::logger('webform_reservations')->info($log_message);
}
}
Tôi có một vấn đề làm thế nào để thay đổi trạng thái? Tôi đã thử:
$webform->setStatus(false);
$webform->save();
//hoặc
$webform->setStatus(WebformInterface::STATUS_CLOSED);
$webform->save();
// nhưng mỗi lần tôi gặp lỗi:
Drupal\webform\WebformException : biểu mẫu web eventVoyage [event_voyage] có cài đặt và/hoặc thuộc tính bị ghi đè và không thể lưu được. dans Drupal\webform\Entity\Webform->preSave() (ligne 2296 de /var/www/html/web/modules/contrib/webform/src/Entity/Webform.php).