I want to manage a webform to automatically close it if number of people reached, or to invalid submission if not enough places are available.
I have use this : Close a webform when total seats reach a maximum to try to make a handler
here is my code :
<?php
namespace Drupal\webform_reservations\Plugin\WebformHandler;
use Drupal\Core\Form\FormStateInterface;
use Drupal\webform\Plugin\WebformHandlerBase;
use Drupal\webform\webformSubmissionInterface;
class ReservationHandler extends WebformHandlerBase {
public function submitForm(array &$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($result);
$submission_data = array();
foreach ($submissions as $submission) {
$submission_data[] = $submission->getData();
}
$current_reserved = 0;
for ($i = 0; $i < count($submission_data); $i++){
$current_reserved += $submission_data[$i]['number_of_people'];
}
if ($event_max_people <= $current_reserved) {
$webform->setStatus(WebformInterface::STATUS_CLOSED);
$webform->save();
$log_message = "The form is full, so it's now closed, but normally it should already have been closed!?";
} elseif ( $event_max_people == $current_reserved + $webform_submission->getElementData('number_of_people')) {
$webform->setStatus(false);
$webform->save();
$log_message = "The form is full, so it's now closed. From " .$current_reserved. "/" .$event_max_people. " to ".($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 = "There are only " . ($event_max_people-$current_reserved) ." places left so not enough for your ".$webform_submission->getElementData('number_of_people') ." requested places !";
} else {
$log_message = "The form had " .$current_reserved. "/" .$event_max_people. " people, and now, it has : ".($current_reserved+$webform_submission->getElementData('number_of_people')). "/" .$event_max_people . " people.";
}
\Drupal::logger('webform_reservations')->info($log_message);
}
}
I have a problem how to change the status ? I have try :
$webform->setStatus(false);
$webform->save();
$webform->setStatus(WebformInterface::STATUS_CLOSED);
$webform->save();
Drupal\webform\WebformException : eventVoyage webform [event_voyage] has overridden settings and/or properties and can not be saved. dans Drupal\webform\Entity\Webform->preSave() (ligne 2296 de /var/www/html/web/modules/contrib/webform/src/Entity/Webform.php).