Puncte:1

Manager de formulare web pentru a gestiona numărul de locuri disponibile

drapel cn

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).
drapel cn
Vă rugăm să puneți o singură întrebare pe post. Motivul pentru a pune o singură întrebare este că *Drupal Answers* are conceptul de „răspuns acceptat”. Dacă utilizatorul A răspunde la întrebarea #1 și utilizatorul B răspunde la întrebarea #2, nu există o modalitate bună de a alege ce răspuns ar trebui acceptat.
Ludo Parazoom avatar
drapel cn
OK editez intrebarea

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.