/[drupal]/contributions/modules/fooaggregator/fooaggregator_views.inc
ViewVC logotype

Contents of /contributions/modules/fooaggregator/fooaggregator_views.inc

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.4 - (show annotations) (download) (as text)
Sat Jul 21 13:20:45 2007 UTC (2 years, 4 months ago) by alaa
Branch: MAIN
CVS Tags: HEAD
Branch point for: DRUPAL-5
Changes since 1.3: +32 -1 lines
File MIME type: text/x-php
date of latest feed item field
1 <?php // -*-php-*-
2 /* $Id: fooaggregator_views.inc,v 1.3 2007/07/20 17:11:39 alaa Exp $ */
3
4 /**
5 * Implementation of hook_views_style_plugins()
6 */
7 function fooaggregator_views_style_plugins() {
8 return array(
9 'fooaggregator' => array(
10 'name' => t('Fooaggregator Admin'),
11 'theme' => 'fooaggregator_views_view',
12 'needs_fields' => true,
13 'needs_table_header' => true,
14 'validate' => 'fooaggregator_views_validate',
15 'weight' => 100,
16 ),
17 );
18 }
19
20 /**
21 * Implementation of hook_views_tables()
22 */
23 function fooaggregator_views_tables() {
24 $tables['fooaggregator_feed'] = _fooaggregator_feed_views_tables();
25 $tables['fooaggregator_item'] = _fooaggregator_item_views_tables();
26 $tables['fooaggregator_count'] = _fooaggregator_count_views_tables();
27 $tables['fooaggregator_latest'] = _fooaggregator_latest_views_tables();
28
29 return $tables;
30 }
31
32
33 /**
34 * Implementation of hook_views_arguments()
35 */
36 function fooaggregator_views_arguments() {
37 $ret = array(
38 'fid' => array(
39 'name' => t('Feed: Feed ID'),
40 'handler' => 'fooaggregator_views_handler_argument_fid',
41 'option' => array(
42 '#type' => 'select',
43 '#options' => array(
44 'equal',
45 'not equal',
46 ),
47 ),
48 ),
49 );
50
51 return $ret;
52 }
53
54 /**
55 * Implementation of hook_views_default_views()
56 */
57 function fooaggregator_views_default_views() {
58 // Admin view
59 $view = new stdClass();
60 $view->name = 'fooaggregator_admin';
61 $view->description = t('This is the fooaggregator administration page.');
62 $view->access = array();
63 $view->view_args_php = '';
64 $view->page = TRUE;
65 $view->page_title = 'News aggregator';
66 $view->page_header = '';
67 $view->page_header_format = '1';
68 $view->page_footer = '';
69 $view->page_footer_format = '1';
70 $view->page_empty = '';
71 $view->page_empty_format = '1';
72 $view->page_type = 'fooaggregator';
73 $view->url = 'admin/content/fooaggregator';
74 $view->use_pager = FALSE;
75 $view->nodes_per_page = '0';
76 $view->menu = TRUE;
77 $view->menu_title = 'News Aggregator';
78 $view->menu_tab = FALSE;
79 $view->menu_tab_weight = '0';
80 $view->menu_tab_default = FALSE;
81 $view->menu_tab_default_parent = NULL;
82 $view->menu_parent_tab_weight = '0';
83 $view->menu_parent_title = '';
84 $view->sort = array();
85 $view->argument = array();
86 $view->field = array(
87 array(
88 'tablename' => 'node',
89 'field' => 'title',
90 'label' => 'Title',
91 'handler' => 'views_handler_field_nodelink',
92 'options' => 'link',
93 'sortable' => true,
94 ),
95 array(
96 'tablename' => 'fooaggregator_count',
97 'field' => 'items',
98 'label' => 'Items',
99 'sortable' => true,
100 ),
101 array(
102 'tablename' => 'fooaggregator_feed',
103 'field' => 'checked',
104 'label' => 'Last check',
105 'handler' => 'views_handler_field_date_small',
106 'sortable' => true,
107 ),
108 array(
109 'tablename' => 'fooaggregator_feed',
110 'field' => 'updated',
111 'label' => 'Last update',
112 'handler' => 'views_handler_field_date_small',
113 'sortable' => true,
114 ),
115 array(
116 'tablename' => 'fooaggregator_feed',
117 'field' => 'next_update',
118 'label' => 'Next update',
119 //'sortable' => true,
120 ),
121 array(
122 'tablename' => 'node',
123 'field' => 'edit',
124 'label' => '',
125 'handler' => 'views_handler_node_edit_destination',
126 ),
127 array(
128 'tablename' => 'node',
129 'field' => 'delete',
130 'label' => '',
131 'handler' => 'views_handler_node_delete_destination',
132 ),
133 array(
134 'tablename' => 'fooaggregator_feed',
135 'field' => 'update',
136 'label' => '',
137 ),
138 array(
139 'tablename' => 'fooaggregator_feed',
140 'field' => 'clear',
141 'label' => '',
142 ),
143 );
144 $view->filter = array(
145 array (
146 'tablename' => 'node',
147 'field' => 'type',
148 'operator' => 'OR',
149 'value' => array ('fooaggregator_feed'),
150 ),
151 );
152 $view->exposed_filter = array();
153 $view->requires = array('node', 'fooaggregator_feed');
154 $views[$view->name] = $view;
155
156 return $views;
157 }
158
159 function fooaggregator_views_handler_field_image($fieldinfo, $fielddata, $value, $data) {
160 $image = new stdClass;
161 $image->image_link = $data->fooaggregator_feed_image_link;
162 $image->image_title = $data->fooaggregator_feed_image_title;
163 $image->image_url = $data->fooaggregator_feed_image_url;
164
165 return theme('fooaggregator_feed_image', $image);
166 }
167
168 function fooaggregator_views_handler_field_link($fieldinfo, $fielddata, $value, $data) {
169 return $value ? l($data->node_title, $value) : 'n/a';
170 }
171
172 function fooaggregator_views_handler_field_refresh($fieldinfo, $fielddata, $value, $data) {
173 return format_interval($value);
174 }
175
176 function fooaggregator_views_handler_field_next_update($fieldinfo, $fielddata, $value, $data) {
177 return $data->fooaggregator_feed_checked ? t('%time left', array('%time' => format_interval($data->fooaggregator_feed_checked + $data->fooaggregator_feed_refresh - time()))) : t('never');
178 }
179
180 function fooaggregator_views_handler_field_visible($fieldinfo, $fielddata, $value, $data) {
181 return $value == 1 ? t('Yes') : t('No');
182 }
183
184 function fooaggregator_views_query_handler_field_link($fielddata, $fieldinfo, &$query) {
185 $query->add_field('title', 'node');
186 }
187
188 function fooaggregator_views_handler_field_update($fieldinfo, $fielddata, $value, $data) {
189 if (user_access('administer aggregator')) {
190 return l(t('Refresh'), 'node/'.$data->nid.'/refresh', NULL, drupal_get_destination());
191 }
192 }
193
194 function fooaggregator_views_handler_field_clear($fieldinfo, $fielddata, $value, $data) {
195 if (user_access('administer aggregator')) {
196 return l(t('Clear'), 'node/'.$data->nid.'/clear', NULL, drupal_get_destination());
197 }
198 }
199
200 function fooaggregator_views_query_handler_field_items($fielddata, $fieldinfo, &$query) {
201 $query->add_table('fooaggregator_count', true);
202 $query->add_field('count(fooaggregator_count.nid)', '', 'fooaggregator_count_items');
203 $query->add_groupby('fooaggregator_feed.nid');
204 }
205
206 function fooaggregator_views_query_handler_field_latest($fielddata, $fieldinfo, &$query) {
207 $query->add_table('fooaggregator_latest', true);
208 $query->add_field('max(fooaggregator_latest.created)', '', 'fooaggregator_latest_latest');
209 $query->add_groupby('fooaggregator_count.fid');
210 }
211
212 function _fooaggregator_feed_views_tables() {
213 $ret = array(
214 'name' => 'fooaggregator_feed',
215 'join' => array(
216 'type' => 'left',
217 'left' => array(
218 'table' => 'node',
219 'field' => 'nid',
220 ),
221 'right' => array(
222 'field' => 'nid',
223 ),
224 ), // end join.
225 'fields' => array(
226 'link' => array(
227 'name' => t('Feed: Link'),
228 'handler' => 'fooaggregator_views_handler_field_link',
229 'query_handler' => 'fooaggregator_views_query_handler_field_link',
230 ),
231 'refresh' => array(
232 'name' => t('Feed: Update interval'),
233 'handler' => 'fooaggregator_views_handler_field_refresh',
234 'sortable' => true,
235 ),
236 'checked' => array(
237 'name' => t('Feed: Last checked'),
238 'handler' => views_handler_field_dates(),
239 'sortable' => true,
240 'option' => 'string',
241 ),
242 'updated' => array(
243 'name' => t('Feed: Last updated'),
244 'handler' => views_handler_field_dates(),
245 'sortable' => true,
246 'option' => 'string',
247 ),
248 'modified' => array(
249 'name' => t('Feed: Last modified'),
250 'handler' => views_handler_field_dates(),
251 'sortable' => true,
252 'option' => 'string',
253 ),
254 'next_update' => array(
255 'name' => t('Feed: Next update'),
256 'handler' => 'fooaggregator_views_handler_field_next_update',
257 'notafield' => true,
258 'addlfields' => array('checked', 'refresh'),
259 ),
260 'image' => array(
261 'name' => t('Feed: Image'),
262 'notafield' => true,
263 'addlfields' => array('image_url', 'image_title', 'image_link'),
264 'handler' => 'fooaggregator_views_handler_field_image',
265 ),
266 'visible' => array( // todo: needed ?
267 'name' => t('Feed: Visible'),
268 'handler' => 'fooaggregator_views_handler_field_visible',
269 ),
270 'update' => array(
271 'name' => 'Feed: Update items link.',
272 'notafield' => true,
273 'handler' => 'fooaggregator_views_handler_field_update',
274 ),
275 'clear' => array(
276 'name' => 'Feed: Clear items link.',
277 'notafield' => true,
278 'handler' => 'fooaggregator_views_handler_field_clear',
279 ),
280 ), // end fields.
281 'filters' => array(
282 'visible' => array(
283 'name' => t('Feed: Visible'),
284 'list' => 'views_handler_operator_yesno',
285 'list-type' => 'select',
286 'operator' => array('=' => t('Equals')),
287 ),
288 ),
289 );
290
291 return $ret;
292 }
293
294 function _fooaggregator_count_views_tables() {
295 $ret = array(
296 'name' => 'fooaggregator_item',
297 'join' => array(
298 'type' => 'left',
299 'left' => array('table' => 'fooaggregator_feed', 'field' => 'nid'),
300 'right' => array('field' => 'fid'),
301 ),
302 'fields' => array(
303 'items' => array(
304 'name' => t('Feed: Number of items.'),
305 'handler' => 'views_handler_field_int',
306 'query_handler' => 'fooaggregator_views_query_handler_field_items',
307 'notafield' => true,
308 'sortable' => true,
309 'help' => t('This adds the number of items per feed.'),
310 ),
311 ),
312 );
313 return $ret;
314 }
315
316 function _fooaggregator_latest_views_tables() {
317 $ret = array(
318 'name' => 'node',
319 'join' => array(
320 'type' => 'left',
321 'left' => array('table' => 'fooaggregator_count', 'field' => 'nid'),
322 'right' => array('field' => 'nid'),
323 ),
324 'fields' => array(
325 'latest' => array(
326 'name' => t('Feed: Latest item'),
327 'handler' => views_handler_field_dates(),
328 'option' => 'string',
329 'query_handler' => 'fooaggregator_views_query_handler_field_latest',
330 'notafield' => true,
331 'sortable' => true,
332 'help' => t('This adds the date of latest feed item.'),
333 ),
334
335 ),
336 );
337 return $ret;
338 }
339
340 function _fooaggregator_item_views_tables() {
341 $ret = array(
342 'name' => 'fooaggregator_item',
343 'join' => array(
344 'type' => 'left',
345 'left' => array(
346 'table' => 'node',
347 'field' => 'nid',
348 ),
349 'right' => array(
350 'field' => 'nid',
351 ),
352 ),
353 'fields' => array(
354 'link' => array(
355 'name' => t('Feed Item: Link'),
356 'handler' => 'fooaggregator_views_handler_field_link',
357 'query_handler' => 'fooaggregator_views_query_handler_field_link',
358 ),
359 ),
360 );
361
362 return $ret;
363 }
364
365 function fooaggregator_views_handler_argument_fid($op, &$query, $argtype, $arg = '') {
366 switch ($op) {
367 case 'summary':
368 $join = array(
369 'type' => 'inner',
370 'left' => array(
371 'table' => 'node',
372 'field' => 'nid',
373 ),
374 'right' => array(
375 'field' => 'fid',
376 ),
377 );
378
379 $query->add_field('title', 'node');
380 $query->add_table('fooaggregator_item', false, 1, $join);
381 $query->add_field('fid', 'fooaggregator_item');
382 $fieldinfo['field'] = 'fooaggregator_item.fid';
383 return $fieldinfo;
384
385 case 'sort':
386 // nothing.
387 break;
388
389 case 'filter':
390 $query->ensure_table('fooaggregator_item', true);
391 $args = _views_break_phrase($arg);
392 if ($args[0] == 'and') {
393 $operator = $argtype['options'] ? '!=' : '=';
394 foreach ($args[1] as $arg) {
395 $query->add_where("fooaggregator_item.fid $operator %d", $arg);
396 }
397 }
398 else {
399 $query->add_where("fooaggregator_item.fid IN (%s)", implode(',', $args[1]));
400 }
401 break;
402
403 case 'link':
404 return l($query->title, $arg.'/'.$query->fid);
405 case 'title':
406 // TODO: Is this a hack ? ;-)
407 return views_handler_arg_nid($op, $query, $argtype, $arg);
408 }
409 }
410
411 /**
412 * A views theme function.
413 * Display the default admin view.
414 */
415 function theme_fooaggregator_views_view($view, $nodes, $type) {
416 $fields = _views_get_fields();
417
418 $total = count($nodes);
419 $needs_updating = 0;
420
421 foreach ($nodes as $node) {
422 $row = array();
423 foreach ($view->field as $field) {
424 if ($fields[$field['id']]['visible'] !== FALSE) {
425 $cell['data'] = views_theme_field('views_handle_field', $field['queryname'], $fields, $field, $node, $view);
426 $cell['class'] = "view-field ". views_css_safe('view-field-'. $field['queryname']);
427 $row[] = $cell;
428 }
429 }
430
431 if (time() - $node->fooaggregator_feed_checked > $node->fooaggregator_feed_refresh) {
432 $rows[] = array('class' => 'error', 'data' => $row);
433 ++$needs_updating;
434 }
435 else {
436 $rows[] = $row;
437 }
438 }
439
440 drupal_set_message(t('Total: %total. Needs updating: %needs_updating', array('%total' => $total, '%needs_updating' => $needs_updating)));
441
442 return theme('table', $view->table_header, $rows);
443 }
444
445 /**
446 * Validate our view.
447 */
448 function fooaggregator_views_validate($type, $view, $form) {
449 // todo: clean this a bit. It seems a bit hackish to me.
450 $valid = false;
451
452 foreach ($view['field'] as $field) {
453 if (is_array($field)) {
454 if ($field['id'] == 'fooaggregator_feed.next_update' || $field['id'] == 'fooaggregator_feed.refresh') {
455 $valid = true;
456 break;
457 }
458 }
459 }
460
461 if (!$valid) {
462 form_error($form["$type-info"][$type . '_type'], t('Please add a Last checked or Next update field.'));
463 }
464
465 // We are still a table. We will ask views to validate for us too.
466 views_ui_plugin_validate_table($type, $view, $form);
467 }
468
469 ?>

  ViewVC Help
Powered by ViewVC 1.1.2