simplenews_scheduler_views.inc 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. <?php
  2. /**
  3. * @file simplenews_scheduler_views.inc
  4. * Views support for simplenews
  5. */
  6. /**
  7. * Implementation of hook_views_tables
  8. */
  9. function simplenews_scheduler_views_tables() {
  10. $tables['simplenews_scheduler'] = array(
  11. 'name' => 'simplenews_scheduler',
  12. 'filters' => array(
  13. 'node.created' => array(
  14. 'name' => t('Simplenews schedule: node created'),
  15. 'list' => 'simplenews_scheduler_handler_newsletters',
  16. 'list-type' => 'list',
  17. 'handler' => 'simplenews_scheduler_filter_value',
  18. 'operator' => 'simplenews_scheduler_handler_operator_ca',
  19. 'value-type' => 'array',
  20. 'help' => t('Select the newsletter to filter against, this will filter nodes that have been created AFTER the latest <i>edition</i> of this newsletter'),
  21. ),
  22. ),
  23. );
  24. return $tables;
  25. }
  26. function simplenews_scheduler_handler_newsletters() {
  27. $list = array();
  28. $result = db_query("SELECT ss.*,n.title FROM {simplenews_scheduler} ss JOIN {node} n ON n.nid = ss.snid GROUP BY snid");
  29. while($row = db_fetch_array($result)) {
  30. $list[$row['snid']]="Newsletter: ".$row['title'];
  31. }
  32. if(sizeof($list) ==0) {
  33. drupal_set_message('No current newsletter found to filter against, you should create a simplenews newsletter first.');
  34. }
  35. return $list;
  36. }
  37. function simplenews_scheduler_filter_value($op, $filter, $filterinfo, &$query) {
  38. // get oldest last_run time of the selected newsletter
  39. $result=db_query("SELECT ss.*,n.created FROM {simplenews_scheduler} ss
  40. LEFT JOIN {node} n on n.nid = ss.snid
  41. WHERE ss.snid IN (%s)
  42. ORDER BY ss.last_run
  43. LIMIT 0,1",implode(',',$filter['value']));
  44. $last_run = db_fetch_array($result);
  45. // then it hasnt run yet, so we use the creation date of the newsletter parent instead
  46. $trigger_time = $last_run['last_run'] > 0 ? $last_run['last_run'] : $last_run['created'];
  47. $query->add_field('created', 'node');
  48. $query->add_where("node.created %s %d", $filter['operator'], $trigger_time);
  49. }
  50. function simplenews_scheduler_handler_operator_ca() {
  51. return array('>' => t("After Most Recent Edition Of"),'<' => t("Before Most Recent Edition Of"));
  52. }
  53. // any view that has this as a filter should be invalidate cache
  54. function simplenews_scheduler_views_pre_query(&$view) {
  55. foreach($view->filter as $i => $filter) {
  56. if( $filter['field'] == 'simplenews_scheduler.node.created') {
  57. $view->is_cacheable = false;
  58. }
  59. }
  60. }