From f0d8e8502aa92b6762c52657f3bacc925b6d24e9 Tue, 3 Jan 2012 19:17:02 +0100
From: hass <hass@85918.no-reply.drupal.org>
Date: Tue, 3 Jan 2012 19:16:30 +0100
Subject: [PATCH] Views integration for Broken Links report

diff --git a/linkchecker.module b/linkchecker.module
index 7213b5b..8f75382 100644
--- a/linkchecker.module
+++ b/linkchecker.module
@@ -196,6 +196,15 @@
 }
 
 /**
+ * Implements hook_views_api().
+ */
+function linkchecker_views_api() {
+  return array(
+    'api' => 3,
+  );
+}
+
+/**
  * Implements hook_cron().
  */
 function linkchecker_cron() {
diff --git a/linkchecker.views.inc b/linkchecker.views.inc
new file mode 100644
index 0000000..ba97367
--- /dev/null
+++ b/linkchecker.views.inc
@@ -0,0 +1,464 @@
+<?php
+
+/**
+* @file
+* Views callbacks for the linkchecker module.
+*/
+
+/**
+* Implements hook_views_data().
+*/
+function linkchecker_views_data() {
+  $data['linkchecker_node'] = array(
+    'table' => array(
+      'group' => t('Broken links'),
+      'join' => array(
+        'node' => array(
+          'left_table' => 'node',
+          'left_field' => 'nid',
+          'field' => 'nid',
+        ),
+      ),
+    ),
+  );
+  $data['linkchecker_link'] = array(
+    'table' => array(
+      'group' => t('Broken links'),
+      'join' => array(
+          'node' => array(
+          'left_table' => 'linkchecker_node',
+          'left_field' => 'lid',
+          'field' => 'lid',
+        ),
+      ),
+    ),
+    // Describe table fields to views.
+    'lid' => array(
+      'title' => t('Link ID'),
+      'help' => t("The unique linkchecker link ID."),
+      'field' => array(
+        'handler' => 'views_handler_field_numeric',
+        'click sortable' => TRUE,
+      ),
+      'sort' => array(
+        'handler' => 'views_handler_sort',
+      ),
+      'filter' => array(
+        'handler' => 'views_handler_filter_numeric',
+      ),
+    ),
+    'url' => array(
+      'title' => t('URL'),
+      'help' => t('The URL of a link in a broken links report.'),
+      'field' => array(
+        'handler' => 'views_handler_field',
+        'click sortable' => TRUE,
+      ),
+      'sort' => array(
+        'handler' => 'views_handler_sort',
+      ),
+      'filter' => array(
+        'handler' => 'views_handler_filter_string',
+      ),
+      'argument' => array(
+        'handler' => 'views_handler_argument_string',
+      ),
+    ),
+    // HTTP status code.
+    'code' => array(
+      'title' => t('HTTP status code'),
+      'help' => t('The status code returned by HTTP requests to the link.'),
+      'field' => array(
+        'handler' => 'views_handler_field_numeric',
+        'click sortable' => TRUE,
+      ),
+      'sort' => array(
+        'handler' => 'views_handler_sort',
+      ),
+      'filter' => array(
+        'handler' => 'views_handler_filter_numeric',
+      ),
+    ),
+    // Error message.
+    'error' => array(
+      'title' => t('Error message'),
+      'help' => t('The error message received from the remote server while doing link checking.'),
+      'field' => array(
+        'handler' => 'views_handler_field',
+        'click sortable' => TRUE,
+      ),
+      'sort' => array(
+        'handler' => 'views_handler_sort',
+      ),
+      'filter' => array(
+        'handler' => 'views_handler_filter_string',
+      ),
+    ),
+    // Fail count.
+    'fail_count' => array(
+      'title' => t('Fail count'),
+      'help' => t('The number of times a request for the URL has failed.'),
+      'field' => array(
+        'handler' => 'views_handler_field_numeric',
+        'click sortable' => TRUE,
+      ),
+      'sort' => array(
+        'handler' => 'views_handler_sort',
+      ),
+      'filter' => array(
+        'handler' => 'views_handler_filter_numeric',
+      ),
+    ),
+    // Last checked unix timestamp.
+    'last_checked' => array(
+      'title' => t('Last checked'),
+      'help' => t('Unix timestamp of the last link check.'),
+      'field' => array(
+        'handler' => 'views_handler_filter_numeric',
+        'click sortable' => TRUE,
+      ),
+      'sort' => array(
+        'handler' => 'views_handler_sort',
+      ),
+      'filter' => array(
+        'handler' => 'views_handler_filter_numeric',
+      ),
+    ),
+    // Status (TRUE|FALSE if the link check is enabled|disabled).
+    'status' => array(
+      'title' => t('Status'),
+      'help' => t('Whether or not the link should be checked for being broken.'),
+      'field' => array(
+        'handler' => 'views_handler_field_boolean',
+        'click sortable' => TRUE,
+      ),
+      'filter' => array(
+        'handler' => 'views_handler_filter_boolean_operator',
+        'label' => t('Check link status'),
+        'type' => 'enabled-disabled',
+      ),
+      'sort' => array(
+        'handler' => 'views_handler_sort',
+      ),
+    ),
+  );
+
+  return $data;
+}
+
+/**
+* Implements hook_views_default_views().
+*/
+function linkchecker_views_default_views() {
+  $views = array();
+
+  $view = new view;
+  $view->name = 'broken-node-links';
+  $view->description = 'Display a list of broken links in your nodes.';
+  $view->tag = 'default';
+  $view->base_table = 'node';
+  $view->human_name = 'Broken node links';
+  $view->core = 0;
+  $view->api_version = '3.0';
+  $view->disabled = TRUE; /* Edit this to true to make a default view disabled initially */
+
+  /* Display: Defaults */
+  $handler = $view->new_display('default', 'Defaults', 'default');
+  $handler->display->display_options['title'] = 'Broken node links';
+  $handler->display->display_options['items_per_page'] = 0;
+  $handler->display->display_options['access']['type'] = 'perm';
+  $handler->display->display_options['access']['perm'] = 'access broken links report';
+  $handler->display->display_options['cache']['type'] = 'none';
+  $handler->display->display_options['query']['type'] = 'views_query';
+  $handler->display->display_options['query']['options']['query_comment'] = FALSE;
+  $handler->display->display_options['exposed_form']['type'] = 'basic';
+  $handler->display->display_options['pager']['type'] = 'full';
+  $handler->display->display_options['pager']['options']['items_per_page'] = '50';
+  $handler->display->display_options['pager']['options']['offset'] = '0';
+  $handler->display->display_options['pager']['options']['id'] = '0';
+  $handler->display->display_options['pager']['options']['expose']['items_per_page_options_all'] = 0;
+  $handler->display->display_options['style_plugin'] = 'table';
+  $handler->display->display_options['style_options']['group_rendered'] = 1;
+  $handler->display->display_options['style_options']['columns'] = array(
+    'url' => 'url',
+    'code' => 'code',
+    'error' => 'error',
+    'nid' => 'nid',
+    'lid' => 'lid',
+    'nothing' => 'nothing',
+  );
+  $handler->display->display_options['style_options']['default'] = 'code';
+  $handler->display->display_options['style_options']['info'] = array(
+    'url' => array(
+      'sortable' => 1,
+      'default_sort_order' => 'asc',
+      'align' => '',
+      'separator' => '',
+      'empty_column' => 0,
+    ),
+    'code' => array(
+      'sortable' => 1,
+      'default_sort_order' => 'asc',
+      'align' => '',
+      'separator' => '',
+      'empty_column' => 0,
+    ),
+    'error' => array(
+      'sortable' => 1,
+      'default_sort_order' => 'asc',
+      'align' => '',
+      'separator' => '',
+      'empty_column' => 0,
+    ),
+    'nid' => array(
+      'sortable' => 0,
+      'default_sort_order' => 'asc',
+      'align' => '',
+      'separator' => '',
+      'empty_column' => 0,
+    ),
+    'lid' => array(
+      'sortable' => 0,
+      'default_sort_order' => 'asc',
+      'align' => '',
+      'separator' => '',
+      'empty_column' => 0,
+    ),
+    'nothing' => array(
+      'align' => '',
+      'separator' => '',
+      'empty_column' => 0,
+    ),
+  );
+  $handler->display->display_options['style_options']['override'] = 1;
+  $handler->display->display_options['style_options']['sticky'] = 1;
+  $handler->display->display_options['style_options']['empty_table'] = 0;
+  /* Field: Broken links: Link ID */
+  $handler->display->display_options['fields']['lid']['id'] = 'lid';
+  $handler->display->display_options['fields']['lid']['table'] = 'linkchecker_link';
+  $handler->display->display_options['fields']['lid']['field'] = 'lid';
+  $handler->display->display_options['fields']['lid']['label'] = '';
+  $handler->display->display_options['fields']['lid']['exclude'] = TRUE;
+  $handler->display->display_options['fields']['lid']['alter']['alter_text'] = 1;
+  $handler->display->display_options['fields']['lid']['alter']['text'] = 'Edit link settings';
+  $handler->display->display_options['fields']['lid']['alter']['make_link'] = 1;
+  $handler->display->display_options['fields']['lid']['alter']['path'] = 'linkchecker/[lid]/edit?destination=admin/reports/broken-node-links';
+  $handler->display->display_options['fields']['lid']['alter']['absolute'] = 0;
+  $handler->display->display_options['fields']['lid']['alter']['external'] = 0;
+  $handler->display->display_options['fields']['lid']['alter']['replace_spaces'] = 0;
+  $handler->display->display_options['fields']['lid']['alter']['trim_whitespace'] = 0;
+  $handler->display->display_options['fields']['lid']['alter']['nl2br'] = 0;
+  $handler->display->display_options['fields']['lid']['alter']['word_boundary'] = 1;
+  $handler->display->display_options['fields']['lid']['alter']['ellipsis'] = 1;
+  $handler->display->display_options['fields']['lid']['alter']['strip_tags'] = 0;
+  $handler->display->display_options['fields']['lid']['alter']['trim'] = 0;
+  $handler->display->display_options['fields']['lid']['alter']['html'] = 0;
+  $handler->display->display_options['fields']['lid']['element_label_colon'] = FALSE;
+  $handler->display->display_options['fields']['lid']['element_default_classes'] = 1;
+  $handler->display->display_options['fields']['lid']['hide_empty'] = 0;
+  $handler->display->display_options['fields']['lid']['empty_zero'] = 0;
+  $handler->display->display_options['fields']['lid']['hide_alter_empty'] = 1;
+  $handler->display->display_options['fields']['lid']['separator'] = '';
+  $handler->display->display_options['fields']['lid']['format_plural'] = 0;
+  /* Field: Broken links: URL */
+  $handler->display->display_options['fields']['url']['id'] = 'url';
+  $handler->display->display_options['fields']['url']['table'] = 'linkchecker_link';
+  $handler->display->display_options['fields']['url']['field'] = 'url';
+  $handler->display->display_options['fields']['url']['alter']['alter_text'] = 0;
+  $handler->display->display_options['fields']['url']['alter']['make_link'] = 1;
+  $handler->display->display_options['fields']['url']['alter']['path'] = '[url]';
+  $handler->display->display_options['fields']['url']['alter']['absolute'] = 0;
+  $handler->display->display_options['fields']['url']['alter']['external'] = 0;
+  $handler->display->display_options['fields']['url']['alter']['replace_spaces'] = 0;
+  $handler->display->display_options['fields']['url']['alter']['trim_whitespace'] = 0;
+  $handler->display->display_options['fields']['url']['alter']['nl2br'] = 0;
+  $handler->display->display_options['fields']['url']['alter']['word_boundary'] = 1;
+  $handler->display->display_options['fields']['url']['alter']['ellipsis'] = 1;
+  $handler->display->display_options['fields']['url']['alter']['strip_tags'] = 0;
+  $handler->display->display_options['fields']['url']['alter']['trim'] = 0;
+  $handler->display->display_options['fields']['url']['alter']['html'] = 0;
+  $handler->display->display_options['fields']['url']['element_label_colon'] = 1;
+  $handler->display->display_options['fields']['url']['element_default_classes'] = 1;
+  $handler->display->display_options['fields']['url']['hide_empty'] = 0;
+  $handler->display->display_options['fields']['url']['empty_zero'] = 0;
+  $handler->display->display_options['fields']['url']['hide_alter_empty'] = 1;
+  /* Field: Broken links: HTTP status code */
+  $handler->display->display_options['fields']['code']['id'] = 'code';
+  $handler->display->display_options['fields']['code']['table'] = 'linkchecker_link';
+  $handler->display->display_options['fields']['code']['field'] = 'code';
+  $handler->display->display_options['fields']['code']['label'] = 'Response';
+  $handler->display->display_options['fields']['code']['alter']['alter_text'] = 0;
+  $handler->display->display_options['fields']['code']['alter']['make_link'] = 0;
+  $handler->display->display_options['fields']['code']['alter']['absolute'] = 0;
+  $handler->display->display_options['fields']['code']['alter']['external'] = 0;
+  $handler->display->display_options['fields']['code']['alter']['replace_spaces'] = 0;
+  $handler->display->display_options['fields']['code']['alter']['trim_whitespace'] = 0;
+  $handler->display->display_options['fields']['code']['alter']['nl2br'] = 0;
+  $handler->display->display_options['fields']['code']['alter']['word_boundary'] = 1;
+  $handler->display->display_options['fields']['code']['alter']['ellipsis'] = 1;
+  $handler->display->display_options['fields']['code']['alter']['strip_tags'] = 0;
+  $handler->display->display_options['fields']['code']['alter']['trim'] = 0;
+  $handler->display->display_options['fields']['code']['alter']['html'] = 0;
+  $handler->display->display_options['fields']['code']['element_label_colon'] = 1;
+  $handler->display->display_options['fields']['code']['element_default_classes'] = 1;
+  $handler->display->display_options['fields']['code']['hide_empty'] = 0;
+  $handler->display->display_options['fields']['code']['empty_zero'] = 0;
+  $handler->display->display_options['fields']['code']['hide_alter_empty'] = 1;
+  $handler->display->display_options['fields']['code']['separator'] = '';
+  $handler->display->display_options['fields']['code']['format_plural'] = 0;
+  /* Field: Broken links: Error message */
+  $handler->display->display_options['fields']['error']['id'] = 'error';
+  $handler->display->display_options['fields']['error']['table'] = 'linkchecker_link';
+  $handler->display->display_options['fields']['error']['field'] = 'error';
+  $handler->display->display_options['fields']['error']['label'] = 'Error';
+  $handler->display->display_options['fields']['error']['alter']['alter_text'] = 0;
+  $handler->display->display_options['fields']['error']['alter']['make_link'] = 0;
+  $handler->display->display_options['fields']['error']['alter']['word_boundary'] = 1;
+  $handler->display->display_options['fields']['error']['alter']['ellipsis'] = 1;
+  $handler->display->display_options['fields']['error']['alter']['strip_tags'] = 0;
+  $handler->display->display_options['fields']['error']['alter']['trim'] = 0;
+  $handler->display->display_options['fields']['error']['alter']['html'] = 0;
+  $handler->display->display_options['fields']['error']['hide_empty'] = 0;
+  $handler->display->display_options['fields']['error']['empty_zero'] = 0;
+  /* Field: Content: Nid */
+  $handler->display->display_options['fields']['nid']['id'] = 'nid';
+  $handler->display->display_options['fields']['nid']['table'] = 'node';
+  $handler->display->display_options['fields']['nid']['field'] = 'nid';
+  $handler->display->display_options['fields']['nid']['label'] = '';
+  $handler->display->display_options['fields']['nid']['exclude'] = TRUE;
+  $handler->display->display_options['fields']['nid']['alter']['alter_text'] = 1;
+  $handler->display->display_options['fields']['nid']['alter']['text'] = 'Edit node [nid]';
+  $handler->display->display_options['fields']['nid']['alter']['make_link'] = 1;
+  $handler->display->display_options['fields']['nid']['alter']['path'] = 'node/[nid]/edit?destination=admin/reports/broken-node-links';
+  $handler->display->display_options['fields']['nid']['alter']['absolute'] = 0;
+  $handler->display->display_options['fields']['nid']['alter']['external'] = 0;
+  $handler->display->display_options['fields']['nid']['alter']['replace_spaces'] = 0;
+  $handler->display->display_options['fields']['nid']['alter']['trim_whitespace'] = 0;
+  $handler->display->display_options['fields']['nid']['alter']['nl2br'] = 0;
+  $handler->display->display_options['fields']['nid']['alter']['word_boundary'] = 1;
+  $handler->display->display_options['fields']['nid']['alter']['ellipsis'] = 1;
+  $handler->display->display_options['fields']['nid']['alter']['strip_tags'] = 0;
+  $handler->display->display_options['fields']['nid']['alter']['trim'] = 0;
+  $handler->display->display_options['fields']['nid']['alter']['html'] = 0;
+  $handler->display->display_options['fields']['nid']['element_label_colon'] = FALSE;
+  $handler->display->display_options['fields']['nid']['element_default_classes'] = 1;
+  $handler->display->display_options['fields']['nid']['hide_empty'] = 0;
+  $handler->display->display_options['fields']['nid']['empty_zero'] = 0;
+  $handler->display->display_options['fields']['nid']['hide_alter_empty'] = 1;
+  $handler->display->display_options['fields']['nid']['link_to_node'] = 0;
+  /* Field: Global: Custom text */
+  $handler->display->display_options['fields']['nothing']['id'] = 'nothing';
+  $handler->display->display_options['fields']['nothing']['table'] = 'views';
+  $handler->display->display_options['fields']['nothing']['field'] = 'nothing';
+  $handler->display->display_options['fields']['nothing']['label'] = 'Operations';
+  $handler->display->display_options['fields']['nothing']['alter']['text'] = '<ul><li>[nid]</li><li>[lid]</li></ul>';
+  $handler->display->display_options['fields']['nothing']['alter']['make_link'] = 0;
+  $handler->display->display_options['fields']['nothing']['alter']['absolute'] = 0;
+  $handler->display->display_options['fields']['nothing']['alter']['external'] = 0;
+  $handler->display->display_options['fields']['nothing']['alter']['replace_spaces'] = 0;
+  $handler->display->display_options['fields']['nothing']['alter']['trim_whitespace'] = 0;
+  $handler->display->display_options['fields']['nothing']['alter']['nl2br'] = 0;
+  $handler->display->display_options['fields']['nothing']['alter']['word_boundary'] = 1;
+  $handler->display->display_options['fields']['nothing']['alter']['ellipsis'] = 1;
+  $handler->display->display_options['fields']['nothing']['alter']['strip_tags'] = 0;
+  $handler->display->display_options['fields']['nothing']['alter']['trim'] = 0;
+  $handler->display->display_options['fields']['nothing']['alter']['html'] = 0;
+  $handler->display->display_options['fields']['nothing']['element_label_colon'] = 1;
+  $handler->display->display_options['fields']['nothing']['element_default_classes'] = 1;
+  $handler->display->display_options['fields']['nothing']['hide_empty'] = 0;
+  $handler->display->display_options['fields']['nothing']['empty_zero'] = 0;
+  $handler->display->display_options['fields']['nothing']['hide_alter_empty'] = 0;
+  /* Sort criterion: Broken links: Last checked */
+  $handler->display->display_options['sorts']['last_checked']['id'] = 'last_checked';
+  $handler->display->display_options['sorts']['last_checked']['table'] = 'linkchecker_link';
+  $handler->display->display_options['sorts']['last_checked']['field'] = 'last_checked';
+  $handler->display->display_options['sorts']['last_checked']['order'] = 'DESC';
+  /* Filter criterion: Broken links: HTTP status code */
+  $handler->display->display_options['filters']['code_1']['id'] = 'code_1';
+  $handler->display->display_options['filters']['code_1']['table'] = 'linkchecker_link';
+  $handler->display->display_options['filters']['code_1']['field'] = 'code';
+  $handler->display->display_options['filters']['code_1']['operator'] = '!=';
+  $handler->display->display_options['filters']['code_1']['value']['value'] = '200';
+  $handler->display->display_options['filters']['code_1']['group'] = 0;
+  $handler->display->display_options['filters']['code_1']['expose']['operator'] = FALSE;
+  /* Filter criterion: Broken links: HTTP status code */
+  $handler->display->display_options['filters']['code_2']['id'] = 'code_2';
+  $handler->display->display_options['filters']['code_2']['table'] = 'linkchecker_link';
+  $handler->display->display_options['filters']['code_2']['field'] = 'code';
+  $handler->display->display_options['filters']['code_2']['operator'] = '!=';
+  $handler->display->display_options['filters']['code_2']['value']['value'] = '206';
+  $handler->display->display_options['filters']['code_2']['group'] = 0;
+  $handler->display->display_options['filters']['code_2']['expose']['operator'] = FALSE;
+  /* Filter criterion: Broken links: HTTP status code */
+  $handler->display->display_options['filters']['code_3']['id'] = 'code_3';
+  $handler->display->display_options['filters']['code_3']['table'] = 'linkchecker_link';
+  $handler->display->display_options['filters']['code_3']['field'] = 'code';
+  $handler->display->display_options['filters']['code_3']['operator'] = '!=';
+  $handler->display->display_options['filters']['code_3']['value']['value'] = '302';
+  $handler->display->display_options['filters']['code_3']['group'] = 0;
+  $handler->display->display_options['filters']['code_3']['expose']['operator'] = FALSE;
+  /* Filter criterion: Broken links: HTTP status code */
+  $handler->display->display_options['filters']['code_4']['id'] = 'code_4';
+  $handler->display->display_options['filters']['code_4']['table'] = 'linkchecker_link';
+  $handler->display->display_options['filters']['code_4']['field'] = 'code';
+  $handler->display->display_options['filters']['code_4']['operator'] = '!=';
+  $handler->display->display_options['filters']['code_4']['value']['value'] = '304';
+  $handler->display->display_options['filters']['code_4']['group'] = 0;
+  $handler->display->display_options['filters']['code_4']['expose']['operator'] = FALSE;
+  /* Filter criterion: Broken links: HTTP status code */
+  $handler->display->display_options['filters']['code_5']['id'] = 'code_5';
+  $handler->display->display_options['filters']['code_5']['table'] = 'linkchecker_link';
+  $handler->display->display_options['filters']['code_5']['field'] = 'code';
+  $handler->display->display_options['filters']['code_5']['operator'] = '!=';
+  $handler->display->display_options['filters']['code_5']['value']['value'] = '401';
+  $handler->display->display_options['filters']['code_5']['group'] = 0;
+  $handler->display->display_options['filters']['code_5']['expose']['operator'] = FALSE;
+  /* Filter criterion: Broken links: HTTP status code */
+  $handler->display->display_options['filters']['code_6']['id'] = 'code_6';
+  $handler->display->display_options['filters']['code_6']['table'] = 'linkchecker_link';
+  $handler->display->display_options['filters']['code_6']['field'] = 'code';
+  $handler->display->display_options['filters']['code_6']['operator'] = '!=';
+  $handler->display->display_options['filters']['code_6']['value']['value'] = '403';
+  $handler->display->display_options['filters']['code_6']['group'] = 0;
+  $handler->display->display_options['filters']['code_6']['expose']['operator'] = FALSE;
+  /* Filter criterion: Broken links: Last checked */
+  $handler->display->display_options['filters']['last_checked']['id'] = 'last_checked';
+  $handler->display->display_options['filters']['last_checked']['table'] = 'linkchecker_link';
+  $handler->display->display_options['filters']['last_checked']['field'] = 'last_checked';
+  $handler->display->display_options['filters']['last_checked']['operator'] = '!=';
+  $handler->display->display_options['filters']['last_checked']['value']['value'] = '0';
+  $handler->display->display_options['filters']['last_checked']['group'] = 0;
+  /* Filter criterion: Broken links: Status */
+  $handler->display->display_options['filters']['status']['id'] = 'status';
+  $handler->display->display_options['filters']['status']['table'] = 'linkchecker_link';
+  $handler->display->display_options['filters']['status']['field'] = 'status';
+  $handler->display->display_options['filters']['status']['value'] = '1';
+  $handler->display->display_options['filters']['status']['group'] = 0;
+
+  /* Display: Page */
+  $handler = $view->new_display('page', 'Page', 'page_1');
+  $handler->display->display_options['path'] = 'admin/reports/broken-node-links';
+  $translatables['Broken links'] = array(
+    t('Defaults'),
+    t('Broken node links'),
+    t('more'),
+    t('Apply'),
+    t('Reset'),
+    t('Sort by'),
+    t('Asc'),
+    t('Desc'),
+    t('Items per page'),
+    t('- All -'),
+    t('Offset'),
+    t('Edit link settings'),
+    t('URL'),
+    t('Response'),
+    t('Error'),
+    t('Edit node [nid]'),
+    t('Operations'),
+    t('Page'),
+  );
+
+  $views[$view->name] = $view;
+  return $views;
+}
