You are here

public function ViewsHandlerManager::getHandler in Drupal 8

Same name and namespace in other branches
  1. 9 core/modules/views/src/Plugin/ViewsHandlerManager.php \Drupal\views\Plugin\ViewsHandlerManager::getHandler()
  2. 10 core/modules/views/src/Plugin/ViewsHandlerManager.php \Drupal\views\Plugin\ViewsHandlerManager::getHandler()

Fetches a handler from the data cache.

Parameters

array $item: An associative array representing the handler to be retrieved:

  • table: The name of the table containing the handler.
  • field: The name of the field the handler represents.

string|null $override: (optional) Override the actual handler object with this plugin ID. Used for aggregation when the handler is redirected to the aggregation handler.

Return value

\Drupal\views\Plugin\views\ViewsHandlerInterface An instance of a handler object. May be a broken handler instance.

File

core/modules/views/src/Plugin/ViewsHandlerManager.php, line 81

Class

ViewsHandlerManager
Plugin type manager for all views handlers.

Namespace

Drupal\views\Plugin

Code

public function getHandler($item, $override = NULL) {
  $table = $item['table'];
  $field = $item['field'];

  // Get the plugin manager for this type.
  $data = $table ? $this->viewsData
    ->get($table) : $this->viewsData
    ->getAll();
  if (isset($data[$field][$this->handlerType])) {
    $definition = $data[$field][$this->handlerType];
    foreach ([
      'group',
      'title',
      'title short',
      'label',
      'help',
      'real field',
      'real table',
      'entity type',
      'entity field',
    ] as $key) {
      if (!isset($definition[$key])) {

        // First check the field level.
        if (!empty($data[$field][$key])) {
          $definition[$key] = $data[$field][$key];
        }
        elseif (!empty($data['table'][$key])) {
          $definition_key = $key === 'entity type' ? 'entity_type' : $key;
          $definition[$definition_key] = $data['table'][$key];
        }
      }
    }

    // @todo This is crazy. Find a way to remove the override functionality.
    $plugin_id = $override ?: $definition['id'];

    // Try to use the overridden handler.
    $handler = $this
      ->createInstance($plugin_id, $definition);
    if ($override && method_exists($handler, 'broken') && $handler
      ->broken()) {
      $handler = $this
        ->createInstance($definition['id'], $definition);
    }
    return $handler;
  }

  // Finally, use the 'broken' handler.
  return $this
    ->createInstance('broken', [
    'original_configuration' => $item,
  ]);
}