Projet

Général

Profil

Paste
Télécharger (8,88 ko) Statistiques
| Branche: | Révision:

root / drupal7 / sites / all / modules / flag / includes / views / flag.views.inc @ 651307cd

1
<?php
2

    
3
/**
4
 * @file
5
 * Provides support for the Views module.
6
 */
7

    
8
/**
9
 * Implements hook_views_plugins().
10
 */
11
function flag_views_plugins() {
12
  return array(
13
    'argument validator' => array(
14
      'flag_flaggable_node' => array(
15
        'title' => t('Flaggable node'),
16
        'flag type' => 'node',
17
        'handler' => 'flag_plugin_argument_validate_flaggability',
18
        'path' => drupal_get_path('module', 'flag') . '/includes',
19
      ),
20
      'flag_flaggable_user' => array(
21
        'title' => t('Flaggable user'),
22
        'flag type' => 'user',
23
        'handler' => 'flag_plugin_argument_validate_flaggability',
24
        'path' => drupal_get_path('module', 'flag') . '/includes',
25
      ),
26
      // A comment validator won't be very useful. Moreover, having it will
27
      // contribute to the argument object's $options polution, so let's skip
28
      // it.
29
    ),
30
  );
31
}
32
/**
33
 * Implements hook_views_data().
34
 */
35
function flag_views_data() {
36
  $data = array();
37

    
38
  $data['flagging']['table']['group'] = t('Flags');
39
  $data['flag_counts']['table']['group'] = t('Flags');
40

    
41
  // Notify views from flag 2.x of our changes to views data.
42
  // @see flag_update_7301().
43
  $data['flag_content']['moved to'] = 'flagging';
44
  // @see flag_update_7303().
45
  $data['flag_content']['content_id']['moved to'] = array('flagging', 'entity_id');
46

    
47
  $data['flagging']['uid'] = array(
48
    'title' => t('User uid'),
49
    'help' => t('The user that flagged an item. If you need more fields than the uid add the "Flags: User" relationship.'),
50
    'relationship' => array(
51
      'base' => 'users',
52
      'title' => t('User'),
53
      'help' => t('Relate an item to the user that flagged it.'),
54
      'handler' => 'views_handler_relationship',
55
      'label' => t('Flag user'),
56
    ),
57
    'filter' => array(
58
      'handler' => 'views_handler_filter_user_name',
59
    ),
60
    'argument' => array(
61
      'handler' => 'views_handler_argument_numeric',
62
    ),
63
    'field' => array(
64
      'handler' => 'views_handler_field_user',
65
    ),
66
  );
67

    
68
  $data['flagging']['timestamp'] = array(
69
    'title' => t('Flagged time'),
70
    'help' => t('Display the time the content was flagged by a user.'),
71
    'field' => array(
72
      'handler' => 'views_handler_field_date',
73
      'click sortable' => TRUE,
74
    ),
75
    'sort' => array(
76
      'handler' => 'views_handler_sort_date',
77
    ),
78
    'filter' => array(
79
      'handler' => 'views_handler_filter_date',
80
    ),
81
    'argument' => array(
82
      'handler' => 'views_handler_argument_date',
83
    ),
84
  );
85

    
86
  // Argument for content ID, used for "Who's flagged this" views.
87
  $data['flagging']['entity_id'] = array(
88
    'title' => t('Entity ID'),
89
    'help' => t('The unique ID of the object that has been flagged.'),
90
    'argument' => array(
91
      'handler' => 'flag_handler_argument_entity_id',
92
    ),
93
  );
94

    
95
  // Specialized is null/is not null filter.
96
  $data['flagging']['flagged'] = array(
97
    'title' => t('Flagged'),
98
    'real field' => 'uid',
99
    'field' => array(
100
      'handler' => 'flag_handler_field_flagged',
101
      'label' => t('Flagged'),
102
      'help' => t('A boolean field to show whether the flag is set or not.'),
103
    ),
104
    'filter' => array(
105
      'handler' => 'flag_handler_filter_flagged',
106
      'label' => t('Flagged'),
107
      'help' => t('Filter to ensure content has or has not been flagged.'),
108
    ),
109
    'sort' => array(
110
      'handler' => 'flag_handler_sort_flagged',
111
      'label' => t('Flagged'),
112
      'help' => t('Sort by whether entities have or have not been flagged.'),
113
    ),
114
  );
115

    
116
  // Flag content links.
117
  $data['flagging']['ops'] = array(
118
    'title' => t('Flag link'),
119
    'help' => t('Display flag/unflag link.'),
120
    'field' => array(
121
      'handler' => 'flag_handler_field_ops',
122
    ),
123
  );
124

    
125
  $data['flagging']['sid'] = array(
126
    'title' => t('Flagging session ID'),
127
    'help' => t('The session ID of the flagging.'),
128
    'field' => array(
129
      'handler' => 'views_handler_field_numeric',
130
      'click sortable' => TRUE,
131
    ),
132
    'sort' => array(
133
      'handler' => 'views_handler_sort',
134
    ),
135
    'filter' => array(
136
      'handler' => 'views_handler_filter_numeric',
137
    ),
138
    'argument' => array(
139
      'handler' => 'views_handler_argument_numeric',
140
    ),
141
  );
142

    
143
  $data['flagging']['flagging_id'] = array(
144
    'title' => t('Flagging ID'),
145
    'field' => array(
146
      'handler' => 'views_handler_field_numeric',
147
      'click sortable' => TRUE,
148
      'help' => t('Display the flagging ID.'),
149
    ),
150
    'sort' => array(
151
      'handler' => 'views_handler_sort',
152
      'help' => t('Sort by the flagging ID.'),
153
    ),
154
    'filter' => array(
155
      'handler' => 'views_handler_filter_numeric',
156
      'help' => t('Filter by the flagging ID.'),
157
    ),
158
    'argument' => array(
159
      'handler' => 'views_handler_argument_numeric',
160
      'help' => t('The unique ID of the flagging.'),
161
    ),
162
  );
163

    
164
  $data['flag_counts']['count'] = array(
165
    'title' => t('Flag counter'),
166
    'help' => t('The number of times a piece of content is flagged by any user.'),
167
    'field' => array(
168
      'handler' => 'views_handler_field_numeric',
169
      'click sortable' => TRUE,
170
    ),
171
    'sort' => array(
172
      'handler' => 'views_handler_sort',
173
    ),
174
    'filter' => array(
175
      'handler' => 'views_handler_filter_numeric',
176
    ),
177
    'argument' => array(
178
      'handler' => 'views_handler_argument_numeric',
179
    ),
180
  );
181

    
182
  $data['flag_counts']['last_updated'] = array(
183
    'title' => t('Time last flagged'),
184
    'help' => t('The time a piece of content was most recently flagged by any user.'),
185
    'field' => array(
186
      'handler' => 'views_handler_field_date',
187
      'click sortable' => TRUE,
188
    ),
189
    'sort' => array(
190
      'handler' => 'views_handler_sort_date',
191
    ),
192
    'filter' => array(
193
      'handler' => 'views_handler_filter_date',
194
    ),
195
    'argument' => array(
196
      'handler' => 'views_handler_argument_date',
197
    ),
198
  );
199

    
200
  return $data;
201
}
202

    
203
/**
204
 * Implements hook_views_data_alter().
205
 */
206
function flag_views_data_alter(&$data) {
207

    
208
  foreach (array_keys(flag_fetch_definition()) as $flag_type) {
209
    $flag = flag_flag::factory_by_entity_type($flag_type);
210
    $info = $flag->get_views_info();
211

    
212
    if (!isset($info)) {
213
      continue;
214
    }
215

    
216
    if (!empty($info['join field'])) {
217
      // Add the flag relationship.
218
      $data[$info['views table']]['flag_content_rel'] = array(
219
        'group' => t('Flags'),
220
        'title' => $info['title'],
221
        'help' => $info['help'],
222
        'relationship' => array(
223
          'flag type' => $flag_type,
224
          'handler' => 'flag_handler_relationship_content',
225
          'label' => t('flag'),
226
          'base' => 'flagging',
227
          'base field' => 'entity_id',
228
          'relationship field' => $info['join field'],
229
        ),
230
      );
231

    
232
      // Add the flag counter relationship.
233
      $data[$info['views table']]['flag_count_rel'] = array(
234
        'group' => t('Flags'),
235
        'title' => $info['counter title'],
236
        'help' => $info['counter help'],
237
        'relationship' => array(
238
          'flag type' => $flag_type,
239
          'handler' => 'flag_handler_relationship_counts',
240
          'label' => t('counter'),
241
          'base' => 'flag_counts',
242
          'base field' => 'entity_id',
243
          'relationship field' => $info['join field'],
244
        ),
245
      );
246
    }
247
  }
248

    
249
  // Add a relationship for the user that flagged any type of content.
250
  $data['users']['flag_user_content_rel'] = array(
251
    'group' => t('Flags'),
252
    'title' => t("User's flaggings"),
253
    'help' => t('Relate users to the flaggings they have made on objects, using a particular flag.'),
254
    'relationship' => array(
255
      'base' => 'flagging',
256
      'base field' => 'uid',
257
      'relationship field' => 'uid',
258
      'handler' => 'flag_handler_relationship_user_content',
259
      'label' => t('user flagged content'),
260
    ),
261
  );
262
}
263

    
264
/**
265
 * Implements hook_views_query_substitutions().
266
 *
267
 * Allow replacement of current user's session id so we can cache these queries.
268
 */
269
function flag_views_query_substitutions() {
270
  return array(
271
    '***FLAG_CURRENT_USER_SID***' => flag_get_sid(),
272
  );
273
}
274
/**
275
 * A helper function that creates a radio list of available flags.
276
 *
277
 * This function is used to select the desired flag when setting up flag
278
 * relationships and fields.
279
 */
280
function flag_views_flag_config_form($form_type, $entity_type, $current_flag) {
281
  $flags = flag_get_flags($entity_type);
282

    
283
  $options = array();
284
  foreach ($flags as $flag) {
285
    $options[$flag->name] = $flag->get_title();
286
  }
287

    
288
  $form = array(
289
    '#type' => $form_type,
290
    '#title' => t('Flag'),
291
    '#options' => $options,
292
    '#default_value' => $current_flag,
293
    '#required' => TRUE,
294
  );
295

    
296
  return $form;
297
}
298

    
299
/**
300
 * Helper function that gets the first defined flag and returns its name.
301
 */
302
function flag_views_flag_default($entity_type) {
303
  $default_flag = &drupal_static(__FUNCTION__, array());
304

    
305
  if (!array_key_exists($entity_type, $default_flag)) {
306
    $flags = flag_get_flags($entity_type);
307
    $flag = array_shift($flags);
308
    $default_flag[$entity_type] = $flag ? $flag->name : NULL;
309
  }
310

    
311
  return $default_flag[$entity_type];
312
}