Рейтинг: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("Обработчик форм"),
 * description = @Translation("Управление максимальным количеством бронирований путем отправки. Для работы необходимы некоторые параметры Be Carfull!"),
 * кардинальность = \Drupal\webform\Plugin\WebformHandlerInterface::CARDINALITY_SINGLE,
 * результаты = \Drupal\webform\Plugin\WebformHandlerInterface::RESULTS_PROCESSED,
 * )
 */

класс ReservationHandler расширяет WebformHandlerBase {

  /**
   * {@inheritdoc}
   */

  публичная функция submitForm (массив и $ форма, 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->условие('webform_id', $formid);
    $результат = $запрос->выполнить();

// загружаем все заявки из результатов
    $storage = \Drupal::entityTypeManager()->getStorage('webform_submission');
    $submissions = $storage->loadMultiple($result);
    $submission_data = массив();

    foreach ($submissions как $submission) {
      $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);
      $веб-форма->сохранить();
      $log_message = "Форма заполнена, поэтому сейчас она закрыта, но обычно она уже должна была быть закрыта!?";

    } elseif ( $event_max_people == $current_reserved + $webform_submission->getElementData('number_of_people')) {
      // просто количество людей, чтобы закрыть регистрации
      // TODO: измените статус формы на закрытие и добавьте отправку.
      $ веб-форма-> setStatus (ложь);
      $веб-форма->сохранить();
      $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')) {
      // Недостаточно мест
      // TODO : Нет отправки и вернуться к форме с сообщением
      $log_message = "Есть только " . ($event_max_people-$current_reserved) ." мест осталось недостаточно для ".$webform_submission->getElementData('number_of_people') ." запрошенных мест !";

    } еще {
      // все ок, так что делать нечего, только сообщение в логе
      $log_message = "В форме было " .$current_reserved. "/" .$event_max_people. " люди, и теперь у него есть: ".($current_reserved+$webform_submission->getElementData('number_of_people')). "/" .$event_max_people . " люди.";
    }

// регистрируем вывод в регистраторе drupal, чтобы указать, открыта ли веб-форма или закрыта после каждой отправки.
    \Drupal::logger('webform_reservations')->info($log_message);
  }
}

У меня проблема, как изменить статус? Я пробовал:

    $ веб-форма-> setStatus (ложь);
    $веб-форма->сохранить();
    
    //или же
    
    $webform->setStatus(WebformInterface::STATUS_CLOSED);
    $веб-форма->сохранить();

    //но каждый раз у меня ошибка: 

    Drupal\webform\WebformException : веб-форма eventVoyage [event_voyage] имеет переопределенные настройки и/или свойства и не может быть сохранена. в Drupal\webform\Entity\Webform->preSave() (строка 2296 от /var/www/html/web/modules/contrib/webform/src/Entity/Webform.php).
флаг cn
Пожалуйста, задавайте только один вопрос в сообщении. Причина, по которой задается только один вопрос, заключается в том, что *Drupal Answers* имеет понятие "принятый ответ". Если пользователь А отвечает на вопрос № 1, а пользователь Б отвечает на вопрос № 2, нет хорошего способа выбрать, какой ответ следует принять.
Ludo Parazoom avatar
флаг cn
Хорошо, я редактирую вопрос

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.