Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 2 |
CRAP | |
80.00% |
16 / 20 |
FormAjaxResponseBuilder | |
0.00% |
0 / 1 |
|
0.00% |
0 / 2 |
11.97 | |
80.00% |
16 / 20 |
__construct | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 3 |
|||
buildResponse | |
0.00% |
0 / 1 |
10.02 | |
94.12% |
16 / 17 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\Core\Form\FormAjaxResponseBuilder. | |
*/ | |
namespace Drupal\Core\Form; | |
use Drupal\Core\Ajax\AjaxResponse; | |
use Drupal\Core\Ajax\UpdateBuildIdCommand; | |
use Drupal\Core\Render\MainContent\MainContentRendererInterface; | |
use Drupal\Core\Routing\RouteMatchInterface; | |
use Symfony\Component\HttpFoundation\Request; | |
use Symfony\Component\HttpKernel\Exception\HttpException; | |
/** | |
* Builds an AJAX form response. | |
* | |
* Given the current request, a form render array, its form state, and any AJAX | |
* commands to apply to the form, build a response object. | |
*/ | |
class FormAjaxResponseBuilder implements FormAjaxResponseBuilderInterface { | |
/** | |
* The main content to AJAX Response renderer. | |
* | |
* @var \Drupal\Core\Render\MainContent\MainContentRendererInterface | |
*/ | |
protected $ajaxRenderer; | |
/** | |
* The current route match. | |
* | |
* @var \Drupal\Core\Routing\RouteMatchInterface | |
*/ | |
protected $routeMatch; | |
/** | |
* Constructs a new FormAjaxResponseBuilder. | |
* | |
* @param \Drupal\Core\Render\MainContent\MainContentRendererInterface $ajax_renderer | |
* The ajax renderer. | |
* @param \Drupal\Core\Routing\RouteMatchInterface $route_match | |
* The current route match. | |
*/ | |
public function __construct(MainContentRendererInterface $ajax_renderer, RouteMatchInterface $route_match) { | |
$this->ajaxRenderer = $ajax_renderer; | |
$this->routeMatch = $route_match; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function buildResponse(Request $request, array $form, FormStateInterface $form_state, array $commands) { | |
// If the form build ID has changed, issue an Ajax command to update it. | |
if (isset($form['#build_id_old']) && $form['#build_id_old'] !== $form['#build_id']) { | |
$commands[] = new UpdateBuildIdCommand($form['#build_id_old'], $form['#build_id']); | |
} | |
// We need to return the part of the form (or some other content) that needs | |
// to be re-rendered so the browser can update the page with changed | |
// content. It is up to the #ajax['callback'] function of the element (may | |
// or may not be a button) that triggered the Ajax request to determine what | |
// needs to be rendered. | |
$callback = NULL; | |
if (($triggering_element = $form_state->getTriggeringElement()) && isset($triggering_element['#ajax']['callback'])) { | |
$callback = $triggering_element['#ajax']['callback']; | |
} | |
$callback = $form_state->prepareCallback($callback); | |
if (empty($callback) || !is_callable($callback)) { | |
throw new HttpException(500, 'The specified #ajax callback is empty or not callable.'); | |
} | |
$result = call_user_func_array($callback, [&$form, &$form_state, $request]); | |
// If the callback is an #ajax callback, the result is a render array, and | |
// we need to turn it into an AJAX response, so that we can add any commands | |
// we got earlier; typically the UpdateBuildIdCommand when handling an AJAX | |
// submit from a cached page. | |
if ($result instanceof AjaxResponse) { | |
$response = $result; | |
} | |
else { | |
// At this point we know callback returned a render element. If the | |
// element is part of the group (#group is set on it) it won't be rendered | |
// unless we remove #group from it. This is caused by | |
// \Drupal\Core\Render\Element\RenderElement::preRenderGroup(), which | |
// prevents all members of groups from being rendered directly. | |
if (!empty($result['#group'])) { | |
unset($result['#group']); | |
} | |
/** @var \Drupal\Core\Ajax\AjaxResponse $response */ | |
$response = $this->ajaxRenderer->renderResponse($result, $request, $this->routeMatch); | |
} | |
foreach ($commands as $command) { | |
$response->addCommand($command, TRUE); | |
} | |
return $response; | |
} | |
} |