3
0
Fork 0
mirror of https://github.com/farmOS/farmOS.git synced 2024-02-23 11:37:38 +01:00
farmOS/modules/ui/map/farm_ui_map.module

151 lines
4.5 KiB
PHP

<?php
/**
* @file
* The farmOS UI Map module.
*/
use Drupal\views\Entity\View;
use Drupal\views\ViewExecutable;
/**
* Implements hook_farm_dashboard_panes().
*/
function farm_ui_map_farm_dashboard_panes() {
return [
'dashboard_map' => [
'block' => 'dashboard_map',
],
];
}
/**
* Implements hook_views_pre_view().
*/
function farm_ui_map_views_pre_view(ViewExecutable $view, $display_id, array &$args) {
// Alter the farm_asset_geojson View's full and centroid displays to add all
// exposed filters that are present in the farm_asset View.
if ($view->id() == 'farm_asset_geojson' && in_array($display_id, ['full', 'centroid'])) {
// Load the farm_asset View. Bail if unavailable.
$farm_asset_view = View::load('farm_asset');
if (empty($farm_asset_view)) {
return;
}
// Copy all exposed filters from the default display.
$display = $farm_asset_view->getDisplay('default');
if (!empty($display['display_options']['filters'])) {
foreach ($display['display_options']['filters'] as $field => $filter) {
$view->addHandler($display_id, 'filter', $filter['table'], $field, $filter, $filter['id']);
}
}
}
}
/**
* Implements hook_views_pre_render().
*/
function farm_ui_map_views_pre_render(ViewExecutable $view) {
// Render a map attachment above views of assets.
if ($view->id() == 'farm_asset' && in_array($view->current_display, ['page', 'page_type'])) {
// Get all asset bundles.
$asset_bundles = \Drupal::service('entity_type.bundle.info')->getBundleInfo($view->getBaseEntityType()->id());
// Start array of filtered bundles.
$filtered_bundles = $asset_bundles;
// Start array of asset layers to add.
$asset_layers = [
'full' => [],
'cluster' => [],
];
// Save the translated cluster string.
$cluster_string = ' (' . t('clusters') . ')';
// Save the group labels.
$layer_group = $view->getBaseEntityType()->getCollectionLabel();
$cluster_group = $layer_group . $cluster_string;
// Add multiple asset layers to the page of all assets.
if ($view->current_display == 'page') {
// Limit to filtered asset types.
if (!empty($exposed_filters['type'])) {
$filtered_bundles = array_intersect_key($asset_bundles, array_flip($exposed_filters['type']));
}
}
// Get exposed filters.
$exposed_filters = $view->getExposedInput();
// Determine if we are filtering by bundle.
// This may happen via contextual filter on the "page_type" display, or via
// the exposed "type" filter.
$bundle_filters = [];
if ($view->current_display == 'page_type' && !empty($view->args[0])) {
$bundle_filters[] = $view->args[0];
}
elseif (!empty($exposed_filters['type'])) {
foreach ($exposed_filters['type'] as $bundle) {
$bundle_filter[] = $bundle;
}
}
// Filter by bundle, if desired.
if (!empty($bundle_filters)) {
$filtered_bundles = [];
foreach ($bundle_filters as $bundle) {
$filtered_bundles[$bundle] = $asset_bundles[$bundle];
}
}
// If we are filtering by bundle, don't use a separate group for cluster
// layers.
if (!empty($bundle_filters)) {
$cluster_group = $layer_group;
}
// Add an asset type map layer for each filtered bundle.
foreach ($filtered_bundles as $bundle => $bundle_info) {
// Add a cluster layer for all asset types.
$asset_layers['cluster']['cluster_' . $bundle] = [
'group' => $cluster_group,
'label' => $bundle_info['label'] . $cluster_string,
'cluster' => TRUE,
'asset_type' => $bundle,
'filters' => $exposed_filters,
// @todo Color each asset type cluster differently.
];
// Add full geometry layers for the other asset types.
$asset_layers['full']['full_' . $bundle] = [
'group' => $layer_group,
'label' => $bundle_info['label'],
'asset_type' => $bundle,
'filters' => $exposed_filters,
// @todo Color each asset type differently.
// This was previously provided with hook_farm_area_type_info.
'color' => 'orange',
'zoom' => TRUE,
];
}
// Build the map render array.
$map = [
'#type' => 'farm_map',
'#map_type' => 'asset_list',
];
$all_layers = array_merge($asset_layers['cluster'], $asset_layers['full']);
$map['#map_settings']['asset_type_layers'] = $all_layers;
// Render the map.
$view->attachment_before['asset_map'] = $map;
}
}