Issue #1705920 by tim.plunkett, sun, underq, javier.alejandr...: Convert all calls to procedural drupal_array_()*() functions to Drupal\Component\Utility\NestedArray.
parent
3a150c7154
commit
f55649698c
|
@ -2013,58 +2013,6 @@ function drupal_get_hash_salt() {
|
|||
return !empty($drupal_hash_salt) ? $drupal_hash_salt : '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Merges multiple arrays, recursively, and returns the merged array.
|
||||
*
|
||||
* This function is similar to PHP's array_merge_recursive() function, but it
|
||||
* handles non-array values differently. When merging values that are not both
|
||||
* arrays, the latter value replaces the former rather than merging with it.
|
||||
*
|
||||
* Example:
|
||||
* @code
|
||||
* $link_options_1 = array('fragment' => 'x', 'attributes' => array('title' => t('X'), 'class' => array('a', 'b')));
|
||||
* $link_options_2 = array('fragment' => 'y', 'attributes' => array('title' => t('Y'), 'class' => array('c', 'd')));
|
||||
*
|
||||
* // This results in array('fragment' => array('x', 'y'), 'attributes' => array('title' => array(t('X'), t('Y')), 'class' => array('a', 'b', 'c', 'd'))).
|
||||
* $incorrect = array_merge_recursive($link_options_1, $link_options_2);
|
||||
*
|
||||
* // This results in array('fragment' => 'y', 'attributes' => array('title' => t('Y'), 'class' => array('a', 'b', 'c', 'd'))).
|
||||
* $correct = drupal_array_merge_deep($link_options_1, $link_options_2);
|
||||
* @endcode
|
||||
*
|
||||
* @param ...
|
||||
* Arrays to merge.
|
||||
*
|
||||
* @return
|
||||
* The merged array.
|
||||
*
|
||||
* @see drupal_array_merge_deep_array()
|
||||
*/
|
||||
function drupal_array_merge_deep() {
|
||||
return drupal_array_merge_deep_array(func_get_args());
|
||||
}
|
||||
|
||||
/**
|
||||
* Merges multiple arrays, recursively, and returns the merged array.
|
||||
*
|
||||
* This function is equivalent to drupal_array_merge_deep(), except the
|
||||
* input arrays are passed as a single array parameter rather than a variable
|
||||
* parameter list.
|
||||
*
|
||||
* The following are equivalent:
|
||||
* - drupal_array_merge_deep($a, $b);
|
||||
* - drupal_array_merge_deep_array(array($a, $b));
|
||||
*
|
||||
* The following are also equivalent:
|
||||
* - call_user_func_array('drupal_array_merge_deep', $arrays_to_merge);
|
||||
* - drupal_array_merge_deep_array($arrays_to_merge);
|
||||
*
|
||||
* @see drupal_array_merge_deep()
|
||||
*/
|
||||
function drupal_array_merge_deep_array($arrays) {
|
||||
return NestedArray::mergeDeepArray($arrays);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates a default anonymous $user object.
|
||||
*
|
||||
|
|
|
@ -3954,7 +3954,7 @@ function drupal_pre_render_scripts($elements) {
|
|||
switch ($item['type']) {
|
||||
case 'setting':
|
||||
$element['#value_prefix'] = $embed_prefix;
|
||||
$element['#value'] = 'var drupalSettings = ' . drupal_json_encode(drupal_array_merge_deep_array($item['data'])) . ";";
|
||||
$element['#value'] = 'var drupalSettings = ' . drupal_json_encode(NestedArray::mergeDeepArray($item['data'])) . ";";
|
||||
$element['#value_suffix'] = $embed_suffix;
|
||||
break;
|
||||
|
||||
|
@ -6087,225 +6087,6 @@ function element_set_attributes(array &$element, array $map) {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves a value from a nested array with variable depth.
|
||||
*
|
||||
* This helper function should be used when the depth of the array element being
|
||||
* retrieved may vary (that is, the number of parent keys is variable). It is
|
||||
* primarily used for form structures and renderable arrays.
|
||||
*
|
||||
* Without this helper function the only way to get a nested array value with
|
||||
* variable depth in one line would be using eval(), which should be avoided:
|
||||
* @code
|
||||
* // Do not do this! Avoid eval().
|
||||
* // May also throw a PHP notice, if the variable array keys do not exist.
|
||||
* eval('$value = $array[\'' . implode("']['", $parents) . "'];");
|
||||
* @endcode
|
||||
*
|
||||
* Instead, use this helper function:
|
||||
* @code
|
||||
* $value = drupal_array_get_nested_value($form, $parents);
|
||||
* @endcode
|
||||
*
|
||||
* The return value will be NULL, regardless of whether the actual value is NULL
|
||||
* or whether the requested key does not exist. If it is required to know
|
||||
* whether the nested array key actually exists, pass a third argument that is
|
||||
* altered by reference:
|
||||
* @code
|
||||
* $key_exists = NULL;
|
||||
* $value = drupal_array_get_nested_value($form, $parents, $key_exists);
|
||||
* if ($key_exists) {
|
||||
* // ... do something with $value ...
|
||||
* }
|
||||
* @endcode
|
||||
*
|
||||
* However if the number of array parent keys is static, the value should always
|
||||
* be retrieved directly rather than calling this function. For instance:
|
||||
* @code
|
||||
* $value = $form['signature_settings']['signature'];
|
||||
* @endcode
|
||||
*
|
||||
* @param $array
|
||||
* The array from which to get the value.
|
||||
* @param $parents
|
||||
* An array of parent keys of the value, starting with the outermost key.
|
||||
* @param $key_exists
|
||||
* (optional) If given, an already defined variable that is altered by
|
||||
* reference.
|
||||
*
|
||||
* @return
|
||||
* The requested nested value. Possibly NULL if the value is NULL or not all
|
||||
* nested parent keys exist. $key_exists is altered by reference and is a
|
||||
* Boolean that indicates whether all nested parent keys exist (TRUE) or not
|
||||
* (FALSE). This allows to distinguish between the two possibilities when NULL
|
||||
* is returned.
|
||||
*
|
||||
* @see drupal_array_set_nested_value()
|
||||
* @see drupal_array_unset_nested_value()
|
||||
*/
|
||||
function &drupal_array_get_nested_value(array &$array, array $parents, &$key_exists = NULL) {
|
||||
return NestedArray::getValue($array, $parents, $key_exists);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a value in a nested array with variable depth.
|
||||
*
|
||||
* This helper function should be used when the depth of the array element you
|
||||
* are changing may vary (that is, the number of parent keys is variable). It
|
||||
* is primarily used for form structures and renderable arrays.
|
||||
*
|
||||
* Example:
|
||||
* @code
|
||||
* // Assume you have a 'signature' element somewhere in a form. It might be:
|
||||
* $form['signature_settings']['signature'] = array(
|
||||
* '#type' => 'text_format',
|
||||
* '#title' => t('Signature'),
|
||||
* );
|
||||
* // Or, it might be further nested:
|
||||
* $form['signature_settings']['user']['signature'] = array(
|
||||
* '#type' => 'text_format',
|
||||
* '#title' => t('Signature'),
|
||||
* );
|
||||
* @endcode
|
||||
*
|
||||
* To deal with the situation, the code needs to figure out the route to the
|
||||
* element, given an array of parents that is either
|
||||
* @code array('signature_settings', 'signature') @endcode in the first case or
|
||||
* @code array('signature_settings', 'user', 'signature') @endcode in the second
|
||||
* case.
|
||||
*
|
||||
* Without this helper function the only way to set the signature element in one
|
||||
* line would be using eval(), which should be avoided:
|
||||
* @code
|
||||
* // Do not do this! Avoid eval().
|
||||
* eval('$form[\'' . implode("']['", $parents) . '\'] = $element;');
|
||||
* @endcode
|
||||
*
|
||||
* Instead, use this helper function:
|
||||
* @code
|
||||
* drupal_array_set_nested_value($form, $parents, $element);
|
||||
* @endcode
|
||||
*
|
||||
* However if the number of array parent keys is static, the value should always
|
||||
* be set directly rather than calling this function. For instance, for the
|
||||
* first example we could just do:
|
||||
* @code
|
||||
* $form['signature_settings']['signature'] = $element;
|
||||
* @endcode
|
||||
*
|
||||
* @param $array
|
||||
* A reference to the array to modify.
|
||||
* @param $parents
|
||||
* An array of parent keys, starting with the outermost key.
|
||||
* @param $value
|
||||
* The value to set.
|
||||
* @param $force
|
||||
* (Optional) If TRUE, the value is forced into the structure even if it
|
||||
* requires the deletion of an already existing non-array parent value. If
|
||||
* FALSE, PHP throws an error if trying to add into a value that is not an
|
||||
* array. Defaults to FALSE.
|
||||
*
|
||||
* @see drupal_array_unset_nested_value()
|
||||
* @see drupal_array_get_nested_value()
|
||||
*/
|
||||
function drupal_array_set_nested_value(array &$array, array $parents, $value, $force = FALSE) {
|
||||
NestedArray::setValue($array, $parents, $value, $force);
|
||||
}
|
||||
|
||||
/**
|
||||
* Unsets a value in a nested array with variable depth.
|
||||
*
|
||||
* This helper function should be used when the depth of the array element you
|
||||
* are changing may vary (that is, the number of parent keys is variable). It
|
||||
* is primarily used for form structures and renderable arrays.
|
||||
*
|
||||
* Example:
|
||||
* @code
|
||||
* // Assume you have a 'signature' element somewhere in a form. It might be:
|
||||
* $form['signature_settings']['signature'] = array(
|
||||
* '#type' => 'text_format',
|
||||
* '#title' => t('Signature'),
|
||||
* );
|
||||
* // Or, it might be further nested:
|
||||
* $form['signature_settings']['user']['signature'] = array(
|
||||
* '#type' => 'text_format',
|
||||
* '#title' => t('Signature'),
|
||||
* );
|
||||
* @endcode
|
||||
*
|
||||
* To deal with the situation, the code needs to figure out the route to the
|
||||
* element, given an array of parents that is either
|
||||
* @code array('signature_settings', 'signature') @endcode in the first case or
|
||||
* @code array('signature_settings', 'user', 'signature') @endcode in the second
|
||||
* case.
|
||||
*
|
||||
* Without this helper function the only way to unset the signature element in
|
||||
* one line would be using eval(), which should be avoided:
|
||||
* @code
|
||||
* // Do not do this! Avoid eval().
|
||||
* eval('unset($form[\'' . implode("']['", $parents) . '\']);');
|
||||
* @endcode
|
||||
*
|
||||
* Instead, use this helper function:
|
||||
* @code
|
||||
* drupal_array_unset_nested_value($form, $parents, $element);
|
||||
* @endcode
|
||||
*
|
||||
* However if the number of array parent keys is static, the value should always
|
||||
* be set directly rather than calling this function. For instance, for the
|
||||
* first example we could just do:
|
||||
* @code
|
||||
* unset($form['signature_settings']['signature']);
|
||||
* @endcode
|
||||
*
|
||||
* @param $array
|
||||
* A reference to the array to modify.
|
||||
* @param $parents
|
||||
* An array of parent keys, starting with the outermost key and including the
|
||||
* key to be unset.
|
||||
* @param $key_existed
|
||||
* (optional) If given, an already defined variable that is altered by
|
||||
* reference.
|
||||
*
|
||||
* @see drupal_array_set_nested_value()
|
||||
* @see drupal_array_get_nested_value()
|
||||
*/
|
||||
function drupal_array_unset_nested_value(array &$array, array $parents, &$key_existed = NULL) {
|
||||
NestedArray::unsetValue($array, $parents, $key_existed);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines whether a nested array contains the requested keys.
|
||||
*
|
||||
* This helper function should be used when the depth of the array element to be
|
||||
* checked may vary (that is, the number of parent keys is variable). See
|
||||
* drupal_array_set_nested_value() for details. It is primarily used for form
|
||||
* structures and renderable arrays.
|
||||
*
|
||||
* If it is required to also get the value of the checked nested key, use
|
||||
* drupal_array_get_nested_value() instead.
|
||||
*
|
||||
* If the number of array parent keys is static, this helper function is
|
||||
* unnecessary and the following code can be used instead:
|
||||
* @code
|
||||
* $value_exists = isset($form['signature_settings']['signature']);
|
||||
* $key_exists = array_key_exists('signature', $form['signature_settings']);
|
||||
* @endcode
|
||||
*
|
||||
* @param $array
|
||||
* The array with the value to check for.
|
||||
* @param $parents
|
||||
* An array of parent keys of the value, starting with the outermost key.
|
||||
*
|
||||
* @return
|
||||
* TRUE if all the parent keys exist, FALSE otherwise.
|
||||
*
|
||||
* @see drupal_array_get_nested_value()
|
||||
*/
|
||||
function drupal_array_nested_key_exists(array $array, array $parents) {
|
||||
return NestedArray::keyExists($array, $parents);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses Drupal module and theme .info files.
|
||||
*
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
* Functions for form and batch generation and processing.
|
||||
*/
|
||||
|
||||
use Drupal\Component\Utility\NestedArray;
|
||||
use Drupal\Core\Utility\Color;
|
||||
use Drupal\Core\Template\Attribute;
|
||||
|
||||
|
@ -1160,9 +1161,9 @@ function drupal_validate_form($form_id, &$form, &$form_state) {
|
|||
// If the section exists within $form_state['values'], even if the value
|
||||
// is NULL, copy it to $values.
|
||||
$section_exists = NULL;
|
||||
$value = drupal_array_get_nested_value($form_state['values'], $section, $section_exists);
|
||||
$value = NestedArray::getValue($form_state['values'], $section, $section_exists);
|
||||
if ($section_exists) {
|
||||
drupal_array_set_nested_value($values, $section, $value);
|
||||
NestedArray::setValue($values, $section, $value);
|
||||
}
|
||||
}
|
||||
// A button's #value does not require validation, so for convenience we
|
||||
|
@ -1176,8 +1177,8 @@ function drupal_validate_form($form_id, &$form, &$form_state) {
|
|||
// dictated by #parents. If it is, copy it to $values, but do not override
|
||||
// what may already be in $values.
|
||||
$parents = $form_state['triggering_element']['#parents'];
|
||||
if (!drupal_array_nested_key_exists($values, $parents) && drupal_array_get_nested_value($form_state['values'], $parents) === $button_value) {
|
||||
drupal_array_set_nested_value($values, $parents, $button_value);
|
||||
if (!NestedArray::keyExists($values, $parents) && NestedArray::getValue($form_state['values'], $parents) === $button_value) {
|
||||
NestedArray::setValue($values, $parents, $button_value);
|
||||
}
|
||||
|
||||
// Additionally, form_builder() places the button value in
|
||||
|
@ -2024,7 +2025,7 @@ function _form_builder_handle_input_element($form_id, &$element, &$form_state) {
|
|||
// Get the input for the current element. NULL values in the input need to
|
||||
// be explicitly distinguished from missing input. (see below)
|
||||
$input_exists = NULL;
|
||||
$input = drupal_array_get_nested_value($form_state['input'], $element['#parents'], $input_exists);
|
||||
$input = NestedArray::getValue($form_state['input'], $element['#parents'], $input_exists);
|
||||
// For browser-submitted forms, the submitted values do not contain values
|
||||
// for certain elements (empty multiple select, unchecked checkbox).
|
||||
// During initial form processing, we add explicit NULL values for such
|
||||
|
@ -2037,7 +2038,7 @@ function _form_builder_handle_input_element($form_id, &$element, &$form_state) {
|
|||
if (!$input_exists && !$form_state['rebuild'] && !$form_state['programmed']) {
|
||||
// Add the necessary parent keys to $form_state['input'] and sets the
|
||||
// element's input value to NULL.
|
||||
drupal_array_set_nested_value($form_state['input'], $element['#parents'], NULL);
|
||||
NestedArray::setValue($form_state['input'], $element['#parents'], NULL);
|
||||
$input_exists = TRUE;
|
||||
}
|
||||
// If we have input for the current element, assign it to the #value
|
||||
|
@ -2096,7 +2097,7 @@ function _form_builder_handle_input_element($form_id, &$element, &$form_state) {
|
|||
|
||||
// Set the element's value in $form_state['values'], but only, if its key
|
||||
// does not exist yet (a #value_callback may have already populated it).
|
||||
if (!drupal_array_nested_key_exists($form_state['values'], $element['#parents'])) {
|
||||
if (!NestedArray::keyExists($form_state['values'], $element['#parents'])) {
|
||||
form_set_value($element, $element['#value'], $form_state);
|
||||
}
|
||||
}
|
||||
|
@ -2209,7 +2210,7 @@ function form_state_values_clean(&$form_state) {
|
|||
$parents = $button['#parents'];
|
||||
$last_parent = array_pop($parents);
|
||||
$key_exists = NULL;
|
||||
$values = &drupal_array_get_nested_value($form_state['values'], $parents, $key_exists);
|
||||
$values = &NestedArray::getValue($form_state['values'], $parents, $key_exists);
|
||||
if ($key_exists && is_array($values)) {
|
||||
unset($values[$last_parent]);
|
||||
}
|
||||
|
@ -2550,7 +2551,7 @@ function form_type_token_value($element, $input = FALSE) {
|
|||
* Form state array where the value change should be recorded.
|
||||
*/
|
||||
function form_set_value($element, $value, &$form_state) {
|
||||
drupal_array_set_nested_value($form_state['values'], $element['#parents'], $value, TRUE);
|
||||
NestedArray::setValue($form_state['values'], $element['#parents'], $value, TRUE);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -3637,7 +3638,7 @@ function form_process_machine_name($element, &$form_state) {
|
|||
// complete form in $form_state. By reference, because we may need to append
|
||||
// a #field_suffix that will hold the live preview.
|
||||
$key_exists = NULL;
|
||||
$source = drupal_array_get_nested_value($form_state['complete_form'], $element['#machine_name']['source'], $key_exists);
|
||||
$source = NestedArray::getValue($form_state['complete_form'], $element['#machine_name']['source'], $key_exists);
|
||||
if (!$key_exists) {
|
||||
return $element;
|
||||
}
|
||||
|
@ -3655,7 +3656,7 @@ function form_process_machine_name($element, &$form_state) {
|
|||
$source['#field_suffix'] .= ' <small id="' . $suffix_id . '"> </small>';
|
||||
|
||||
$parents = array_merge($element['#machine_name']['source'], array('#field_suffix'));
|
||||
drupal_array_set_nested_value($form_state['complete_form'], $parents, $source['#field_suffix']);
|
||||
NestedArray::setValue($form_state['complete_form'], $parents, $source['#field_suffix']);
|
||||
}
|
||||
|
||||
$js_settings = array(
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
* @{
|
||||
*/
|
||||
|
||||
use Drupal\Component\Utility\NestedArray;
|
||||
use Drupal\field\FieldUpdateForbiddenException;
|
||||
|
||||
/**
|
||||
|
@ -970,7 +971,7 @@ function hook_field_attach_validate($entity_type, $entity, &$errors) {
|
|||
function hook_field_attach_submit($entity_type, $entity, $form, &$form_state) {
|
||||
// Sample case of an 'Empty the field' checkbox added on the form, allowing
|
||||
// a given field to be emptied.
|
||||
$values = drupal_array_get_nested_value($form_state['values'], $form['#parents']);
|
||||
$values = NestedArray::getValue($form_state['values'], $form['#parents']);
|
||||
if (!empty($values['empty_field_foo'])) {
|
||||
unset($entity->field_foo);
|
||||
}
|
||||
|
|
|
@ -5,6 +5,8 @@
|
|||
* Field forms management.
|
||||
*/
|
||||
|
||||
use Drupal\Component\Utility\NestedArray;
|
||||
|
||||
/**
|
||||
* Returns HTML for an individual form element.
|
||||
*
|
||||
|
@ -124,7 +126,7 @@ function field_add_more_submit($form, &$form_state) {
|
|||
$button = $form_state['triggering_element'];
|
||||
|
||||
// Go one level up in the form, to the widgets container.
|
||||
$element = drupal_array_get_nested_value($form, array_slice($button['#array_parents'], 0, -1));
|
||||
$element = NestedArray::getValue($form, array_slice($button['#array_parents'], 0, -1));
|
||||
$field_name = $element['#field_name'];
|
||||
$langcode = $element['#language'];
|
||||
$parents = $element['#field_parents'];
|
||||
|
@ -149,7 +151,7 @@ function field_add_more_js($form, $form_state) {
|
|||
$button = $form_state['triggering_element'];
|
||||
|
||||
// Go one level up in the form, to the widgets container.
|
||||
$element = drupal_array_get_nested_value($form, array_slice($button['#array_parents'], 0, -1));
|
||||
$element = NestedArray::getValue($form, array_slice($button['#array_parents'], 0, -1));
|
||||
$field_name = $element['#field_name'];
|
||||
$langcode = $element['#language'];
|
||||
$parents = $element['#field_parents'];
|
||||
|
@ -195,7 +197,7 @@ function field_add_more_js($form, $form_state) {
|
|||
*/
|
||||
function field_form_get_state($parents, $field_name, $langcode, &$form_state) {
|
||||
$form_state_parents = _field_form_state_parents($parents, $field_name, $langcode);
|
||||
return drupal_array_get_nested_value($form_state, $form_state_parents);
|
||||
return NestedArray::getValue($form_state, $form_state_parents);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -217,7 +219,7 @@ function field_form_get_state($parents, $field_name, $langcode, &$form_state) {
|
|||
*/
|
||||
function field_form_set_state($parents, $field_name, $langcode, &$form_state, $field_state) {
|
||||
$form_state_parents = _field_form_state_parents($parents, $field_name, $langcode);
|
||||
drupal_array_set_nested_value($form_state, $form_state_parents, $field_state);
|
||||
NestedArray::setValue($form_state, $form_state_parents, $field_state);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -7,6 +7,8 @@
|
|||
* @ingroup views_module_handlers
|
||||
*/
|
||||
|
||||
use Drupal\Component\Utility\NestedArray;
|
||||
|
||||
/**
|
||||
* Implements hook_views_data().
|
||||
*
|
||||
|
@ -29,7 +31,7 @@ function field_views_data() {
|
|||
drupal_alter('field_views_data', $result, $field, $module);
|
||||
|
||||
if (is_array($result)) {
|
||||
$data = drupal_array_merge_deep($result, $data);
|
||||
$data = NestedArray::mergeDeep($result, $data);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
namespace Drupal\field\Plugin\Type\Widget;
|
||||
|
||||
use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
|
||||
use Drupal\Component\Utility\NestedArray;
|
||||
use Drupal\Core\Entity\EntityInterface;
|
||||
use Drupal\field\Plugin\PluginSettingsBase;
|
||||
use Drupal\field\FieldInstance;
|
||||
|
@ -319,7 +320,7 @@ abstract class WidgetBase extends PluginSettingsBase implements WidgetInterface
|
|||
// Extract the values from $form_state['values'].
|
||||
$path = array_merge($form['#parents'], array($field_name, $langcode));
|
||||
$key_exists = NULL;
|
||||
$values = drupal_array_get_nested_value($form_state['values'], $path, $key_exists);
|
||||
$values = NestedArray::getValue($form_state['values'], $path, $key_exists);
|
||||
|
||||
if ($key_exists) {
|
||||
// Remove the 'value' of the 'add more' button.
|
||||
|
@ -371,7 +372,7 @@ abstract class WidgetBase extends PluginSettingsBase implements WidgetInterface
|
|||
|
||||
if (!empty($field_state['errors'])) {
|
||||
// Locate the correct element in the the form.
|
||||
$element = drupal_array_get_nested_value($form_state['complete_form'], $field_state['array_parents']);
|
||||
$element = NestedArray::getValue($form_state['complete_form'], $field_state['array_parents']);
|
||||
|
||||
// Only set errors if the element is accessible.
|
||||
if (!isset($element['#access']) || $element['#access']) {
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
|
||||
namespace Drupal\field\Plugin\field\widget;
|
||||
|
||||
use Drupal\Component\Utility\NestedArray;
|
||||
use Drupal\Core\Annotation\Plugin;
|
||||
use Drupal\Core\Annotation\Translation;
|
||||
use Drupal\Core\Entity\EntityInterface;
|
||||
|
@ -73,7 +74,7 @@ class LegacyWidget extends WidgetBase {
|
|||
|
||||
if (!empty($field_state['errors'])) {
|
||||
// Locate the correct element in the form.
|
||||
$element = drupal_array_get_nested_value($form_state['complete_form'], $field_state['array_parents']);
|
||||
$element = NestedArray::getValue($form_state['complete_form'], $field_state['array_parents']);
|
||||
// Only set errors if the element is accessible.
|
||||
if (!isset($element['#access']) || $element['#access']) {
|
||||
$definition = $this->getDefinition();
|
||||
|
|
|
@ -5,6 +5,8 @@
|
|||
* Field module functionality for the File module.
|
||||
*/
|
||||
|
||||
use Drupal\Component\Utility\NestedArray;
|
||||
|
||||
/**
|
||||
* Implements hook_field_info().
|
||||
*/
|
||||
|
@ -442,7 +444,7 @@ function file_field_widget_process($element, &$form_state, $form) {
|
|||
if ($field['cardinality'] != 1) {
|
||||
$parents = array_slice($element['#array_parents'], 0, -1);
|
||||
$new_path = 'file/ajax/' . implode('/', $parents) . '/' . $form['form_build_id']['#value'];
|
||||
$field_element = drupal_array_get_nested_value($form, $parents);
|
||||
$field_element = NestedArray::getValue($form, $parents);
|
||||
$new_wrapper = $field_element['#id'] . '-ajax-wrapper';
|
||||
foreach (element_children($element) as $key) {
|
||||
if (isset($element[$key]['#ajax'])) {
|
||||
|
@ -546,17 +548,17 @@ function file_field_widget_submit($form, &$form_state) {
|
|||
// have #default_value set appropriately for the current state of the field,
|
||||
// so nothing is lost in doing this.
|
||||
$parents = array_slice($form_state['triggering_element']['#parents'], 0, -2);
|
||||
drupal_array_set_nested_value($form_state['input'], $parents, NULL);
|
||||
NestedArray::setValue($form_state['input'], $parents, NULL);
|
||||
|
||||
$button = $form_state['triggering_element'];
|
||||
|
||||
// Go one level up in the form, to the widgets container.
|
||||
$element = drupal_array_get_nested_value($form, array_slice($button['#array_parents'], 0, -1));
|
||||
$element = NestedArray::getValue($form, array_slice($button['#array_parents'], 0, -1));
|
||||
$field_name = $element['#field_name'];
|
||||
$langcode = $element['#language'];
|
||||
$parents = $element['#field_parents'];
|
||||
|
||||
$submitted_values = drupal_array_get_nested_value($form_state['values'], array_slice($button['#array_parents'], 0, -2));
|
||||
$submitted_values = NestedArray::getValue($form_state['values'], array_slice($button['#array_parents'], 0, -2));
|
||||
foreach ($submitted_values as $delta => $submitted_value) {
|
||||
if (!$submitted_value['fid']) {
|
||||
unset($submitted_values[$delta]);
|
||||
|
@ -567,7 +569,7 @@ function file_field_widget_submit($form, &$form_state) {
|
|||
$submitted_values = array_values($submitted_values);
|
||||
|
||||
// Update form_state values.
|
||||
drupal_array_set_nested_value($form_state['values'], array_slice($button['#array_parents'], 0, -2), $submitted_values);
|
||||
NestedArray::setValue($form_state['values'], array_slice($button['#array_parents'], 0, -2), $submitted_values);
|
||||
|
||||
// Update items.
|
||||
$field_state = field_form_get_state($parents, $field_name, $langcode, $form_state);
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
*/
|
||||
|
||||
use Drupal\file\Plugin\Core\Entity\File;
|
||||
use Drupal\Component\Utility\NestedArray;
|
||||
use Drupal\Core\Template\Attribute;
|
||||
use Symfony\Component\HttpFoundation\JsonResponse;
|
||||
use Drupal\file\FileUsage\DatabaseFileUsageBackend;
|
||||
|
@ -1095,7 +1096,7 @@ function file_managed_file_submit($form, &$form_state) {
|
|||
// and set $element to the managed_file element that contains that button.
|
||||
$parents = $form_state['triggering_element']['#array_parents'];
|
||||
$button_key = array_pop($parents);
|
||||
$element = drupal_array_get_nested_value($form, $parents);
|
||||
$element = NestedArray::getValue($form, $parents);
|
||||
|
||||
// No action is needed here for the upload button, because all file uploads on
|
||||
// the form are processed by file_managed_file_value() regardless of which
|
||||
|
@ -1117,7 +1118,7 @@ function file_managed_file_submit($form, &$form_state) {
|
|||
// has correct information during the rebuild.
|
||||
$values_element = $element['#extended'] ? $element['fid'] : $element;
|
||||
form_set_value($values_element, NULL, $form_state);
|
||||
drupal_array_set_nested_value($form_state['input'], $values_element['#parents'], NULL);
|
||||
NestedArray::setValue($form_state['input'], $values_element['#parents'], NULL);
|
||||
}
|
||||
|
||||
// Set the form to rebuild so that $form is correctly updated in response to
|
||||
|
|
|
@ -5,6 +5,8 @@
|
|||
* Implement an image field, based on the file module's file field.
|
||||
*/
|
||||
|
||||
use Drupal\Component\Utility\NestedArray;
|
||||
|
||||
/**
|
||||
* Implements hook_field_info().
|
||||
*/
|
||||
|
@ -384,7 +386,7 @@ function _image_field_required_fields_validate($element, &$form_state) {
|
|||
// If the image is not there, we do not check for empty values.
|
||||
$parents = $element['#parents'];
|
||||
$field = array_pop($parents);
|
||||
$image_field = drupal_array_get_nested_value($form_state['input'], $parents);
|
||||
$image_field = NestedArray::getValue($form_state['input'], $parents);
|
||||
// We check for the array key, so that it can be NULL (like if the user
|
||||
// submits the form without using the "upload" button).
|
||||
if (!array_key_exists($field, $image_field)) {
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
*/
|
||||
|
||||
use Drupal\field\FieldUpdateForbiddenException;
|
||||
use Drupal\Component\Utility\NestedArray;
|
||||
use Drupal\Core\Entity\Query\QueryFactory;
|
||||
|
||||
/**
|
||||
|
@ -215,8 +216,8 @@ function options_field_settings_form_validate_allowed_values($element, &$form_st
|
|||
* Form element #value_callback: assembles the allowed values for 'boolean' fields.
|
||||
*/
|
||||
function options_field_settings_form_value_boolean_allowed_values($element, $input, $form_state) {
|
||||
$on = drupal_array_get_nested_value($form_state['input'], $element['#on_parents']);
|
||||
$off = drupal_array_get_nested_value($form_state['input'], $element['#off_parents']);
|
||||
$on = NestedArray::getValue($form_state['input'], $element['#on_parents']);
|
||||
$off = NestedArray::getValue($form_state['input'], $element['#off_parents']);
|
||||
return array($off, $on);
|
||||
}
|
||||
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
|
||||
namespace Drupal\simpletest;
|
||||
|
||||
use Drupal\Component\Utility\NestedArray;
|
||||
use Drupal\Core\DrupalKernel;
|
||||
use Drupal\Core\Database\Database;
|
||||
use Drupal\Core\Database\ConnectionNotDefinedException;
|
||||
|
@ -1369,7 +1370,7 @@ abstract class WebTestBase extends TestBase {
|
|||
foreach ($return as $command) {
|
||||
switch ($command['command']) {
|
||||
case 'settings':
|
||||
$drupal_settings = drupal_array_merge_deep($drupal_settings, $command['settings']);
|
||||
$drupal_settings = NestedArray::mergeDeep($drupal_settings, $command['settings']);
|
||||
break;
|
||||
|
||||
case 'insert':
|
||||
|
|
|
@ -22,17 +22,6 @@ class MiscUnitTest extends UnitTestBase {
|
|||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests miscellaneous functions in bootstrap.inc.
|
||||
*/
|
||||
function testMisc() {
|
||||
// Test drupal_array_merge_deep().
|
||||
$link_options_1 = array('fragment' => 'x', 'attributes' => array('title' => 'X', 'class' => array('a', 'b')), 'language' => 'en');
|
||||
$link_options_2 = array('fragment' => 'y', 'attributes' => array('title' => 'Y', 'class' => array('c', 'd')), 'html' => TRUE);
|
||||
$expected = array('fragment' => 'y', 'attributes' => array('title' => 'Y', 'class' => array('a', 'b', 'c', 'd')), 'language' => 'en', 'html' => TRUE);
|
||||
$this->assertIdentical(drupal_array_merge_deep($link_options_1, $link_options_2), $expected, 'drupal_array_merge_deep() returned a properly merged array.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that the drupal_check_memory_limit() function works as expected.
|
||||
*/
|
||||
|
|
|
@ -7,12 +7,13 @@
|
|||
|
||||
namespace Drupal\system\Tests\Common;
|
||||
|
||||
use Drupal\Component\Utility\NestedArray;
|
||||
use Drupal\simpletest\UnitTestBase;
|
||||
|
||||
/**
|
||||
* Tests the various drupal_array_* helper functions.
|
||||
* Tests the NestedArray helper class.
|
||||
*/
|
||||
class ArrayUnitTest extends UnitTestBase {
|
||||
class NestedArrayUnitTest extends UnitTestBase {
|
||||
|
||||
/**
|
||||
* Form array to check.
|
||||
|
@ -26,8 +27,8 @@ class ArrayUnitTest extends UnitTestBase {
|
|||
|
||||
public static function getInfo() {
|
||||
return array(
|
||||
'name' => 'drupal_array_*() tests',
|
||||
'description' => 'Tests the various drupal_array_* helper functions.',
|
||||
'name' => 'NestedArray functionality',
|
||||
'description' => 'Tests the NestedArray helper class.',
|
||||
'group' => 'System',
|
||||
);
|
||||
}
|
||||
|
@ -47,42 +48,42 @@ class ArrayUnitTest extends UnitTestBase {
|
|||
/**
|
||||
* Tests getting nested array values.
|
||||
*/
|
||||
function testGet() {
|
||||
function testGetValue() {
|
||||
// Verify getting a value of a nested element.
|
||||
$value = drupal_array_get_nested_value($this->form, $this->parents);
|
||||
$value = NestedArray::getValue($this->form, $this->parents);
|
||||
$this->assertEqual($value['#value'], 'Nested element', 'Nested element value found.');
|
||||
|
||||
// Verify changing a value of a nested element by reference.
|
||||
$value = &drupal_array_get_nested_value($this->form, $this->parents);
|
||||
$value = &NestedArray::getValue($this->form, $this->parents);
|
||||
$value['#value'] = 'New value';
|
||||
$value = drupal_array_get_nested_value($this->form, $this->parents);
|
||||
$value = NestedArray::getValue($this->form, $this->parents);
|
||||
$this->assertEqual($value['#value'], 'New value', 'Nested element value was changed by reference.');
|
||||
$this->assertEqual($this->form['details']['element']['#value'], 'New value', 'Nested element value was changed by reference.');
|
||||
|
||||
// Verify that an existing key is reported back.
|
||||
$key_exists = NULL;
|
||||
drupal_array_get_nested_value($this->form, $this->parents, $key_exists);
|
||||
NestedArray::getValue($this->form, $this->parents, $key_exists);
|
||||
$this->assertIdentical($key_exists, TRUE, 'Existing key found.');
|
||||
|
||||
// Verify that a non-existing key is reported back and throws no errors.
|
||||
$key_exists = NULL;
|
||||
$parents = $this->parents;
|
||||
$parents[] = 'foo';
|
||||
drupal_array_get_nested_value($this->form, $parents, $key_exists);
|
||||
NestedArray::getValue($this->form, $parents, $key_exists);
|
||||
$this->assertIdentical($key_exists, FALSE, 'Non-existing key not found.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests setting nested array values.
|
||||
*/
|
||||
function testSet() {
|
||||
function testSetValue() {
|
||||
$new_value = array(
|
||||
'#value' => 'New value',
|
||||
'#required' => TRUE,
|
||||
);
|
||||
|
||||
// Verify setting the value of a nested element.
|
||||
drupal_array_set_nested_value($this->form, $this->parents, $new_value);
|
||||
NestedArray::setValue($this->form, $this->parents, $new_value);
|
||||
$this->assertEqual($this->form['details']['element']['#value'], 'New value', 'Changed nested element value found.');
|
||||
$this->assertIdentical($this->form['details']['element']['#required'], TRUE, 'New nested element value found.');
|
||||
}
|
||||
|
@ -90,19 +91,19 @@ class ArrayUnitTest extends UnitTestBase {
|
|||
/**
|
||||
* Tests unsetting nested array values.
|
||||
*/
|
||||
function testUnset() {
|
||||
function testUnsetValue() {
|
||||
// Verify unsetting a non-existing nested element throws no errors and the
|
||||
// non-existing key is properly reported.
|
||||
$key_existed = NULL;
|
||||
$parents = $this->parents;
|
||||
$parents[] = 'foo';
|
||||
drupal_array_unset_nested_value($this->form, $parents, $key_existed);
|
||||
NestedArray::unsetValue($this->form, $parents, $key_existed);
|
||||
$this->assertTrue(isset($this->form['details']['element']['#value']), 'Outermost nested element key still exists.');
|
||||
$this->assertIdentical($key_existed, FALSE, 'Non-existing key not found.');
|
||||
|
||||
// Verify unsetting a nested element.
|
||||
$key_existed = NULL;
|
||||
drupal_array_unset_nested_value($this->form, $this->parents, $key_existed);
|
||||
NestedArray::unsetValue($this->form, $this->parents, $key_existed);
|
||||
$this->assertFalse(isset($this->form['details']['element']), 'Removed nested element not found.');
|
||||
$this->assertIdentical($key_existed, TRUE, 'Existing key was found.');
|
||||
}
|
||||
|
@ -112,11 +113,34 @@ class ArrayUnitTest extends UnitTestBase {
|
|||
*/
|
||||
function testKeyExists() {
|
||||
// Verify that existing key is found.
|
||||
$this->assertIdentical(drupal_array_nested_key_exists($this->form, $this->parents), TRUE, 'Nested key found.');
|
||||
$this->assertIdentical(NestedArray::keyExists($this->form, $this->parents), TRUE, 'Nested key found.');
|
||||
|
||||
// Verify that non-existing keys are not found.
|
||||
$parents = $this->parents;
|
||||
$parents[] = 'foo';
|
||||
$this->assertIdentical(drupal_array_nested_key_exists($this->form, $parents), FALSE, 'Non-existing nested key not found.');
|
||||
$this->assertIdentical(NestedArray::keyExists($this->form, $parents), FALSE, 'Non-existing nested key not found.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests NestedArray::mergeDeepArray().
|
||||
*/
|
||||
function testMergeDeepArray() {
|
||||
$link_options_1 = array(
|
||||
'fragment' => 'x',
|
||||
'attributes' => array('title' => 'X', 'class' => array('a', 'b')),
|
||||
'language' => 'en',
|
||||
);
|
||||
$link_options_2 = array(
|
||||
'fragment' => 'y',
|
||||
'attributes' => array('title' => 'Y', 'class' => array('c', 'd')),
|
||||
'html' => TRUE,
|
||||
);
|
||||
$expected = array(
|
||||
'fragment' => 'y',
|
||||
'attributes' => array('title' => 'Y', 'class' => array('a', 'b', 'c', 'd')),
|
||||
'language' => 'en',
|
||||
'html' => TRUE,
|
||||
);
|
||||
$this->assertIdentical(NestedArray::mergeDeepArray(array($link_options_1, $link_options_2)), $expected, 'NestedArray::mergeDeepArray() returned a properly merged array.');
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
|
||||
namespace Drupal\views\Plugin\views\query;
|
||||
|
||||
use Drupal\Component\Utility\NestedArray;
|
||||
use Drupal\Core\Database\Database;
|
||||
use Drupal\views\Plugin\views\display\DisplayPluginBase;
|
||||
use Drupal\Core\Database\DatabaseExceptionWrapper;
|
||||
|
@ -254,7 +255,7 @@ class Sql extends QueryPluginBase {
|
|||
*/
|
||||
public function submitOptionsForm(&$form, &$form_state) {
|
||||
$element = array('#parents' => array('query', 'options', 'query_tags'));
|
||||
$value = explode(',', drupal_array_get_nested_value($form_state['values'], $element['#parents']));
|
||||
$value = explode(',', NestedArray::getValue($form_state['values'], $element['#parents']));
|
||||
$value = array_filter(array_map('trim', $value));
|
||||
form_set_value($element, $value, $form_state);
|
||||
}
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
|
||||
namespace Drupal\views\Plugin\views\wizard;
|
||||
|
||||
use Drupal\Component\Utility\NestedArray;
|
||||
use Drupal\views\Plugin\Core\Entity\View;
|
||||
use Drupal\views_ui\ViewUI;
|
||||
use Drupal\views\Plugin\views\display\DisplayPluginBase;
|
||||
|
@ -475,7 +476,7 @@ abstract class WizardPluginBase extends PluginBase implements WizardInterface {
|
|||
// do for a highly dynamic and extensible form. This method is much simpler.
|
||||
if (!empty($form_state['input'])) {
|
||||
$key_exists = NULL;
|
||||
$submitted = drupal_array_get_nested_value($form_state['input'], $parents, $key_exists);
|
||||
$submitted = NestedArray::getValue($form_state['input'], $parents, $key_exists);
|
||||
// Check that the user-submitted value is one of the allowed options before
|
||||
// returning it. This is not a substitute for actual form validation;
|
||||
// rather it is necessary because, for example, the same select element
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
* Provides the Views' administrative interface.
|
||||
*/
|
||||
|
||||
use Drupal\Component\Utility\NestedArray;
|
||||
use Drupal\Core\Database\Database;
|
||||
use Symfony\Component\HttpFoundation\JsonResponse;
|
||||
use Drupal\views_ui\ViewUI;
|
||||
|
@ -150,7 +151,7 @@ function views_ui_add_limited_validation($element, &$form_state) {
|
|||
$array_parents = $element['#array_parents'];
|
||||
array_pop($array_parents);
|
||||
$array_parents[] = $element['#views_ui_ajax_data']['trigger_key'];
|
||||
$ajax_triggering_element = drupal_array_get_nested_value($form_state['complete_form'], $array_parents);
|
||||
$ajax_triggering_element = NestedArray::getValue($form_state['complete_form'], $array_parents);
|
||||
|
||||
// Limit this button's validation to the AJAX triggering element, so it can
|
||||
// update the form for that change without requiring that the rest of the
|
||||
|
@ -188,7 +189,7 @@ function views_ui_add_ajax_wrapper($element, &$form_state) {
|
|||
// This was earlier stored in a property on the element.
|
||||
$complete_form = &$form_state['complete_form'];
|
||||
$refresh_parents = $element['#views_ui_ajax_data']['refresh_parents'];
|
||||
$refresh_element = drupal_array_get_nested_value($complete_form, $refresh_parents);
|
||||
$refresh_element = NestedArray::getValue($complete_form, $refresh_parents);
|
||||
|
||||
// The HTML ID that AJAX expects was also stored in a property on the
|
||||
// element, so use that information to insert the wrapper <div> here.
|
||||
|
@ -202,7 +203,7 @@ function views_ui_add_ajax_wrapper($element, &$form_state) {
|
|||
|
||||
// Copy the element that needs to be refreshed back into the form, with our
|
||||
// modifications to it.
|
||||
drupal_array_set_nested_value($complete_form, $refresh_parents, $refresh_element);
|
||||
NestedArray::setValue($complete_form, $refresh_parents, $refresh_element);
|
||||
}
|
||||
|
||||
return $element;
|
||||
|
@ -218,7 +219,7 @@ function views_ui_ajax_update_form($form, $form_state) {
|
|||
// The region that needs to be updated was stored in a property of the
|
||||
// triggering element by views_ui_add_ajax_trigger(), so all we have to do is
|
||||
// retrieve that here.
|
||||
return drupal_array_get_nested_value($form, $form_state['triggering_element']['#views_ui_ajax_data']['refresh_parents']);
|
||||
return NestedArray::getValue($form, $form_state['triggering_element']['#views_ui_ajax_data']['refresh_parents']);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue