You are here

public function ViewsPreRenderHookHandler::process in Views Merge Rows 8.2

Alter the view according to merge rows configuration.

Parameters

\Drupal\views\ViewExecutable $view: The view to alter.

File

src/HookHandler/ViewsPreRenderHookHandler.php, line 65

Class

ViewsPreRenderHookHandler
Hook handler for the hook_views_pre_render() hook.

Namespace

Drupal\views_merge_rows\HookHandler

Code

public function process(ViewExecutable $view) : void {
  $extenders = $view
    ->getDisplay()
    ->getExtenders();
  if (!isset($extenders['views_merge_rows'])) {

    // If the ID of the plugin is not in the list then do nothing.
    return;
  }

  /** @var \Drupal\views_merge_rows\Plugin\views\display_extender\ViewsMergeRowsDisplayExtenderPlugin $extender */
  $extender = $extenders['views_merge_rows'];
  $options = $extender
    ->getOptions();
  if (!$options['merge_rows']) {

    // If merge rows is not enabled on this view then do nothing.
    return;
  }
  if ($view
    ->getItemsPerPage() > 0) {
    $view
      ->setItemsPerPage(0);
  }
  $view->style_plugin
    ->renderFields($view->result);
  $rendered_fields = $view->style_plugin
    ->getRenderedFields();
  $filters = [];
  $merged_rows = [];

  // Necessary for 'count_minus_count_unique'. Not used anywhere else.
  $merged_rows_copy = [];
  $first = TRUE;
  foreach ((array) $rendered_fields as $row_index => $rendered_row) {
    $filter_value = '';
    foreach ($options['field_config'] as $field_name => $field_config) {
      if ($field_config['merge_option'] == 'filter') {
        $filter_value .= $rendered_row[$field_name];
      }
    }
    $is_filter_row = [];
    $merged_row_replaced = FALSE;
    if (!array_key_exists($filter_value, $filters)) {
      $filters[$filter_value] = $row_index;
      $merged_row = [];
      $merged_row_copy = [];
      $is_filter_row[$row_index] = TRUE;
      $merged_row_index = $row_index;
    }
    else {
      $merged_row_index = $filters[$filter_value];
      $merged_row = $merged_rows[$merged_row_index];
      if (isset($merged_rows_copy[$merged_row_index])) {
        $merged_row_copy = $merged_rows_copy[$merged_row_index];
      }
      $is_filter_row[$row_index] = FALSE;
    }
    foreach ($options['field_config'] as $field_name => $field_config) {
      switch ($field_config['merge_option']) {
        case 'count_unique':
          $this
            ->preRenderCountUnique($view, $merged_rows, $merged_row, $is_filter_row[$row_index], $rendered_row, $row_index, $field_name, $merged_row_index);
          break;
        case 'count':
          $this
            ->preRenderCount($view, $merged_rows, $merged_row, $is_filter_row[$row_index], $row_index, $field_name, $merged_row_index);
          break;
        case 'count_minus_count_unique':
          if ($first) {
            $merged_row_copy = $merged_row;
            $first = FALSE;
          }
          $this
            ->preRenderCountMinusCountUnique($view, $merged_rows, $merged_rows_copy, $merged_row, $merged_row_copy, $is_filter_row[$row_index], $rendered_row, $row_index, $field_name, $merged_row_index);
          break;
        case 'merge_unique':
          $this
            ->preRenderMergeUnique($view, $merged_rows, $merged_row, $is_filter_row[$row_index], $rendered_row, $row_index, $field_name, $merged_row_index);
          break;
        case 'merge':
          $this
            ->preRenderMerge($view, $merged_rows, $merged_row, $is_filter_row[$row_index], $rendered_row, $row_index, $field_name, $merged_row_index);
          break;
        case 'sum':
          $this
            ->preRenderSum($view, $merged_rows, $merged_row, $is_filter_row[$row_index], $rendered_row, $row_index, $field_name, $merged_row_index);
          break;
        case 'average':
          $this
            ->preRenderAverage($view, $merged_rows, $merged_row, $is_filter_row[$row_index], $rendered_row, $row_index, $field_name, $merged_row_index);
          break;
        case 'std_deviation':
          $this
            ->preRenderStandardDeviation($view, $merged_rows, $merged_row, $is_filter_row[$row_index], $rendered_row, $row_index, $field_name, $merged_row_index);
          break;
        case 'filter':
          $this
            ->preRenderFilter($view, $merged_rows, $merged_row, $is_filter_row[$row_index], $rendered_row, $row_index, $field_name, $merged_row_index);
          break;
        case 'first_value':
          $this
            ->preRenderFirstValue($view, $merged_rows, $merged_row, $is_filter_row[$row_index], $rendered_row, $row_index, $field_name, $merged_row_index);
          break;
        case 'highest_value':
          $this
            ->preRenderHighestValue($view, $merged_rows, $merged_row, $merged_row_replaced, $is_filter_row[$row_index], $rendered_row, $row_index, $field_name, $merged_row_index);
          break;
        case 'lowest_value':
          $this
            ->preRenderLowestValue($view, $merged_rows, $merged_row, $merged_row_replaced, $is_filter_row[$row_index], $rendered_row, $row_index, $field_name, $merged_row_index);
          break;
      }
    }
  }

  // Store the merged rows back to the view's style plugin.
  foreach ($merged_rows as $row_index => $merged_row) {
    foreach ($options['field_config'] as $field_name => $field_config) {
      switch ($field_config['merge_option']) {
        case 'count_unique':
          $view->style_plugin
            ->setRenderedField(count($merged_row[$field_name]), $row_index, $field_name);
          break;
        case 'count_minus_count_unique':
          $view->style_plugin
            ->setRenderedField(intval($merged_rows_copy[$row_index][$field_name]) - count($merged_row[$field_name]), $row_index, $field_name);
          break;
        case 'merge_unique':
        case 'merge':

          // Difference of behavior between 'merge' and 'merge_unique' is done
          // in the preRender methods.
          $this
            ->renderMerge($view, $merged_row, $row_index, $field_name, $field_config);
          break;
        case 'sum':
          $this
            ->renderSum($view, $merged_row, $row_index, $field_name);
          break;
        case 'average':
          $this
            ->renderAverage($view, $merged_row, $row_index, $field_name);
          break;
        case 'std_deviation':
          $this
            ->renderStandardDeviation($view, $merged_row, $row_index, $field_name);
          break;
        case 'count':
        case 'filter':
        case 'first_value':
        case 'highest_value':
        case 'lowest_value':
          $view->style_plugin
            ->setRenderedField($merged_row[$field_name], $row_index, $field_name);
          break;
      }
    }
  }
}