eca-1.0.x-dev/modules/render/src/Form/EcaCustomForm.php
modules/render/src/Form/EcaCustomForm.php
<?php namespace Drupal\eca_render\Form; use Drupal\Core\Form\BaseFormIdInterface; use Drupal\Core\Form\FormStateInterface; /** * Form object for custom forms defined by ECA. */ class EcaCustomForm implements BaseFormIdInterface { /** * The custom form ID. * * @var string */ protected string $formId; /** * Constructs a new EcaCustomForm object. * * @param string $form_id * The custom form ID. It must be prefixed with "eca_custom_". */ public function __construct(string $form_id) { if (!(mb_strpos($form_id, 'eca_custom_') === 0)) { throw new \InvalidArgumentException("The provided custom form ID must start with \"eca_custom_\". It cannot be used for other form IDs."); } $this->formId = $form_id; } /** * {@inheritdoc} */ public function getBaseFormId(): ?string { return 'eca_custom'; } /** * {@inheritdoc} */ public function getFormId(): string { return $this->formId; } /** * {@inheritdoc} */ public function buildForm(array $form, FormStateInterface $form_state): array { return $form; } /** * {@inheritdoc} */ public function validateForm(array &$form, FormStateInterface $form_state): void { $submit_handlers = $form_state->getSubmitHandlers(); $self_submit_handler = [$this, 'submitForm']; if (!in_array($self_submit_handler, $submit_handlers, TRUE)) { // Make sure the submit handler of this form is always included. $form_state->setSubmitHandlers(array_merge($submit_handlers, [$self_submit_handler])); } } /** * {@inheritdoc} */ public function submitForm(array &$form, FormStateInterface $form_state): void { if (!$form_state->getRedirect() || $form_state->isRedirectDisabled()) { // A custom form is often embedded on already existing pages. // When no redirect is specified, the server may respond with a 303 // status code, which leads to execution of all submission logic on the // server side, but the result will never be displayed on the page. That // is caused by the 303 status code, instructing the browser to send // another request again to the same page. Enforcing a form rebuild here // prevents the server from responding with a 303, and directly responds // with a 200 status code. $form_state->setRebuild(TRUE); } } }