protected function ViewsConfigUpdater::processMultivalueBaseFieldHandler in Drupal 8
Same name and namespace in other branches
- 9 core/modules/views/src/ViewsConfigUpdater.php \Drupal\views\ViewsConfigUpdater::processMultivalueBaseFieldHandler()
Processes handlers affected by the multivalue base field update.
Parameters
array $handler: A display handler.
string $handler_type: The handler type.
string $key: The handler key.
string $display_id: The handler display ID.
\Drupal\views\ViewEntityInterface $view: The view being updated.
Return value
bool Whether the handler was updated.
2 calls to ViewsConfigUpdater::processMultivalueBaseFieldHandler()
- ViewsConfigUpdater::needsMultivalueBaseFieldUpdate in core/
modules/ views/ src/ ViewsConfigUpdater.php - Update field names for multi-value base fields.
- ViewsConfigUpdater::updateAll in core/
modules/ views/ src/ ViewsConfigUpdater.php - Performs all required updates.
File
- core/
modules/ views/ src/ ViewsConfigUpdater.php, line 338
Class
- ViewsConfigUpdater
- Provides a BC layer for modules providing old configurations.
Namespace
Drupal\viewsCode
protected function processMultivalueBaseFieldHandler(array &$handler, $handler_type, $key, $display_id, ViewEntityInterface $view) {
$changed = FALSE;
// If there are no multivalue base fields we have nothing to do.
$table_info = $this
->getMultivalueBaseFieldUpdateTableInfo();
if (!$table_info) {
return $changed;
}
// Only if the wrong field name is set do we process the field. It
// could already be using the correct field. Like "user__roles" vs
// "roles_target_id".
if (isset($handler['table']) && isset($table_info[$handler['table']]) && isset($table_info[$handler['table']][$handler['field']])) {
$changed = TRUE;
$original_field_name = $handler['field'];
$handler['field'] = $table_info[$handler['table']][$original_field_name];
$handler['plugin_id'] = $this->viewsData
->get($handler['table'])[$table_info[$handler['table']][$original_field_name]][$handler_type]['id'];
// Retrieve type data information about the handler to clean it up
// reliably. We need to manually create a typed view rather than
// instantiating the current one, as the schema will be affected by the
// updated values.
$id = 'views.view.' . $view
->id();
$path_to_handler = "display.{$display_id}.display_options.{$handler_type}s.{$key}";
$view_config = $view
->toArray();
$keys = explode('.', $path_to_handler);
NestedArray::setValue($view_config, $keys, $handler);
/** @var \Drupal\Core\Config\Schema\TypedConfigInterface $typed_view */
$typed_view = $this->typedConfigManager
->createFromNameAndData($id, $view_config);
/** @var \Drupal\Core\Config\Schema\ArrayElement $typed_handler */
$typed_handler = $typed_view
->get($path_to_handler);
// Filter values we want to convert from a string to an array.
if ($handler_type === 'filter' && $typed_handler
->get('value') instanceof ArrayElement && is_string($handler['value'])) {
// An empty string cast to an array is an array with one element.
if ($handler['value'] === '') {
$handler['value'] = [];
}
else {
$handler['value'] = (array) $handler['value'];
}
$handler['operator'] = $this
->mapOperatorFromSingleToMultiple($handler['operator']);
}
// For all the other fields we try to determine the fields using config
// schema and remove everything not being defined in the new handler.
foreach (array_keys($handler) as $handler_key) {
if (!isset($typed_handler
->getDataDefinition()['mapping'][$handler_key])) {
unset($handler[$handler_key]);
}
}
}
return $changed;
}