Commit c78d806e authored by alexpott's avatar alexpott
Browse files

Issue #2527606 by dawehner, plach, mpdonadio, xjm, Wim Leers, Fabianx:...

Issue #2527606 by dawehner, plach, mpdonadio, xjm, Wim Leers, Fabianx: Uncaught PHP Exception LogicException when editing Views
parent a362252a
...@@ -875,10 +875,16 @@ public function buildOptionsForm(&$form, FormStateInterface $form_state) { ...@@ -875,10 +875,16 @@ public function buildOptionsForm(&$form, FormStateInterface $form_state) {
$this->documentSelfTokens($options[t('Fields')]); $this->documentSelfTokens($options[t('Fields')]);
// Default text. // Default text.
$output = '<p>' . $this->t('You must add some additional fields to this display before using this field. These fields may be marked as <em>Exclude from display</em> if you prefer. Note that due to rendering order, you cannot use fields that come after this field; if you need a field not listed here, rearrange your fields.') . '</p>';
$output = [];
$output[] = [
'#markup' => '<p>' . $this->t('You must add some additional fields to this display before using this field. These fields may be marked as <em>Exclude from display</em> if you prefer. Note that due to rendering order, you cannot use fields that come after this field; if you need a field not listed here, rearrange your fields.') . '</p>',
];
// We have some options, so make a list. // We have some options, so make a list.
if (!empty($options)) { if (!empty($options)) {
$output = '<p>' . $this->t("The following replacement tokens are available for this field. Note that due to rendering order, you cannot use fields that come after this field; if you need a field not listed here, rearrange your fields.") . '</p>'; $output[] = [
'#markup' => '<p>' . $this->t("The following replacement tokens are available for this field. Note that due to rendering order, you cannot use fields that come after this field; if you need a field not listed here, rearrange your fields.") . '</p>',
];
foreach (array_keys($options) as $type) { foreach (array_keys($options) as $type) {
if (!empty($options[$type])) { if (!empty($options[$type])) {
$items = array(); $items = array();
...@@ -890,7 +896,7 @@ public function buildOptionsForm(&$form, FormStateInterface $form_state) { ...@@ -890,7 +896,7 @@ public function buildOptionsForm(&$form, FormStateInterface $form_state) {
'#items' => $items, '#items' => $items,
'#list_type' => $type, '#list_type' => $type,
); );
$output .= $this->getRenderer()->render($item_list); $output[] = $item_list;
} }
} }
} }
...@@ -901,7 +907,7 @@ public function buildOptionsForm(&$form, FormStateInterface $form_state) { ...@@ -901,7 +907,7 @@ public function buildOptionsForm(&$form, FormStateInterface $form_state) {
$form['alter']['help'] = array( $form['alter']['help'] = array(
'#type' => 'details', '#type' => 'details',
'#title' => $this->t('Replacement patterns'), '#title' => $this->t('Replacement patterns'),
'#value' => SafeMarkup::set($output), '#value' => $output,
'#states' => array( '#states' => array(
'visible' => array( 'visible' => array(
array( array(
......
...@@ -12,6 +12,8 @@ ...@@ -12,6 +12,8 @@
use Drupal\Core\Form\FormBase; use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormState; use Drupal\Core\Form\FormState;
use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Render\BubbleableMetadata;
use Drupal\Core\Render\RenderContext;
use Drupal\views_ui\ViewUI; use Drupal\views_ui\ViewUI;
use Drupal\views\ViewEntityInterface; use Drupal\views\ViewEntityInterface;
use Drupal\views\Ajax; use Drupal\views\Ajax;
...@@ -205,8 +207,21 @@ protected function ajaxFormWrapper($form_class, FormStateInterface &$form_state) ...@@ -205,8 +207,21 @@ protected function ajaxFormWrapper($form_class, FormStateInterface &$form_state)
} }
$form_state->disableCache(); $form_state->disableCache();
$form = \Drupal::formBuilder()->buildForm($form_class, $form_state); // Builds the form in a render context in order to ensure that cacheable
// metadata is bubbled up.
$render_context = new RenderContext();
$callable = function () use ($form_class, &$form_state) {
return \Drupal::formBuilder()->buildForm($form_class, $form_state);
};
$form = $renderer->executeInRenderContext($render_context, $callable);
if (!$render_context->isEmpty()) {
BubbleableMetadata::createFromRenderArray($form)
->merge($render_context->pop())
->applyTo($form);
}
$output = $renderer->renderRoot($form); $output = $renderer->renderRoot($form);
drupal_process_attached($form); drupal_process_attached($form);
// These forms have the title built in, so set the title here: // These forms have the title built in, so set the title here:
......
...@@ -74,4 +74,23 @@ public function randomView(array $view = array()) { ...@@ -74,4 +74,23 @@ public function randomView(array $view = array()) {
return $default; return $default;
} }
/**
* {@inheritdoc}
*/
protected function drupalGet($path, array $options = array(), array $headers = array()) {
$url = $this->buildUrl($path, $options);
// Ensure that each nojs page is accessible via ajax as well.
if (strpos($url, 'nojs') !== FALSE) {
$url = str_replace('nojs', 'ajax', $url);
$result = $this->drupalGet($url, $options, $headers);
$this->assertResponse(200);
$this->assertHeader('Content-Type', 'application/json');
$this->assertTrue(json_decode($result), 'Ensure that the AJAX request returned valid content.');
}
return parent::drupalGet($path, $options, $headers);
}
} }
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment