Doresc să gestionez un formular web pentru a-l închide automat în cazul în care s-a ajuns la un număr de persoane sau pentru o trimitere nevalidă dacă nu sunt suficiente locuri disponibile.
Am folosit asta: Închideți un formular web când numărul total de locuri atinge un maxim să încerce să facă un handler
aici este codul meu:
<?php
spațiu de nume Drupal\webform_reservations\Plugin\WebformHandler;
utilizați Drupal\Core\Form\FormStateInterface;
utilizați Drupal\webform\Plugin\WebformHandlerBase;
utilizați Drupal\webform\webformSubmissionInterface;
/**
* Manager de trimitere a formularelor.
*
* @WebformHandler(
* id = "webform_reservations_handler",
* label = @Translation ("Manager de rezervări"),
* categorie = @Translation ("Manager de formulare"),
* description = @Translation("Gestionați rezervările maxime prin trimitere. Fiți atent, sunt necesari câțiva parametri pentru lucru!"),
* cardinalitate = \Drupal\webform\Plugin\WebformHandlerInterface::CARDINALITY_SINGLE,
* rezultate = \Drupal\webform\Plugin\WebformHandlerInterface::RESULTS_PROCESSED,
* )
*/
clasa ReservationHandler extinde WebformHandlerBase {
/**
* {@inheritdoc}
*/
funcția publică submitForm(matrice &$form, FormStateInterface $form_state, WebformSubmissionInterface $webform_submission) {
$webform = $webform_submission->getWebform();
$formid = $webform->id();
$event_max_people= $webform_submission->getElementData('event_max_people');
//interogați db-ul pentru toate trimiterile de formulare web curente
$interogare = \Drupal::entityQuery('webform_submission');
$query->condition('webform_id', $formid);
$rezultat = $interogare->execute();
//încărcați toate trimiterile din rezultate
$storage = \Drupal::entityTypeManager()->getStorage('webform_submission');
$submissions = $storage->loadMultiple($rezultat);
$date_submission = array();
foreach ($submissions ca $submission) {
$submission_data[] = $submission->getData();
}
$curent_rezervat = 0;
//adună toate valorile din câmpul „număr_de_persoane” al fiecărei trimiteri și salvează-l într-o variabilă.
pentru ($i = 0; $i < count($date_submission); $i++){
$current_reserved += $submission_date[$i]['number_of_people'];
}
dacă ($event_max_people <= $curent_reserved) {
// stare în mod normal imposibilă deoarece formularul se închide automat când este atins numărul de persoane.
// TODO : schimbați starea formularului și nu adăugați această trimitere
$webform->setStatus(WebformInterface::STATUS_CLOSED);
$webform->salvare();
$log_message = "Formularul este plin, deci acum este închis, dar în mod normal ar fi trebuit deja închis!?";
} elseif ( $event_max_people == $curent_reserved + $webform_submission->getElementData('number_of_people')) {
// doar numărul de persoane pentru a închide înregistrările
// TODO : Deci schimbați starea formularului pentru a închide și adăugați trimiterea.
$webform->setStatus(false);
$webform->salvare();
$log_message = "Formularul este plin, deci acum este închis.De la " .$current_reserved. "/" .$event_max_people. " la ".($current_reserved+$webform_submission->getElementData('number_of_people')). "/" .$event_max_people . ".";
} elseif ($event_max_people < $current_reserved + $webform_submission->getElementData('nombre_de_personnes')) {
// Nu sunt suficiente locuri
// TODO : Fără trimitere și reveniți la formular cu un mesaj
$log_message = "Există doar " . ($event_max_people-$current_reserved) ." locuri rămase, așa că nu sunt suficiente pentru ".$webform_submission->getElementData('number_of_people') ." locurile solicitate !";
} altfel {
// totul este ok, deci nimic de făcut, doar un mesaj în jurnal
$log_message = "Formularul avea " .$current_reserved. „/” .$event_max_people. " oameni, iar acum, are : ".($current_reserved+$webform_submission->getElementData('number_of_people')). „/” .$event_max_people . " oameni.";
}
//Înregistrează rezultatul în loggerul drupal, pentru a indica dacă formularul web este încă deschis sau închis după fiecare trimitere.
\Drupal::logger('webform_reservations')->info($log_message);
}
}
Am o problemă cum pot schimba starea? am incercat:
$webform->setStatus(false);
$webform->salvare();
//sau
$webform->setStatus(WebformInterface::STATUS_CLOSED);
$webform->salvare();
//dar de fiecare dată când am eroarea:
Drupal\webform\WebformException : formularul web eventVoyage [event_voyage] are setări și/sau proprietăți înlocuite și nu poate fi salvat. în Drupal\webform\Entity\Webform->preSave() (linia 2296 de /var/www/html/web/modules/contrib/webform/src/Entity/Webform.php).