ViewsDataHelper::fetchFields

public ViewsDataHelper::fetchFields($base, $type, $grouping = FALSE, $sub_type = NULL)

Fetches a list of all fields available for a given base type.

Parameters

(array|string) $base: A list or a single base_table, for example node.

string $type: The handler type, for example field or filter.

bool $grouping: Should the result grouping by its 'group' label.

string $sub_type: An optional sub type. E.g. Allows making an area plugin available for header only, instead of header, footer, and empty regions.

Return value

array A keyed array of in the form of 'base_table' => 'Description'.

File

core/modules/views/src/ViewsDataHelper.php, line 53

Class

ViewsDataHelper
Defines a helper class for stuff related to views data.

Namespace

Drupal\views

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
public function fetchFields($base, $type, $grouping = FALSE, $sub_type = NULL) {
  if (!$this->fields) {
    $data = $this->data->get();
    // This constructs this ginormous multi dimensional array to
    // collect the important data about fields. In the end,
    // the structure looks a bit like this (using nid as an example)
    // $strings['nid']['filter']['title'] = 'string'.
    //
    // This is constructed this way because the above referenced strings
    // can appear in different places in the actual data structure so that
    // the data doesn't have to be repeated a lot. This essentially lets
    // each field have a cheap kind of inheritance.
 
    foreach ($data as $table => $table_data) {
      $bases = array();
      $strings = array();
      $skip_bases = array();
      foreach ($table_data as $field => $info) {
        // Collect table data from this table
        if ($field == 'table') {
          // calculate what tables this table can join to.
          if (!empty($info['join'])) {
            $bases = array_keys($info['join']);
          }
          // And it obviously joins to itself.
          $bases[] = $table;
          continue;
        }
        foreach (array('field', 'sort', 'filter', 'argument', 'relationship', 'area') as $key) {
          if (!empty($info[$key])) {
            if ($grouping && !empty($info[$key]['no group by'])) {
              continue;
            }
            if ($sub_type && isset($info[$key]['sub_type']) && (!in_array($sub_type, (array) $info[$key]['sub_type']))) {
              continue;
            }
            if (!empty($info[$key]['skip base'])) {
              foreach ((array) $info[$key]['skip base'] as $base_name) {
                $skip_bases[$field][$key][$base_name] = TRUE;
              }
            }
            elseif (!empty($info['skip base'])) {
              foreach ((array) $info['skip base'] as $base_name) {
                $skip_bases[$field][$key][$base_name] = TRUE;
              }
            }
            foreach (array('title', 'group', 'help', 'base', 'aliases') as $string) {
              // First, try the lowest possible level
              if (!empty($info[$key][$string])) {
                $strings[$field][$key][$string] = $info[$key][$string];
              }
              // Then try the field level
              elseif (!empty($info[$string])) {
                $strings[$field][$key][$string] = $info[$string];
              }
              // Finally, try the table level
              elseif (!empty($table_data['table'][$string])) {
                $strings[$field][$key][$string] = $table_data['table'][$string];
              }
              // We don't have any help provided for this field. If a better
              // description should be used for the Views UI you use
              // hook_views_data_alter() in module.views.inc or implement a
              // custom entity views_data handler.
              // @see hook_views_data_alter()
              // @see \Drupal\node\NodeViewsData
              elseif ($string == 'help') {
                $strings[$field][$key][$string] = '';
              }
              else {
                if ($string != 'base') {
                  $strings[$field][$key][$string] = SafeMarkup::format("Error: missing @component", array('@component' => $string));
                }
              }
            }
          }
        }
      }
      foreach ($bases as $base_name) {
        foreach ($strings as $field => $field_strings) {
          foreach ($field_strings as $type_name => $type_strings) {
            if (empty($skip_bases[$field][$type_name][$base_name])) {
              $this->fields[$base_name][$type_name]["$table.$field"] = $type_strings;
            }
          }
        }
      }
    }
  }
 
  // If we have an array of base tables available, go through them
  // all and add them together. Duplicate keys will be lost and that's
  // Just Fine.
  if (is_array($base)) {
    $strings = array();
    foreach ($base as $base_table) {
      if (isset($this->fields[$base_table][$type])) {
        $strings += $this->fields[$base_table][$type];
      }
    }
    uasort($strings, array('self', 'fetchedFieldSort'));
    return $strings;
  }
 
  if (isset($this->fields[$base][$type])) {
    uasort($this->fields[$base][$type], array($this, 'fetchedFieldSort'));
    return $this->fields[$base][$type];
  }
  return array();
}
doc_Drupal
2025-01-10 15:47:30
Comments
Leave a Comment

Please login to continue.