You are here

function farm_group_views_pre_view in farmOS 2.x

Implements hook_views_pre_view().

File

modules/asset/group/farm_group.views_execution.inc, line 13
Provides Views runtime hooks for farm_group.module.

Code

function farm_group_views_pre_view(ViewExecutable $view, $display_id, array &$args) {

  // Alter the farm_asset View.
  if ($view
    ->id() == 'farm_asset') {

    // Add the computed "Group" field before the "Location" field.
    $field_options = [
      'type' => 'entity_reference_label',
      'label' => t('Group'),
      'settings' => [
        'link' => TRUE,
      ],
    ];
    $field_id = $view
      ->addHandler($display_id, 'field', 'asset', 'group', $field_options);
    farm_ui_views_sort_field($view, $display_id, $field_id, 'location', TRUE);
  }

  // Alter the farm_log View.
  if ($view
    ->id() == 'farm_log') {

    // Do not alter the upcoming/late block displays.
    if (in_array($display_id, [
      'block_upcoming',
      'block_late',
    ])) {
      return;
    }

    // Make sure the is_group_assignment field exists.

    /** @var \Drupal\Core\Field\BaseFieldDefinition[] $definitions */
    $definitions = \Drupal::service('entity_field.manager')
      ->getBaseFieldDefinitions('log');
    if (isset($definitions['is_group_assignment'])) {

      // Get field name and table name.
      $definition = $definitions['is_group_assignment'];
      $field_name = $definition
        ->getName();

      /** @var \Drupal\Core\Entity\Sql\DefaultTableMapping $table_mapping */
      $table_mapping = \Drupal::entityTypeManager()
        ->getStorage('log')
        ->getTableMapping();
      $table = $table_mapping
        ->getFieldTableName($definition
        ->getName());

      // Define filter options.
      $opts = [
        'operator' => '=',
        'value' => 'All',
        'exposed' => TRUE,
        'expose' => [
          'label' => t('Is group assignment'),
          'identifier' => 'is_group_assignment',
        ],
      ];

      // Add the filter.
      $filter_id = $view
        ->addHandler($view->current_display, 'filter', $table, $field_name, $opts);

      // Move the is_group_assignment filter to render before the status filter.
      $filters = $view
        ->getDisplay()
        ->getOption('filters');
      if ($index = array_search('status', array_keys($filters))) {
        $filter = $filters[$filter_id];
        unset($filters[$filter_id]);

        // Use array_merge + array_splice instead of array_splice so we can
        // preserve the array keys.
        $filters = array_merge(array_slice($filters, 0, $index), [
          $filter_id => $filter,
        ], array_slice($filters, $index));
      }

      // Set the new sorted filters array.
      $view
        ->getDisplay()
        ->setOption('filters', $filters);
    }
  }
}