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\HookHandlerCode
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;
}
}
}
}