diff --git a/core/lib/Drupal/Core/Condition/ConditionPluginBase.php b/core/lib/Drupal/Core/Condition/ConditionPluginBase.php index ece4e205b53..4b4a07b6b62 100644 --- a/core/lib/Drupal/Core/Condition/ConditionPluginBase.php +++ b/core/lib/Drupal/Core/Condition/ConditionPluginBase.php @@ -44,8 +44,7 @@ abstract class ConditionPluginBase extends ExecutablePluginBase implements Condi * {@inheritdoc} */ public function buildConfigurationForm(array $form, FormStateInterface $form_state) { - $temporary = $form_state->getTemporary(); - $contexts = isset($temporary['gathered_contexts']) ? $temporary['gathered_contexts'] : []; + $contexts = $form_state->getTemporaryValue('gathered_contexts') ?: []; $form['context_mapping'] = $this->addContextAssignmentElement($this, $contexts); $form['negate'] = array( '#type' => 'checkbox', diff --git a/core/lib/Drupal/Core/Form/FormState.php b/core/lib/Drupal/Core/Form/FormState.php index b204d7707b7..c6266d76ef4 100644 --- a/core/lib/Drupal/Core/Form/FormState.php +++ b/core/lib/Drupal/Core/Form/FormState.php @@ -354,7 +354,7 @@ class FormState implements FormStateInterface { * * @var array */ - protected $temporary; + protected $temporary = []; /** * Tracks if the form has finished validation. @@ -711,6 +711,31 @@ class FormState implements FormStateInterface { return $this->temporary; } + /** + * {@inheritdoc} + */ + public function &getTemporaryValue($key) { + $value = &NestedArray::getValue($this->temporary, (array) $key); + return $value; + } + + /** + * {@inheritdoc} + */ + public function setTemporaryValue($key, $value) { + NestedArray::setValue($this->temporary, (array) $key, $value, TRUE); + return $this; + } + + /** + * {@inheritdoc} + */ + public function hasTemporaryValue($key) { + $exists = NULL; + NestedArray::getValue($this->temporary, (array) $key, $exists); + return $exists; + } + /** * {@inheritdoc} */ diff --git a/core/lib/Drupal/Core/Form/FormStateInterface.php b/core/lib/Drupal/Core/Form/FormStateInterface.php index 8a544dfa512..8b6a02a0196 100644 --- a/core/lib/Drupal/Core/Form/FormStateInterface.php +++ b/core/lib/Drupal/Core/Form/FormStateInterface.php @@ -933,6 +933,47 @@ interface FormStateInterface { */ public function getTemporary(); + /** + * Gets an arbitrary value from temporary storage. + * + * @param string|array $key + * Properties are often stored as multi-dimensional associative arrays. If + * $key is a string, it will return $temporary[$key]. If $key is an array, + * each element of the array will be used as a nested key. If + * $key = ['foo', 'bar'] it will return $temporary['foo']['bar']. + * + * @return mixed + * A reference to the value for that key, or NULL if the property does + * not exist. + */ + public function &getTemporaryValue($key); + + /** + * Sets an arbitrary value in temporary storage. + * + * @param string|array $key + * Properties are often stored as multi-dimensional associative arrays. If + * $key is a string, it will use $temporary[$key] = $value. If $key is an + * array, each element of the array will be used as a nested key. If + * $key = ['foo', 'bar'] it will use $temporary['foo']['bar'] = $value. + * @param mixed $value + * The value to set. + * + * @return $this + */ + public function setTemporaryValue($key, $value); + + /** + * Determines if a temporary value is present. + * + * @param string $key + * Properties are often stored as multi-dimensional associative arrays. If + * $key is a string, it will return isset($temporary[$key]). If $key is an + * array, each element of the array will be used as a nested key. If + * $key = ['foo', 'bar'] it will return isset($temporary['foo']['bar']). + */ + public function hasTemporaryValue($key); + /** * Sets the form element that triggered submission. * diff --git a/core/modules/block/src/BlockForm.php b/core/modules/block/src/BlockForm.php index a17d2225a64..0a5c8dedc77 100644 --- a/core/modules/block/src/BlockForm.php +++ b/core/modules/block/src/BlockForm.php @@ -104,9 +104,7 @@ class BlockForm extends EntityForm { // Store the gathered contexts in the form state for other objects to use // during form building. - $temporary = $form_state->getTemporary(); - $temporary['gathered_contexts'] = $this->dispatcher->dispatch(BlockEvents::ADMINISTRATIVE_CONTEXT, new BlockContextEvent())->getContexts(); - $form_state->setTemporary($temporary); + $form_state->setTemporaryValue('gathered_contexts', $this->dispatcher->dispatch(BlockEvents::ADMINISTRATIVE_CONTEXT, new BlockContextEvent())->getContexts()); $form['#tree'] = TRUE; $form['settings'] = $entity->getPlugin()->buildConfigurationForm(array(), $form_state); diff --git a/core/tests/Drupal/Tests/Core/Form/FormStateTest.php b/core/tests/Drupal/Tests/Core/Form/FormStateTest.php index 58132d0ce30..2b2a19359eb 100644 --- a/core/tests/Drupal/Tests/Core/Form/FormStateTest.php +++ b/core/tests/Drupal/Tests/Core/Form/FormStateTest.php @@ -514,6 +514,22 @@ class FormStateTest extends UnitTestCase { return $data; } + /** + * @covers ::getTemporaryValue + * @covers ::hasTemporaryValue + * @covers ::setTemporaryValue + */ + public function testTemporaryValue() { + $form_state = New FormState(); + $this->assertFalse($form_state->hasTemporaryValue('rainbow_sparkles')); + $form_state->setTemporaryValue('rainbow_sparkles', 'yes please'); + $this->assertSame($form_state->getTemporaryValue('rainbow_sparkles'), 'yes please'); + $this->assertTrue($form_state->hasTemporaryValue('rainbow_sparkles'), TRUE); + $form_state->setTemporaryValue(array('rainbow_sparkles', 'magic_ponies'), 'yes please'); + $this->assertSame($form_state->getTemporaryValue(array('rainbow_sparkles', 'magic_ponies')), 'yes please'); + $this->assertTrue($form_state->hasTemporaryValue(array('rainbow_sparkles', 'magic_ponies')), TRUE); + } + } /**