Điểm:1

Trình xử lý biểu mẫu web để quản lý số lượng địa điểm có sẵn

lá cờ cn

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).
lá cờ cn
Xin vui lòng chỉ hỏi một câu hỏi cho mỗi bài viết. Lý do chỉ hỏi một câu hỏi là vì *Drupal Answers* có khái niệm về "câu trả lời được chấp nhận". Nếu người dùng A trả lời câu hỏi số 1 và người dùng B trả lời câu hỏi số 2, thì không có cách nào tốt để chọn câu trả lời nào sẽ được chấp nhận.
Ludo Parazoom avatar
lá cờ cn
OK tôi chỉnh sửa câu hỏi

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.