diff --git a/linkchecker.info b/linkchecker.info index eb73aa3..e7cf6da 100644 --- a/linkchecker.info +++ b/linkchecker.info @@ -4,3 +4,11 @@ configure = admin/config/content/linkchecker core = 7.x files[] = linkchecker.drush.inc files[] = linkchecker.test + +; Views handlers +files[] = views/handlers/linkchecker_handler_field_linkchecker_block_custom_block_edit.inc +files[] = views/handlers/linkchecker_handler_field_linkchecker_link_link_edit.inc +files[] = views/handlers/linkchecker_handler_field_linkchecker_link_redirect_add.inc +files[] = views/handlers/linkchecker_handler_field_linkchecker_link_url.inc +files[] = views/handlers/linkchecker_handler_filter_linkchecker_link_code.inc +files[] = views/plugins/linkchecker_plugin_access.inc diff --git a/linkchecker.module b/linkchecker.module index ce283b2..6458577 100644 --- a/linkchecker.module +++ b/linkchecker.module @@ -103,7 +103,7 @@ function linkchecker_menu() { 'title' => 'Link checker', ); $items['admin/reports/linkchecker'] = array( - 'access arguments' => array('access broken links report'), + 'access callback' => '_linkchecker_access', 'description' => 'Shows a list of broken links in content.', 'file' => 'linkchecker.pages.inc', 'page callback' => 'linkchecker_admin_report_page', @@ -112,7 +112,7 @@ function linkchecker_menu() { ); // Add the user menu item after node/edit tab. $items['user/%user/linkchecker'] = array( - 'access callback' => '_linkchecker_user_access_account_broken_links_report', + 'access callback' => '_linkchecker_access', 'access arguments' => array(1), 'description' => 'Shows a list of broken links in content.', 'file' => 'linkchecker.pages.inc', @@ -123,7 +123,7 @@ function linkchecker_menu() { 'weight' => 3, ); $items['linkchecker/%linkchecker_link/edit'] = array( - 'access callback' => '_linkchecker_user_access_edit_link_settings', + 'access callback' => '_linkchecker_access_edit_link_settings', 'access arguments' => array(1), 'file' => 'linkchecker.pages.inc', 'page callback' => 'drupal_get_form', @@ -152,20 +152,24 @@ function linkchecker_admin_paths() { /** * Access callback for user/%user/linkchecker. */ -function _linkchecker_user_access_account_broken_links_report($account) { +function _linkchecker_access($account = NULL) { global $user; + if (!$account && arg(0) == 'user' && is_numeric(arg(1))) { + $account = user_load(arg(1)); + } + // Users with 'access own broken links report' permission can only view their // own report. Users with the 'access broken links report' permission can // view the report for any authenticated user. - return $account->uid && (($user->uid == $account->uid && user_access('access own broken links report')) || user_access('access broken links report')); + return (!empty($account->uid) && $user->uid == $account->uid && user_access('access own broken links report')) || user_access('access broken links report'); } /** * Access callback for linkchecker/%linkchecker_link/edit. */ -function _linkchecker_user_access_edit_link_settings($link) { - return user_access('edit link settings') && _linkchecker_link_access($link); +function _linkchecker_access_edit_link_settings($link) { + return user_access('access broken links report') || (user_access('edit link settings') && _linkchecker_link_access($link)); } /** @@ -1003,6 +1007,16 @@ function linkchecker_block_custom_delete_form_submit($form, &$form_state) { } /** + * Implements hook_views_api(). + */ +function linkchecker_views_api() { + return array( + 'api' => 3, + 'path' => drupal_get_path('module', 'linkchecker') . '/views', + ); +} + +/** * Returns information from database about a user-created (custom) block. * * @param int $bid @@ -2276,17 +2290,10 @@ function _linkchecker_link_check_status_filter($url) { } /** - * Defines the list of allowed response codes for form input validation. - * - * @param int $code - * An numeric response code. - * - * @return bool - * TRUE if the status code is valid, otherwise FALSE. + * Returns a list of HTTP status codes. */ -function _linkchecker_isvalid_response_code($code) { - - $responses = array( +function _linkchecker_response_codes() { + return array( 100 => 'Continue', 101 => 'Switching Protocols', 200 => 'OK', @@ -2328,8 +2335,21 @@ function _linkchecker_isvalid_response_code($code) { 504 => 'Gateway Time-out', 505 => 'HTTP Version not supported', ); +} + +/** + * Validates an HTTP status code. + * + * @param int $code + * An numeric HTTP status code. + * + * @return bool + * TRUE if the status code is valid, otherwise FALSE. + */ +function _linkchecker_isvalid_response_code($code) { + $codes = _linkchecker_response_codes(); - return array_key_exists($code, $responses); + return array_key_exists($code, $codes); } /** @@ -2522,3 +2542,21 @@ function _linkchecker_array_values_recursive(array $array) { return $array_values; } + +/** + * Check if the link is an internal URL or not. + * + * @param object $link + * Link object. + * + * @return bool + * TRUE if link is internal, otherwise FALSE. + */ +function _linkchecker_is_internal_url(&$link) { + global $base_url; + + if (strpos($link->url, $base_url) === 0) { + $link->internal = trim(substr($link->url, strlen($base_url)), " \t\r\n\0\\/"); + return TRUE; + } +} diff --git a/linkchecker.pages.inc b/linkchecker.pages.inc index b533149..1399529 100644 --- a/linkchecker.pages.inc +++ b/linkchecker.pages.inc @@ -293,21 +293,3 @@ function linkchecker_link_edit_form_submit($form, &$form_state) { drupal_set_message(t('The link settings for %url have been saved.', array('%url' => $form_state['values']['url']))); } } - -/** - * Check if the link is an internal URL or not. - * - * @param object $link - * Link object. - * - * @return bool - * TRUE if link is internal, otherwise FALSE. - */ -function _linkchecker_is_internal_url(&$link) { - global $base_url; - - if (strpos($link->url, $base_url) === 0) { - $link->internal = trim(substr($link->url, strlen($base_url)), " \t\r\n\0\\/"); - return TRUE; - } -} diff --git a/views/handlers/linkchecker_handler_field_linkchecker_block_custom_block_edit.inc b/views/handlers/linkchecker_handler_field_linkchecker_block_custom_block_edit.inc new file mode 100644 index 0000000..591ecf5 --- /dev/null +++ b/views/handlers/linkchecker_handler_field_linkchecker_block_custom_block_edit.inc @@ -0,0 +1,97 @@ +additional_fields['bid'] = 'bid'; + } + + /** + * {@inheritdoc} + */ + function option_definition() { + $options = parent::option_definition(); + + $options['destination'] = array('default' => TRUE, 'bool' => TRUE); + $options['text'] = array('default' => '', 'translatable' => TRUE); + + return $options; + } + + /** + * {@inheritdoc} + */ + function options_form(&$form, &$form_state) { + $form['text'] = array( + '#type' => 'textfield', + '#title' => t('Text to display'), + '#default_value' => $this->options['text'], + ); + + parent::options_form($form, $form_state); + + $form['destination'] = array( + '#type' => 'checkbox', + '#title' => t('Use destination'), + '#description' => t('Add destination to the link'), + '#default_value' => $this->options['destination'], + '#fieldset' => 'more', + ); + + // The path is set by render_link function so don't allow to set it. + $form['alter']['path'] = array('#access' => FALSE); + $form['alter']['external'] = array('#access' => FALSE); + } + + /** + * {@inheritdoc} + */ + function query() { + $this->ensure_my_table(); + $this->add_additional_fields(); + } + + /** + * {@inheritdoc} + */ + function render($values) { + // Check there is an actual value, as on a relationship there may not be. + if ($bid = $this->get_value($values, 'bid')) { + return $this->render_link($bid); + } + } + + /** + * Renders the link. + */ + function render_link($bid) { + if (user_access('administer blocks')) { + $this->options['alter']['make_link'] = TRUE; + $this->options['alter']['path'] = 'admin/structure/block/manage/block/' . $bid . '/configure'; + + if (!empty($this->options['destination'])) { + $this->options['alter']['query'] = drupal_get_destination(); + } + + $text = !empty($this->options['text']) ? $this->options['text'] : t('Edit block'); + + return $text; + } + } + +} diff --git a/views/handlers/linkchecker_handler_field_linkchecker_link_link_edit.inc b/views/handlers/linkchecker_handler_field_linkchecker_link_link_edit.inc new file mode 100644 index 0000000..5aa5f10 --- /dev/null +++ b/views/handlers/linkchecker_handler_field_linkchecker_link_link_edit.inc @@ -0,0 +1,97 @@ +additional_fields['lid'] = 'lid'; + } + + /** + * {@inheritdoc} + */ + function option_definition() { + $options = parent::option_definition(); + + $options['destination'] = array('default' => TRUE, 'bool' => TRUE); + $options['text'] = array('default' => '', 'translatable' => TRUE); + + return $options; + } + + /** + * {@inheritdoc} + */ + function options_form(&$form, &$form_state) { + $form['text'] = array( + '#type' => 'textfield', + '#title' => t('Text to display'), + '#default_value' => $this->options['text'], + ); + + parent::options_form($form, $form_state); + + $form['destination'] = array( + '#type' => 'checkbox', + '#title' => t('Use destination'), + '#description' => t('Add destination to the link'), + '#default_value' => $this->options['destination'], + '#fieldset' => 'more', + ); + + // The path is set by render_link function so don't allow to set it. + $form['alter']['path'] = array('#access' => FALSE); + $form['alter']['external'] = array('#access' => FALSE); + } + + /** + * {@inheritdoc} + */ + function query() { + $this->ensure_my_table(); + $this->add_additional_fields(); + } + + /** + * {@inheritdoc} + */ + function render($values) { + // Check there is an actual value, as on a relationship there may not be. + if ($lid = $this->get_value($values, 'lid')) { + return $this->render_link($lid); + } + } + + /** + * Renders the link. + */ + function render_link($lid) { + if (_linkchecker_access_edit_link_settings(array('lid' => $lid))) { + $this->options['alter']['make_link'] = TRUE; + $this->options['alter']['path'] = 'linkchecker/' . $lid . '/edit'; + + if (!empty($this->options['destination'])) { + $this->options['alter']['query'] = drupal_get_destination(); + } + + $text = !empty($this->options['text']) ? $this->options['text'] : t('Edit link settings'); + + return $text; + } + } + +} diff --git a/views/handlers/linkchecker_handler_field_linkchecker_link_redirect_add.inc b/views/handlers/linkchecker_handler_field_linkchecker_link_redirect_add.inc new file mode 100644 index 0000000..3fd873b --- /dev/null +++ b/views/handlers/linkchecker_handler_field_linkchecker_link_redirect_add.inc @@ -0,0 +1,100 @@ +additional_fields['lid'] = 'lid'; + $this->additional_fields['url'] = 'url'; + } + + /** + * {@inheritdoc} + */ + function option_definition() { + $options = parent::option_definition(); + + $options['destination'] = array('default' => TRUE, 'bool' => TRUE); + $options['text'] = array('default' => '', 'translatable' => TRUE); + + return $options; + } + + /** + * {@inheritdoc} + */ + function options_form(&$form, &$form_state) { + $form['text'] = array( + '#type' => 'textfield', + '#title' => t('Text to display'), + '#default_value' => $this->options['text'], + ); + + parent::options_form($form, $form_state); + + $form['destination'] = array( + '#type' => 'checkbox', + '#title' => t('Use destination'), + '#description' => t('Add destination to the link'), + '#default_value' => $this->options['destination'], + '#fieldset' => 'more', + ); + + // The path is set by render_link function so don't allow to set it. + $form['alter']['path'] = array('#access' => FALSE); + $form['alter']['external'] = array('#access' => FALSE); + } + + /** + * {@inheritdoc} + */ + function query() { + $this->ensure_my_table(); + $this->add_additional_fields(); + } + + /** + * {@inheritdoc} + */ + function render($values) { + // Check there is an actual value, as on a relationship there may not be. + if ($lid = $this->get_value($values, 'lid') && $url = $this->get_value($values, 'url')) { + $link = (object) array('lid' => $lid, 'url' => $url); + return $this->render_link($link); + } + } + + /** + * Renders the link. + */ + function render_link($link) { + if (user_access('administer redirects') && _linkchecker_is_internal_url($link)) { + $this->options['alter']['make_link'] = TRUE; + $this->options['alter']['path'] = 'admin/config/search/redirect/add'; + + if (!empty($this->options['destination'])) { + $this->options['alter']['query'] = drupal_get_destination(); + } + + $this->options['alter']['query']['source'] = $link->url; + $text = !empty($this->options['text']) ? $this->options['text'] : t('Create redirect'); + + return $text; + } + } + +} diff --git a/views/handlers/linkchecker_handler_field_linkchecker_link_url.inc b/views/handlers/linkchecker_handler_field_linkchecker_link_url.inc new file mode 100644 index 0000000..6ad66b3 --- /dev/null +++ b/views/handlers/linkchecker_handler_field_linkchecker_link_url.inc @@ -0,0 +1,49 @@ +additional_fields['lid'] = 'lid'; + } + + /** + * {@inheritdoc} + */ + function render($values) { + // Check there is an actual value, as on a relationship there may not be. + if ($lid = $this->get_value($values, 'lid') && $url = $this->get_value($values)) { + $link = (object) array('lid' => $lid, 'url' => $url); + return $this->render_link($link); + } + } + + /** + * Renders the link. + */ + function render_link($link) { + if (user_access('access broken links report') || _linkchecker_link_access($link)) { + $this->options['alter']['make_link'] = TRUE; + $this->options['alter']['path'] = $link->url; + return $link->url; + } + else { + return t('Permission restrictions deny you access to this broken link.'); + } + } + +} diff --git a/views/handlers/linkchecker_handler_filter_linkchecker_link_code.inc b/views/handlers/linkchecker_handler_filter_linkchecker_link_code.inc new file mode 100644 index 0000000..e2f79a5 --- /dev/null +++ b/views/handlers/linkchecker_handler_filter_linkchecker_link_code.inc @@ -0,0 +1,26 @@ +value_options)) { + return; + } + + $this->value_options = _linkchecker_response_codes(); + } + +} diff --git a/views/linkchecker.views.inc b/views/linkchecker.views.inc new file mode 100644 index 0000000..e4c0179 --- /dev/null +++ b/views/linkchecker.views.inc @@ -0,0 +1,307 @@ + array( + 'group' => t('Broken links'), + // Define this as a base table. + 'base' => array( + 'field' => 'lid', + 'title' => t('Broken links'), + 'help' => t('Broken links related to nodes, blocks, comments, fields, etc.'), + ), + // Define joins. + 'join' => array( + 'linkchecker_block_custom' => array( + 'left_field' => 'lid', + 'field' => 'lid', + ), + 'linkchecker_comment' => array( + 'left_field' => 'lid', + 'field' => 'lid', + ), + 'linkchecker_node' => array( + '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' => 'linkchecker_handler_field_linkchecker_link_url', + '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' => 'linkchecker_handler_filter_linkchecker_link_code', + ), + ), + // 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_field_date', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort_date', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_date', + ), + ), + // 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', + ), + ), + // Link to edit the link settings. + 'link_edit' => array( + 'field' => array( + 'title' => t('Edit link settings'), + 'help' => t('Provide a simple link to edit the link settings.'), + 'handler' => 'linkchecker_handler_field_linkchecker_link_link_edit', + ), + ), + ); + + $data['linkchecker_node'] = array( + 'table' => array( + 'group' => t('Broken links'), + 'join' => array( + 'linkchecker_link' => array( + 'left_field' => 'lid', + 'field' => 'lid', + ), + 'node' => array( + 'left_field' => 'nid', + 'field' => 'nid', + ), + ), + ), + // Describe table fields to views. + 'lid' => array( + 'title' => t('Link ID'), + 'help' => t("The unique linkchecker link ID."), + ), + 'nid' => array( + 'title' => t('Content with link'), + 'help' => t('Relate all content associted with a link.'), + 'relationship' => array( + 'handler' => 'views_handler_relationship', + 'base' => 'node', + 'base field' => 'nid', + 'label' => t('Node'), + 'skip base' => 'node', + ), + ), + ); + + if (module_exists('comment')) { + $data['linkchecker_comment'] = array( + 'table' => array( + 'group' => t('Broken links'), + 'join' => array( + 'linkchecker_link' => array( + 'left_field' => 'lid', + 'field' => 'lid', + ), + 'comment' => array( + 'left_field' => 'cid', + 'field' => 'cid', + ), + ), + ), + // Describe table fields to views. + 'lid' => array( + 'title' => t('Link ID'), + 'help' => t("The unique linkchecker link ID."), + ), + 'cid' => array( + 'title' => t('Comment with link'), + 'help' => t('Relate all comments associted with a link.'), + 'relationship' => array( + 'handler' => 'views_handler_relationship', + 'base' => 'comment', + 'base field' => 'cid', + 'label' => t('Comment'), + 'skip base' => 'comment', + ), + ), + ); + } + + if (module_exists('block')) { + $data['linkchecker_block_custom'] = array( + 'table' => array( + 'group' => t('Broken links'), + 'join' => array( + 'linkchecker_link' => array( + 'left_field' => 'lid', + 'field' => 'lid', + ), + ), + ), + // Describe table fields to views. + 'lid' => array( + 'title' => t('Link ID'), + 'help' => t('The unique linkchecker link ID.'), + ), + 'bid' => array( + 'title' => t('Block ID'), + 'help' => t('The unique block ID.'), + 'field' => array( + 'handler' => 'views_handler_field_numeric', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_numeric', + ), + ), + // Link to edit the block. + 'block_edit' => array( + 'field' => array( + 'title' => t('Edit block'), + 'help' => t('Provide a simple link to edit the block.'), + 'handler' => 'linkchecker_handler_field_linkchecker_block_custom_block_edit', + ), + ), + ); + } + + // Add a 'Redirect add' link if the Redirect module is installed. + if (module_exists('redirect')) { + $data['linkchecker_link']['redirect_add'] = array( + 'field' => array( + 'title' => t('Create redirect'), + 'help' => t('Provide a simple link to create a redirect.'), + 'handler' => 'linkchecker_handler_field_linkchecker_link_redirect_add', + ), + ); + } + + return $data; +} + +/** + * Implements hook_views_plugins(). + */ +function linkchecker_views_plugins() { + return array( + 'access' => array( + 'linkchecker' => array( + 'title' => t('Linkchecker'), + 'handler' => 'linkchecker_plugin_access', + ), + ), + ); +} + +/** + * Implements hook_views_pre_render(). + */ +function linkchecker_views_pre_render(&$view) { + // If the view's base table is linkchecker_link and it's a page display. + if ($view->base_table == 'linkchecker_link' && $view->display[$view->current_display]->display_plugin == 'page') { + // Set a status message if any unchecked links exist. + $links_unchecked = db_query('SELECT COUNT(1) FROM {linkchecker_link} WHERE last_checked = :last_checked AND status = :status', array(':last_checked' => 0, ':status' => 1))->fetchField(); + if ($links_unchecked > 0) { + $links_all = db_query('SELECT COUNT(1) FROM {linkchecker_link} WHERE status = :status', array(':status' => 1))->fetchField(); + drupal_set_message(format_plural($links_unchecked, + 'There is 1 unchecked link of about @links_all links in the database. Please be patient until all links have been checked via cron.', + 'There are @count unchecked links of about @links_all links in the database. Please be patient until all links have been checked via cron.', + array('@links_all' => $links_all)), 'warning'); + } + } +} diff --git a/views/linkchecker.views_default.inc b/views/linkchecker.views_default.inc new file mode 100644 index 0000000..702b411 --- /dev/null +++ b/views/linkchecker.views_default.inc @@ -0,0 +1,399 @@ +name = 'linkchecker_reports'; + $view->description = 'Display a list of broken links.'; + $view->tag = 'default'; + $view->base_table = 'linkchecker_link'; + $view->human_name = 'Broken links'; + $view->core = 0; + $view->api_version = '3.0'; + $view->disabled = FALSE; /* 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 links'; + $handler->display->display_options['items_per_page'] = 0; + $handler->display->display_options['use_more_always'] = FALSE; + $handler->display->display_options['access']['type'] = 'linkchecker'; + $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['style_plugin'] = 'table'; + $handler->display->display_options['style_options']['columns'] = array( + 'url' => 'url', + 'code' => 'code', + 'error' => 'error', + 'link_edit' => 'link_edit', + 'nid' => 'nid', + 'edit_node' => 'edit_node', + ); + if ($comment) { + $handler->display->display_options['style_options']['columns'] += array( + 'cid' => 'cid', + 'edit_comment' => 'edit_comment', + ); + } + if ($block) { + $handler->display->display_options['style_options']['columns'] += array( + 'bid' => 'bid', + 'block_edit' => 'block_edit', + ); + } + if ($redirect) { + $handler->display->display_options['style_options']['columns'] += array( + 'redirect_add' => 'redirect_add', + ); + } + $handler->display->display_options['style_options']['columns'] += array( + 'nothing' => 'nothing' + ); + $handler->display->display_options['style_options']['default'] = 'url'; + $handler->display->display_options['style_options']['info'] = array( + 'url' => array( + 'sortable' => 1, + 'default_sort_order' => 'desc', + '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, + ), + 'link_edit' => array( + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'nid' => array( + 'sortable' => 0, + 'default_sort_order' => 'asc', + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'edit_node' => array( + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + ); + if ($comment) { + $handler->display->display_options['style_options']['info'] += array( + 'cid' => array( + 'sortable' => 0, + 'default_sort_order' => 'asc', + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'edit_comment' => array( + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + ); + } + if ($block) { + $handler->display->display_options['style_options']['info'] += array( + 'bid' => array( + 'sortable' => 0, + 'default_sort_order' => 'asc', + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + 'block_edit' => array( + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + ); + } + if ($redirect) { + $handler->display->display_options['style_options']['info'] += array( + 'redirect_add' => array( + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + ); + } + $handler->display->display_options['style_options']['info'] += array( + 'nothing' => array( + 'align' => '', + 'separator' => '', + 'empty_column' => 0, + ), + ); + $handler->display->display_options['style_options']['sticky'] = TRUE; + $handler->display->display_options['style_options']['empty_table'] = TRUE; + /* No results behavior: Global: Text area */ + $handler->display->display_options['empty']['area']['id'] = 'area'; + $handler->display->display_options['empty']['area']['table'] = 'views'; + $handler->display->display_options['empty']['area']['field'] = 'area'; + $handler->display->display_options['empty']['area']['empty'] = TRUE; + $handler->display->display_options['empty']['area']['content'] = 'No broken links have been found.'; + $handler->display->display_options['empty']['area']['format'] = 'plain_text'; + /* Relationship: Broken links: Content with link */ + $handler->display->display_options['relationships']['nid']['id'] = 'nid'; + $handler->display->display_options['relationships']['nid']['table'] = 'linkchecker_node'; + $handler->display->display_options['relationships']['nid']['field'] = 'nid'; + if ($comment) { + /* Relationship: Broken links: Comment with link */ + $handler->display->display_options['relationships']['cid']['id'] = 'cid'; + $handler->display->display_options['relationships']['cid']['table'] = 'linkchecker_comment'; + $handler->display->display_options['relationships']['cid']['field'] = 'cid'; + } + /* 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']['max_length'] = '40'; + $handler->display->display_options['fields']['url']['alter']['word_boundary'] = FALSE; + $handler->display->display_options['fields']['url']['alter']['trim'] = TRUE; + $handler->display->display_options['fields']['url']['hide_empty'] = TRUE; + /* 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']['separator'] = ''; + /* 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'; + /* Field: Broken links: Edit link settings */ + $handler->display->display_options['fields']['link_edit']['id'] = 'link_edit'; + $handler->display->display_options['fields']['link_edit']['table'] = 'linkchecker_link'; + $handler->display->display_options['fields']['link_edit']['field'] = 'link_edit'; + $handler->display->display_options['fields']['link_edit']['exclude'] = TRUE; + $handler->display->display_options['fields']['link_edit']['alter']['alter_text'] = TRUE; + $handler->display->display_options['fields']['link_edit']['alter']['text'] = '
  • Edit link settings
  • '; + $handler->display->display_options['fields']['link_edit']['hide_empty'] = TRUE; + /* 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']['relationship'] = 'nid'; + $handler->display->display_options['fields']['nid']['exclude'] = TRUE; + /* Field: Content: Edit link */ + $handler->display->display_options['fields']['edit_node']['id'] = 'edit_node'; + $handler->display->display_options['fields']['edit_node']['table'] = 'views_entity_node'; + $handler->display->display_options['fields']['edit_node']['field'] = 'edit_node'; + $handler->display->display_options['fields']['edit_node']['relationship'] = 'nid'; + $handler->display->display_options['fields']['edit_node']['label'] = 'Edit node'; + $handler->display->display_options['fields']['edit_node']['exclude'] = TRUE; + $handler->display->display_options['fields']['edit_node']['alter']['alter_text'] = TRUE; + $handler->display->display_options['fields']['edit_node']['alter']['text'] = '
  • Edit node [nid]
  • '; + $handler->display->display_options['fields']['edit_node']['hide_empty'] = TRUE; + if ($comment) { + /* Field: Comment: ID */ + $handler->display->display_options['fields']['cid']['id'] = 'cid'; + $handler->display->display_options['fields']['cid']['table'] = 'comment'; + $handler->display->display_options['fields']['cid']['field'] = 'cid'; + $handler->display->display_options['fields']['cid']['relationship'] = 'cid'; + $handler->display->display_options['fields']['cid']['exclude'] = TRUE; + $handler->display->display_options['fields']['cid']['link_to_comment'] = FALSE; + /* Field: Comment: Edit link */ + $handler->display->display_options['fields']['edit_comment']['id'] = 'edit_comment'; + $handler->display->display_options['fields']['edit_comment']['table'] = 'comment'; + $handler->display->display_options['fields']['edit_comment']['field'] = 'edit_comment'; + $handler->display->display_options['fields']['edit_comment']['relationship'] = 'cid'; + $handler->display->display_options['fields']['edit_comment']['exclude'] = TRUE; + $handler->display->display_options['fields']['edit_comment']['alter']['alter_text'] = TRUE; + $handler->display->display_options['fields']['edit_comment']['alter']['text'] = '
  • Edit comment [cid]
  • '; + $handler->display->display_options['fields']['edit_comment']['hide_empty'] = TRUE; + $handler->display->display_options['fields']['edit_comment']['destination'] = TRUE; + } + if ($block) { + /* Field: Broken links: Block ID */ + $handler->display->display_options['fields']['bid']['id'] = 'bid'; + $handler->display->display_options['fields']['bid']['table'] = 'linkchecker_block_custom'; + $handler->display->display_options['fields']['bid']['field'] = 'bid'; + $handler->display->display_options['fields']['bid']['exclude'] = TRUE; + $handler->display->display_options['fields']['bid']['separator'] = ''; + /* Field: Broken links: Edit block */ + $handler->display->display_options['fields']['block_edit']['id'] = 'block_edit'; + $handler->display->display_options['fields']['block_edit']['table'] = 'linkchecker_block_custom'; + $handler->display->display_options['fields']['block_edit']['field'] = 'block_edit'; + $handler->display->display_options['fields']['block_edit']['exclude'] = TRUE; + $handler->display->display_options['fields']['block_edit']['alter']['alter_text'] = TRUE; + $handler->display->display_options['fields']['block_edit']['alter']['text'] = '
  • Edit block [bid]
  • '; + $handler->display->display_options['fields']['block_edit']['hide_empty'] = TRUE; + } + if ($redirect) { + /* Field: Broken links: Create redirect */ + $handler->display->display_options['fields']['redirect_add']['id'] = 'redirect_add'; + $handler->display->display_options['fields']['redirect_add']['table'] = 'linkchecker_link'; + $handler->display->display_options['fields']['redirect_add']['field'] = 'redirect_add'; + $handler->display->display_options['fields']['redirect_add']['exclude'] = TRUE; + $handler->display->display_options['fields']['redirect_add']['alter']['alter_text'] = TRUE; + $handler->display->display_options['fields']['redirect_add']['alter']['text'] = '
  • Create redirect
  • '; + $handler->display->display_options['fields']['redirect_add']['hide_empty'] = TRUE; + } + /* 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'] = '"; + $nothing_translatable = $handler->display->display_options['fields']['nothing']['alter']['text']; + $handler->display->display_options['fields']['nothing']['hide_empty'] = TRUE; + $handler->display->display_options['fields']['nothing']['hide_alter_empty'] = TRUE; + /* 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']['id'] = 'code'; + $handler->display->display_options['filters']['code']['table'] = 'linkchecker_link'; + $handler->display->display_options['filters']['code']['field'] = 'code'; + $handler->display->display_options['filters']['code']['operator'] = 'not in'; + $handler->display->display_options['filters']['code']['value'] = array( + 200 => '200', + 206 => '206', + 302 => '302', + 304 => '304', + 401 => '401', + 403 => '403', + ); + $handler->display->display_options['filters']['code']['group'] = 1; + /* 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'] = 1; + /* 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'] = 1; + + /* Display: Admin Broken links */ + $handler = $view->new_display('page', 'Admin Broken links', 'linkchecker_admin_report_page'); + $handler->display->display_options['display_description'] = 'Shows a list of broken links in content.'; + $handler->display->display_options['defaults']['hide_admin_links'] = FALSE; + $handler->display->display_options['path'] = 'admin/reports/linkchecker2'; + $handler->display->display_options['menu']['type'] = 'normal'; + $handler->display->display_options['menu']['title'] = 'Broken links 2'; + $handler->display->display_options['menu']['description'] = 'Shows a list of broken links in content.'; + $handler->display->display_options['menu']['weight'] = '0'; + $handler->display->display_options['menu']['name'] = 'management'; + $handler->display->display_options['menu']['context'] = 0; + + /* Display: User Broken links */ + $handler = $view->new_display('page', 'User Broken links', 'linkchecker_user_report_page'); + $handler->display->display_options['display_description'] = 'Shows a list of broken links in authors content.'; + $handler->display->display_options['defaults']['hide_admin_links'] = FALSE; + $handler->display->display_options['defaults']['arguments'] = FALSE; + $handler->display->display_options['path'] = 'user/%user/linkchecker2'; + $handler->display->display_options['menu']['type'] = 'tab'; + $handler->display->display_options['menu']['title'] = 'Broken links 2'; + $handler->display->display_options['menu']['description'] = 'Shows a list of broken links in authors content.'; + $handler->display->display_options['menu']['weight'] = '3'; + $handler->display->display_options['menu']['name'] = 'user-menu'; + $handler->display->display_options['menu']['context'] = 0; + $translatables['linkchecker_reports'] = array( + t('Defaults'), + t('Broken links'), + t('more'), + t('Apply'), + t('Reset'), + t('Sort by'), + t('Asc'), + t('Desc'), + t('Items per page'), + t('- All -'), + t('Offset'), + t('« first'), + t('‹ previous'), + t('next ›'), + t('last »'), + t('No broken links have been found.'), + t('Node'), + t('URL'), + t('Response'), + t('.'), + t('Error'), + t('Edit link settings'), + t('
  • Edit link settings
  • '), + t('Nid'), + t('Edit node'), + t('
  • Edit node [nid]
  • '), + t('Operations'), + t($nothing_translatable), + t('Admin Broken links'), + t('Shows a list of broken links in content.'), + t('User Broken links'), + t('Shows a list of broken links in authors content.'), + ); + + if ($comment) { + $translatables['linkchecker_reports'] += array( + t('Comment'), + t('ID'), + t('Edit link'), + t('
  • Edit comment [cid]
  • '), + ); + } + if ($block) { + $translatables['linkchecker_reports'] += array( + t('Block ID'), + t('Edit block'), + t('
  • Edit block [bid]
  • '), + ); + } + if ($redirect) { + $translatables['linkchecker_reports'] += array( + t('Create redirect'), + t('
  • Create redirect
  • '), + ); + } + + $export['linkchecker_reports'] = $view; + + return $export; +} diff --git a/views/plugins/linkchecker_plugin_access.inc b/views/plugins/linkchecker_plugin_access.inc new file mode 100644 index 0000000..8cc48da --- /dev/null +++ b/views/plugins/linkchecker_plugin_access.inc @@ -0,0 +1,36 @@ +