mirror of
https://github.com/silverstripe/silverstripe-externallinks.git
synced 2024-10-22 17:05:44 +02:00
NEW: Start of external broken links module
This commit is contained in:
commit
d52503fcbd
34
README.md
Normal file
34
README.md
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
# External links
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
|
||||||
|
The external links module is a task and ModelAdmin to track and to report on broken external links.
|
||||||
|
|
||||||
|
## Maintainer Contact
|
||||||
|
|
||||||
|
* Kirk Mayo kirk (at) silverstripe (dot) com
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
* SilverStripe 3.0 +
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
* Add external links to broken links reports
|
||||||
|
* Add a model admin for external broken links
|
||||||
|
* Add a task to track external broken links
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
1. Download the module form GitHub (Composer support to be added)
|
||||||
|
2. Extract the file (if you are on windows try 7-zip for extracting tar.gz files
|
||||||
|
3. Make sure the folder after being extracted is named 'externallinks'
|
||||||
|
4. Place this directory in your sites root directory. This is the one with framework and cms in it.
|
||||||
|
5. Run in your browser - `/dev/build` to rebuild the database.
|
||||||
|
6. You should see a new menu called *Broken Ext. Links*
|
||||||
|
|
||||||
|
## Disable the Broken external link menu
|
||||||
|
|
||||||
|
To disable the *Broken Ext. Links* menu add the following code to mysite/_config.php
|
||||||
|
|
||||||
|
`CMSMenu::remove_menu_item('BrokenExternalLinksAdmin');`
|
1
_config.php
Normal file
1
_config.php
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?php
|
BIN
code/.BrokenExternalLinks.php.swp
Normal file
BIN
code/.BrokenExternalLinks.php.swp
Normal file
Binary file not shown.
44
code/BrokenExternalLinks.php
Normal file
44
code/BrokenExternalLinks.php
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
class BrokenExternalLinks extends DataObject {
|
||||||
|
|
||||||
|
private static $db = array(
|
||||||
|
'Link' => 'Varchar',
|
||||||
|
'HTTPCode' =>'Int'
|
||||||
|
);
|
||||||
|
|
||||||
|
private static $has_one = array(
|
||||||
|
'Page' => 'Page'
|
||||||
|
);
|
||||||
|
|
||||||
|
public static $summary_fields = array(
|
||||||
|
'Page.Title' => 'Page',
|
||||||
|
'HTTPCode' => 'HTTP Code',
|
||||||
|
'Created' => 'Created'
|
||||||
|
);
|
||||||
|
|
||||||
|
public static $searchable_fields = array(
|
||||||
|
'HTTPCode'
|
||||||
|
);
|
||||||
|
|
||||||
|
function canEdit($member = false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class BrokenExternalLinksAdmin extends ModelAdmin {
|
||||||
|
|
||||||
|
public static $url_segment = 'broken-external-links-admin';
|
||||||
|
|
||||||
|
public static $managed_models = array(
|
||||||
|
'BrokenExternalLinks'
|
||||||
|
);
|
||||||
|
|
||||||
|
public static $menu_title = 'Broken Ext. links';
|
||||||
|
|
||||||
|
public function init() {
|
||||||
|
parent::init();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
BIN
tasks/.CheckExternalLinks.php.swp
Normal file
BIN
tasks/.CheckExternalLinks.php.swp
Normal file
Binary file not shown.
66
tasks/CheckExternalLinks.php
Normal file
66
tasks/CheckExternalLinks.php
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
class CheckExternalLinks extends BuildTask {
|
||||||
|
protected $title = 'Checking broken External links in the SiteTree';
|
||||||
|
|
||||||
|
protected $description = 'A task that records external broken links in the SiteTree';
|
||||||
|
|
||||||
|
protected $enabled = true;
|
||||||
|
|
||||||
|
function run($request) {
|
||||||
|
// clear broken external link table
|
||||||
|
$table = 'BrokenExternalLinks';
|
||||||
|
if(method_exists(DB::getConn(), 'clearTable')) DB::getConn()->clearTable($table);
|
||||||
|
else DB::query("TRUNCATE \"$table\"");
|
||||||
|
$pages = SiteTree::get();
|
||||||
|
foreach ($pages as $page) {
|
||||||
|
$htmlValue = Injector::inst()->create('HTMLValue', $page->Content);
|
||||||
|
|
||||||
|
// Populate link tracking for internal links & links to asset files.
|
||||||
|
if($links = $htmlValue->getElementsByTagName('a')) foreach($links as $link) {
|
||||||
|
$href = Director::makeRelative($link->getAttribute('href'));
|
||||||
|
if ($href == 'admin/') continue;
|
||||||
|
|
||||||
|
// ignore SiteTree and assets links as they will be caught by SiteTreeLinkTracking
|
||||||
|
if(preg_match('/\[sitetree_link,id=([0-9]+)\]/i', $href, $matches)) {
|
||||||
|
return;
|
||||||
|
} else if(substr($href, 0, strlen(ASSETS_DIR) + 1) == ASSETS_DIR.'/') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if($href && function_exists('curl_init')) {
|
||||||
|
$handle = curl_init($href);
|
||||||
|
curl_setopt($handle, CURLOPT_RETURNTRANSFER, TRUE);
|
||||||
|
$response = curl_exec($handle);
|
||||||
|
$httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);
|
||||||
|
curl_close($handle);
|
||||||
|
if (($httpCode < 200 || $httpCode > 302)
|
||||||
|
|| ($href == '' || $href[0] == '/'))
|
||||||
|
{
|
||||||
|
$brokenLink = new BrokenExternalLinks();
|
||||||
|
$brokenLink->PageID = $page->ID;
|
||||||
|
$brokenLink->Link = $href;
|
||||||
|
$brokenLink->HTTPCode = $httpCode;
|
||||||
|
$brokenLink->write();
|
||||||
|
|
||||||
|
// set the broken link class
|
||||||
|
/*
|
||||||
|
$class = $link->getAttribute('class');
|
||||||
|
$class = ($class) ? $class . 'ss-broken' : 'ss-broken';
|
||||||
|
$link->setAttribute('class', ($class ? "$class ss-broken" : 'ss-broken'));
|
||||||
|
*/
|
||||||
|
|
||||||
|
// use raw sql query to set broken link as calling the dataobject write
|
||||||
|
// method will reset the links if no broken internal links are found
|
||||||
|
$query = 'UPDATE SiteTree SET HasBrokenLink = 1 ';
|
||||||
|
$query .= 'WHERE ID = ' . (int)$page->ID;
|
||||||
|
$result = DB::query($query);
|
||||||
|
if (!$result) {
|
||||||
|
// error updating hasBrokenLink
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user