mirror of
https://github.com/silverstripe/silverstripe-cms
synced 2024-10-22 08:05:56 +02:00
89 lines
3.0 KiB
PHP
89 lines
3.0 KiB
PHP
|
<?php
|
||
|
|
||
|
/**
|
||
|
* Content side-report listing pages with broken links
|
||
|
* @package cms
|
||
|
* @subpackage content
|
||
|
*/
|
||
|
|
||
|
class BrokenLinksReport extends SS_Report {
|
||
|
function title() {
|
||
|
return _t('BrokenLinksReport.BROKENLINKS',"Pages with broken links");
|
||
|
}
|
||
|
function sourceRecords($params = null) {
|
||
|
// Get class names for page types that are not virtual pages or redirector pages
|
||
|
$classes = array_diff(ClassInfo::subclassesFor('SiteTree'), ClassInfo::subclassesFor('VirtualPage'), ClassInfo::subclassesFor('RedirectorPage'));
|
||
|
$classNames = "'".join("','", $classes)."'";
|
||
|
|
||
|
if (isset($_REQUEST['OnLive'])) $ret = Versioned::get_by_stage('SiteTree', 'Live', "ClassName IN ($classNames) AND (HasBrokenLink = 1 OR HasBrokenFile = 1)");
|
||
|
else $ret = DataObject::get('SiteTree', "ClassName IN ($classNames) AND (HasBrokenFile = 1 OR HasBrokenLink = 1)");
|
||
|
|
||
|
$returnSet = new DataObjectSet();
|
||
|
if ($ret) foreach($ret as $record) {
|
||
|
$reason = false;
|
||
|
$isRedirectorPage = in_array($record->ClassName, ClassInfo::subclassesFor('RedirectorPage'));
|
||
|
$isVirtualPage = in_array($record->ClassName, ClassInfo::subclassesFor('VirtualPage'));
|
||
|
|
||
|
if ($isVirtualPage) {
|
||
|
if ($record->HasBrokenLink) {
|
||
|
$reason = "redirector page pointing to non-existant page";
|
||
|
$reasonCodes = array("VPBROKENLINK");
|
||
|
}
|
||
|
} else if ($isRedirectorPage) {
|
||
|
if ($record->HasBrokenLink) {
|
||
|
$reason = "redirector page pointing to non-existant page";
|
||
|
$reasonCodes = array("RPBROKENLINK");
|
||
|
}
|
||
|
} else {
|
||
|
if ($record->HasBrokenLink && $record->HasBrokenFile) {
|
||
|
$reason = "has broken link and file";
|
||
|
$reasonCodes = array("BROKENFILE", "BROKENLINK");
|
||
|
} else if ($record->HasBrokenLink && !$record->HasBrokenFile) {
|
||
|
$reason = "has broken link";
|
||
|
$reasonCodes = array("BROKENLINK");
|
||
|
} else if (!$record->HasBrokenLink && $record->HasBrokenFile) {
|
||
|
$reason = "has broken file";
|
||
|
$reasonCodes = array("BROKENFILE");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ($reason) {
|
||
|
if ($params['Reason'] && !in_array($params['Reason'], $reasonCodes)) continue;
|
||
|
$record->BrokenReason = $reason;
|
||
|
$returnSet->push($record);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $returnSet;
|
||
|
}
|
||
|
function columns() {
|
||
|
$fields = array(
|
||
|
"Title" => array(
|
||
|
"title" => "Title",
|
||
|
'formatting' => '<a href=\"admin/show/$ID\" title=\"Edit page\">$value</a>'
|
||
|
),
|
||
|
"BrokenReason" => array(
|
||
|
"title" => "Reason"
|
||
|
),
|
||
|
'AbsoluteLink' => array(
|
||
|
'title' => 'Links',
|
||
|
'formatting' => '$value " . ($AbsoluteLiveLink ? "<a href=\"$AbsoluteLiveLink\">(live)</a>" : "") . " <a href=\"$value?stage=Stage\">(draft)</a>'
|
||
|
)
|
||
|
);
|
||
|
|
||
|
return $fields;
|
||
|
}
|
||
|
function parameterFields() {
|
||
|
return new FieldSet(
|
||
|
new CheckboxField('OnLive', 'Check live site'),
|
||
|
new DropdownField('Reason', 'Problem to check', array(
|
||
|
'' => 'Any',
|
||
|
'BROKENFILE' => 'Broken file',
|
||
|
'BROKENLINK' => 'Broken link',
|
||
|
'VPBROKENLINK' => 'Virtual page pointing to invalid source',
|
||
|
'RPBROKENLINK' => 'Redirector page pointing to invalid destination',
|
||
|
))
|
||
|
);
|
||
|
}
|
||
|
}
|