Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
33.33% |
2 / 6 |
CRAP | |
78.05% |
32 / 41 |
FormSubmitter | |
0.00% |
0 / 1 |
|
33.33% |
2 / 6 |
28.60 | |
78.05% |
32 / 41 |
__construct | |
100.00% |
1 / 1 |
1 | |
100.00% |
3 / 3 |
|||
doSubmitForm | |
0.00% |
0 / 1 |
12.00 | |
66.67% |
10 / 15 |
|||
executeSubmitHandlers | |
0.00% |
0 / 1 |
6.40 | |
77.78% |
7 / 9 |
|||
redirectForm | |
100.00% |
1 / 1 |
5 | |
100.00% |
12 / 12 |
|||
drupalInstallationAttempted | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
batchGet | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\Core\Form\FormSubmitter. | |
*/ | |
namespace Drupal\Core\Form; | |
use Drupal\Core\Url; | |
use Symfony\Component\HttpFoundation\RedirectResponse; | |
use Symfony\Component\HttpFoundation\RequestStack; | |
use Symfony\Component\HttpFoundation\Response; | |
use Drupal\Core\Routing\UrlGeneratorInterface; | |
/** | |
* Provides submission processing for forms. | |
*/ | |
class FormSubmitter implements FormSubmitterInterface { | |
/** | |
* The URL generator. | |
* | |
* @var \Drupal\Core\Routing\UrlGeneratorInterface | |
*/ | |
protected $urlGenerator; | |
/** | |
* The request stack. | |
* | |
* @var \Symfony\Component\HttpFoundation\RequestStack | |
*/ | |
protected $requestStack; | |
/** | |
* Constructs a new FormValidator. | |
* | |
* @param \Symfony\Component\HttpFoundation\RequestStack $request_stack | |
* The request stack. | |
* @param \Drupal\Core\Routing\UrlGeneratorInterface $url_generator | |
*/ | |
public function __construct(RequestStack $request_stack, UrlGeneratorInterface $url_generator) { | |
$this->requestStack = $request_stack; | |
$this->urlGenerator = $url_generator; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function doSubmitForm(&$form, FormStateInterface &$form_state) { | |
if (!$form_state->isSubmitted()) { | |
return; | |
} | |
// Execute form submit handlers. | |
$this->executeSubmitHandlers($form, $form_state); | |
// If batches were set in the submit handlers, we process them now, | |
// possibly ending execution. We make sure we do not react to the batch | |
// that is already being processed (if a batch operation performs a | |
// \Drupal\Core\Form\FormBuilderInterface::submitForm). | |
if ($batch = &$this->batchGet() && !isset($batch['current_set'])) { | |
// Store $form_state information in the batch definition. | |
$batch['form_state'] = $form_state; | |
$batch['progressive'] = !$form_state->isProgrammed(); | |
$response = batch_process(); | |
if ($batch['progressive']) { | |
return $response; | |
} | |
// Execution continues only for programmatic forms. | |
// For 'regular' forms, we get redirected to the batch processing | |
// page. Form redirection will be handled in _batch_finished(), | |
// after the batch is processed. | |
} | |
// Set a flag to indicate the form has been processed and executed. | |
$form_state->setExecuted(); | |
// If no response has been set, process the form redirect. | |
if (!$form_state->getResponse() && $redirect = $this->redirectForm($form_state)) { | |
$form_state->setResponse($redirect); | |
} | |
// If there is a response was set, return it instead of continuing. | |
if (($response = $form_state->getResponse()) && $response instanceof Response) { | |
return $response; | |
} | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function executeSubmitHandlers(&$form, FormStateInterface &$form_state) { | |
// If there was a button pressed, use its handlers. | |
$handlers = $form_state->getSubmitHandlers(); | |
// Otherwise, check for a form-level handler. | |
if (!$handlers && !empty($form['#submit'])) { | |
$handlers = $form['#submit']; | |
} | |
foreach ($handlers as $callback) { | |
// Check if a previous _submit handler has set a batch, but make sure we | |
// do not react to a batch that is already being processed (for instance | |
// if a batch operation performs a | |
// \Drupal\Core\Form\FormBuilderInterface::submitForm()). | |
if (($batch = &$this->batchGet()) && !isset($batch['id'])) { | |
// Some previous submit handler has set a batch. To ensure correct | |
// execution order, store the call in a special 'control' batch set. | |
// See _batch_next_set(). | |
$batch['sets'][] = array('form_submit' => $callback); | |
$batch['has_form_submits'] = TRUE; | |
} | |
else { | |
call_user_func_array($form_state->prepareCallback($callback), array(&$form, &$form_state)); | |
} | |
} | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function redirectForm(FormStateInterface $form_state) { | |
$redirect = $form_state->getRedirect(); | |
// Allow using redirect responses directly if needed. | |
if ($redirect instanceof RedirectResponse) { | |
return $redirect; | |
} | |
$url = NULL; | |
// Check for a route-based redirection. | |
if ($redirect instanceof Url) { | |
$url = $redirect->setAbsolute()->toString(); | |
} | |
// If no redirect was specified, redirect to the current path. | |
elseif ($redirect === NULL) { | |
$request = $this->requestStack->getCurrentRequest(); | |
$url = $this->urlGenerator->generateFromRoute('<current>', [], ['query' => $request->query->all(), 'absolute' => TRUE]); | |
} | |
if ($url) { | |
// According to RFC 7231, 303 See Other status code must be used to redirect | |
// user agent (and not default 302 Found). | |
// @see http://tools.ietf.org/html/rfc7231#section-6.4.4 | |
return new RedirectResponse($url, Response::HTTP_SEE_OTHER); | |
} | |
} | |
/** | |
* Wraps drupal_installation_attempted(). | |
* | |
* @return bool | |
*/ | |
protected function drupalInstallationAttempted() { | |
return drupal_installation_attempted(); | |
} | |
/** | |
* Wraps batch_get(). | |
*/ | |
protected function &batchGet() { | |
return batch_get(); | |
} | |
} |