From fa0b559a7b495c4e959f90555cca4230aa28efe7 Mon Sep 17 00:00:00 2001
From: Damian Mooyman
Date: Wed, 20 Sep 2017 13:51:07 +1200
Subject: [PATCH] Update usages of ClassInfo Add missing unit tests for
SiteTreeFolderExtension
---
code/Controllers/CMSMain.php | 4 +-
code/Controllers/CMSPageAddController.php | 2 +-
code/Controllers/CMSSiteTreeFilter.php | 4 +-
.../CMSSiteTreeFilter_ChangedPages.php | 3 +-
.../CMSSiteTreeFilter_DeletedPages.php | 3 +-
.../CMSSiteTreeFilter_PublishedPages.php | 2 +-
code/Controllers/CMSSiteTreeFilter_Search.php | 3 +-
.../CMSSiteTreeFilter_StatusDeletedPages.php | 2 +-
.../CMSSiteTreeFilter_StatusDraftPages.php | 2 +-
...TreeFilter_StatusRemovedFromDraftPages.php | 2 +-
code/Controllers/ContentController.php | 2 +-
.../LeftAndMainPageIconsExtension.php | 3 +-
code/Controllers/ModelAsController.php | 2 +-
code/Controllers/SilverStripeNavigator.php | 4 +-
code/Model/SiteTree.php | 11 +--
code/Model/SiteTreeFileExtension.php | 7 +-
code/Model/SiteTreeFolderExtension.php | 78 +++++++++++--------
code/Model/SiteTreeLinkTracking_Parser.php | 2 +-
code/Model/VirtualPage.php | 5 +-
code/Reports/BrokenFilesReport.php | 13 ++--
code/Reports/BrokenLinksReport.php | 53 ++++++-------
code/Reports/BrokenRedirectorPagesReport.php | 6 +-
code/Reports/BrokenVirtualPagesReport.php | 6 +-
code/Tasks/MigrateSiteTreeLinkingTask.php | 9 ++-
code/Tasks/RemoveOrphanedPagesTask.php | 4 +-
.../php/Model/SiteTreeFolderExtensionTest.php | 62 +++++++++++++++
.../php/Model/SiteTreeFolderExtensionTest.yml | 28 +++++++
.../PageWithFile.php | 24 ++++++
28 files changed, 241 insertions(+), 105 deletions(-)
create mode 100644 tests/php/Model/SiteTreeFolderExtensionTest.php
create mode 100644 tests/php/Model/SiteTreeFolderExtensionTest.yml
create mode 100644 tests/php/Model/SiteTreeFolderExtensionTest/PageWithFile.php
diff --git a/code/Controllers/CMSMain.php b/code/Controllers/CMSMain.php
index ae804f4e..8b7e6525 100644
--- a/code/Controllers/CMSMain.php
+++ b/code/Controllers/CMSMain.php
@@ -159,7 +159,7 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
{
// set reading lang
if (SiteTree::has_extension('Translatable') && !$this->getRequest()->isAjax()) {
- Translatable::choose_site_locale(array_keys(Translatable::get_existing_content_languages('SilverStripe\\CMS\\Model\\SiteTree')));
+ Translatable::choose_site_locale(array_keys(Translatable::get_existing_content_languages(SiteTree::class)));
}
parent::init();
@@ -1734,7 +1734,7 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
}
/** @var SiteTree $record */
- $record = Versioned::get_one_by_stage('SilverStripe\\CMS\\Model\\SiteTree', 'Live', array(
+ $record = Versioned::get_one_by_stage(SiteTree::class, Versioned::LIVE, array(
'"SiteTree_Live"."ID"' => $id
));
diff --git a/code/Controllers/CMSPageAddController.php b/code/Controllers/CMSPageAddController.php
index fbe893d2..1a529e53 100644
--- a/code/Controllers/CMSPageAddController.php
+++ b/code/Controllers/CMSPageAddController.php
@@ -76,7 +76,7 @@ class CMSPageAddController extends CMSPageEditController
$parentField = new TreeDropdownField(
"ParentID",
"",
- 'SilverStripe\\CMS\\Model\\SiteTree',
+ SiteTree::class,
'ID',
'TreeTitle'
),
diff --git a/code/Controllers/CMSSiteTreeFilter.php b/code/Controllers/CMSSiteTreeFilter.php
index 3e43e78d..e22c0a92 100644
--- a/code/Controllers/CMSSiteTreeFilter.php
+++ b/code/Controllers/CMSSiteTreeFilter.php
@@ -74,7 +74,7 @@ abstract class CMSSiteTreeFilter implements LeftAndMain_SearchFilter
public static function get_all_filters()
{
// get all filter instances
- $filters = ClassInfo::subclassesFor('SilverStripe\\CMS\\Controllers\\CMSSiteTreeFilter');
+ $filters = ClassInfo::subclassesFor(CMSSiteTreeFilter::class);
// remove abstract CMSSiteTreeFilter class
array_shift($filters);
@@ -162,7 +162,7 @@ abstract class CMSSiteTreeFilter implements LeftAndMain_SearchFilter
}
while (!empty($parents)) {
- $q = Versioned::get_including_deleted('SilverStripe\\CMS\\Model\\SiteTree', '"RecordID" in ('.implode(',', array_keys($parents)).')');
+ $q = Versioned::get_including_deleted(SiteTree::class, '"RecordID" in ('.implode(',', array_keys($parents)).')');
$list = $q->map('ID', 'ParentID');
$parents = array();
foreach ($list as $id => $parentID) {
diff --git a/code/Controllers/CMSSiteTreeFilter_ChangedPages.php b/code/Controllers/CMSSiteTreeFilter_ChangedPages.php
index 8fea3517..c37d506d 100644
--- a/code/Controllers/CMSSiteTreeFilter_ChangedPages.php
+++ b/code/Controllers/CMSSiteTreeFilter_ChangedPages.php
@@ -2,6 +2,7 @@
namespace SilverStripe\CMS\Controllers;
+use SilverStripe\CMS\Model\SiteTree;
use SilverStripe\Versioned\Versioned;
/**
@@ -17,7 +18,7 @@ class CMSSiteTreeFilter_ChangedPages extends CMSSiteTreeFilter
public function getFilteredPages()
{
- $pages = Versioned::get_by_stage('SilverStripe\\CMS\\Model\\SiteTree', 'Stage');
+ $pages = Versioned::get_by_stage(SiteTree::class, Versioned::DRAFT);
$pages = $this->applyDefaultFilters($pages)
->leftJoin('SiteTree_Live', '"SiteTree_Live"."ID" = "SiteTree"."ID"')
->where('"SiteTree"."Version" <> "SiteTree_Live"."Version"');
diff --git a/code/Controllers/CMSSiteTreeFilter_DeletedPages.php b/code/Controllers/CMSSiteTreeFilter_DeletedPages.php
index 0e315587..6fb94e94 100644
--- a/code/Controllers/CMSSiteTreeFilter_DeletedPages.php
+++ b/code/Controllers/CMSSiteTreeFilter_DeletedPages.php
@@ -2,6 +2,7 @@
namespace SilverStripe\CMS\Controllers;
+use SilverStripe\CMS\Model\SiteTree;
use SilverStripe\Versioned\Versioned;
/**
@@ -29,7 +30,7 @@ class CMSSiteTreeFilter_DeletedPages extends CMSSiteTreeFilter
public function getFilteredPages()
{
- $pages = Versioned::get_including_deleted('SilverStripe\\CMS\\Model\\SiteTree');
+ $pages = Versioned::get_including_deleted(SiteTree::class);
$pages = $this->applyDefaultFilters($pages);
return $pages;
}
diff --git a/code/Controllers/CMSSiteTreeFilter_PublishedPages.php b/code/Controllers/CMSSiteTreeFilter_PublishedPages.php
index eab67a0e..2efea77b 100644
--- a/code/Controllers/CMSSiteTreeFilter_PublishedPages.php
+++ b/code/Controllers/CMSSiteTreeFilter_PublishedPages.php
@@ -41,7 +41,7 @@ class CMSSiteTreeFilter_PublishedPages extends CMSSiteTreeFilter
*/
public function getFilteredPages()
{
- $pages = Versioned::get_including_deleted('SilverStripe\\CMS\\Model\\SiteTree');
+ $pages = Versioned::get_including_deleted(SiteTree::class);
$pages = $this->applyDefaultFilters($pages);
$pages = $pages->filterByCallback(function (SiteTree $page) {
return $page->isPublished();
diff --git a/code/Controllers/CMSSiteTreeFilter_Search.php b/code/Controllers/CMSSiteTreeFilter_Search.php
index abc3975f..f36ee187 100644
--- a/code/Controllers/CMSSiteTreeFilter_Search.php
+++ b/code/Controllers/CMSSiteTreeFilter_Search.php
@@ -1,6 +1,7 @@
applyDefaultFilters($pages);
return $pages;
}
diff --git a/code/Controllers/CMSSiteTreeFilter_StatusDeletedPages.php b/code/Controllers/CMSSiteTreeFilter_StatusDeletedPages.php
index 1a46eda5..f83732df 100644
--- a/code/Controllers/CMSSiteTreeFilter_StatusDeletedPages.php
+++ b/code/Controllers/CMSSiteTreeFilter_StatusDeletedPages.php
@@ -35,7 +35,7 @@ class CMSSiteTreeFilter_StatusDeletedPages extends CMSSiteTreeFilter
*/
public function getFilteredPages()
{
- $pages = Versioned::get_including_deleted('SilverStripe\\CMS\\Model\\SiteTree');
+ $pages = Versioned::get_including_deleted(SiteTree::class);
$pages = $this->applyDefaultFilters($pages);
$pages = $pages->filterByCallback(function (SiteTree $page) {
diff --git a/code/Controllers/CMSSiteTreeFilter_StatusDraftPages.php b/code/Controllers/CMSSiteTreeFilter_StatusDraftPages.php
index a8f9b736..0279f380 100644
--- a/code/Controllers/CMSSiteTreeFilter_StatusDraftPages.php
+++ b/code/Controllers/CMSSiteTreeFilter_StatusDraftPages.php
@@ -25,7 +25,7 @@ class CMSSiteTreeFilter_StatusDraftPages extends CMSSiteTreeFilter
*/
public function getFilteredPages()
{
- $pages = Versioned::get_by_stage('SilverStripe\\CMS\\Model\\SiteTree', 'Stage');
+ $pages = Versioned::get_by_stage(SiteTree::class, 'Stage');
$pages = $this->applyDefaultFilters($pages);
$pages = $pages->filterByCallback(function (SiteTree $page) {
// If page exists on stage but not on live
diff --git a/code/Controllers/CMSSiteTreeFilter_StatusRemovedFromDraftPages.php b/code/Controllers/CMSSiteTreeFilter_StatusRemovedFromDraftPages.php
index c9f11abe..41afb042 100644
--- a/code/Controllers/CMSSiteTreeFilter_StatusRemovedFromDraftPages.php
+++ b/code/Controllers/CMSSiteTreeFilter_StatusRemovedFromDraftPages.php
@@ -24,7 +24,7 @@ class CMSSiteTreeFilter_StatusRemovedFromDraftPages extends CMSSiteTreeFilter
*/
public function getFilteredPages()
{
- $pages = Versioned::get_including_deleted('SilverStripe\\CMS\\Model\\SiteTree');
+ $pages = Versioned::get_including_deleted(SiteTree::class);
$pages = $this->applyDefaultFilters($pages);
$pages = $pages->filterByCallback(function (SiteTree $page) {
// If page is removed from stage but not live
diff --git a/code/Controllers/ContentController.php b/code/Controllers/ContentController.php
index 7467a71d..d1ff25b3 100644
--- a/code/Controllers/ContentController.php
+++ b/code/Controllers/ContentController.php
@@ -108,7 +108,7 @@ class ContentController extends Controller
$parent = SiteTree::get_by_link($parentRef);
if (!$parent && is_numeric($parentRef)) {
- $parent = DataObject::get_by_id('SilverStripe\\CMS\\Model\\SiteTree', $parentRef);
+ $parent = DataObject::get_by_id(SiteTree::class, $parentRef);
}
if ($parent) {
diff --git a/code/Controllers/LeftAndMainPageIconsExtension.php b/code/Controllers/LeftAndMainPageIconsExtension.php
index 6e8cbf89..7044c2e3 100644
--- a/code/Controllers/LeftAndMainPageIconsExtension.php
+++ b/code/Controllers/LeftAndMainPageIconsExtension.php
@@ -2,6 +2,7 @@
namespace SilverStripe\CMS\Controllers;
+use SilverStripe\CMS\Model\SiteTree;
use SilverStripe\Core\Convert;
use SilverStripe\View\Requirements;
use SilverStripe\Core\ClassInfo;
@@ -29,7 +30,7 @@ class LeftAndMainPageIconsExtension extends Extension
{
$css = '';
- $classes = ClassInfo::subclassesFor('SilverStripe\\CMS\\Model\\SiteTree');
+ $classes = ClassInfo::subclassesFor(SiteTree::class);
foreach ($classes as $class) {
$obj = singleton($class);
$iconSpec = $obj->config()->get('icon');
diff --git a/code/Controllers/ModelAsController.php b/code/Controllers/ModelAsController.php
index 742f3ddc..bd828ae2 100644
--- a/code/Controllers/ModelAsController.php
+++ b/code/Controllers/ModelAsController.php
@@ -49,7 +49,7 @@ class ModelAsController extends Controller implements NestedController
protected function init()
{
- singleton('SilverStripe\\CMS\\Model\\SiteTree')->extend('modelascontrollerInit', $this);
+ singleton(SiteTree::class)->extend('modelascontrollerInit', $this);
parent::init();
}
diff --git a/code/Controllers/SilverStripeNavigator.php b/code/Controllers/SilverStripeNavigator.php
index 6de775b5..a71fc288 100644
--- a/code/Controllers/SilverStripeNavigator.php
+++ b/code/Controllers/SilverStripeNavigator.php
@@ -43,8 +43,8 @@ class SilverStripeNavigator extends ViewableData
{
$items = array();
- $classes = ClassInfo::subclassesFor('SilverStripe\\CMS\\Controllers\\SilverStripeNavigatorItem');
- unset($classes['SilverStripe\\CMS\\Controllers\\SilverStripeNavigatorItem']);
+ $classes = ClassInfo::subclassesFor(SilverStripeNavigatorItem::class);
+ array_shift($classes);
// Sort menu items according to priority
foreach ($classes as $class) {
diff --git a/code/Model/SiteTree.php b/code/Model/SiteTree.php
index 818de5ff..49d2c3ad 100755
--- a/code/Model/SiteTree.php
+++ b/code/Model/SiteTree.php
@@ -2488,17 +2488,18 @@ class SiteTree extends DataObject implements PermissionProvider, i18nEntityProvi
// Parse candidate list
$allowedChildren = [];
- foreach ($candidates as $candidate) {
+ foreach ((array)$candidates as $candidate) {
// If a classname is prefixed by "*", such as "*Page", then only that class is allowed - no subclasses.
// Otherwise, the class and all its subclasses are allowed.
if (substr($candidate, 0, 1) == '*') {
$allowedChildren[] = substr($candidate, 1);
- } elseif ($subclasses = ClassInfo::subclassesFor($candidate)) {
+ } elseif (($candidate !== 'SiteTree_root')
+ && ($subclasses = ClassInfo::subclassesFor($candidate))
+ ) {
foreach ($subclasses as $subclass) {
- if ($subclass == 'SiteTree_root' || singleton($subclass) instanceof HiddenClass) {
- continue;
+ if (!is_a($subclass, HiddenClass::class, true)) {
+ $allowedChildren[] = $subclass;
}
- $allowedChildren[] = $subclass;
}
}
static::$_allowedChildren[get_class($this)] = $allowedChildren;
diff --git a/code/Model/SiteTreeFileExtension.php b/code/Model/SiteTreeFileExtension.php
index 57731896..9e208992 100644
--- a/code/Model/SiteTreeFileExtension.php
+++ b/code/Model/SiteTreeFileExtension.php
@@ -3,11 +3,9 @@
namespace SilverStripe\CMS\Model;
use SilverStripe\Assets\File;
-use SilverStripe\Core\Convert;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\ReadonlyField;
use SilverStripe\ORM\DataExtension;
-use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\ManyManyList;
use SilverStripe\Versioned\Versioned;
use SilverStripe\View\SSViewer;
@@ -25,9 +23,8 @@ use Subsite;
*/
class SiteTreeFileExtension extends DataExtension
{
-
private static $belongs_many_many = array(
- 'BackLinkTracking' => 'SilverStripe\\CMS\\Model\\SiteTree.ImageTracking' // {@see SiteTreeLinkTracking}
+ 'BackLinkTracking' => SiteTree::class . '.ImageTracking' // {@see SiteTreeLinkTracking}
);
/**
@@ -122,7 +119,7 @@ class SiteTreeFileExtension extends DataExtension
$brokenPageIDs = $this->owner->BackLinkTracking()->column("ID");
if ($brokenPageIDs) {
// This will syncLinkTracking on the same stage as this file
- $brokenPages = DataObject::get('SilverStripe\\CMS\\Model\\SiteTree')->byIDs($brokenPageIDs);
+ $brokenPages = SiteTree::get()->byIDs($brokenPageIDs);
foreach ($brokenPages as $brokenPage) {
$brokenPage->write();
}
diff --git a/code/Model/SiteTreeFolderExtension.php b/code/Model/SiteTreeFolderExtension.php
index 59264b86..a119ea3d 100644
--- a/code/Model/SiteTreeFolderExtension.php
+++ b/code/Model/SiteTreeFolderExtension.php
@@ -2,61 +2,73 @@
namespace SilverStripe\CMS\Model;
+use SilverStripe\Assets\File;
+use SilverStripe\Assets\Folder;
use SilverStripe\Core\ClassInfo;
-use SilverStripe\ORM\DB;
-use SilverStripe\ORM\DataQuery;
-use SilverStripe\ORM\DataList;
+use SilverStripe\Core\Config\Config;
+use SilverStripe\Core\Convert;
+use SilverStripe\ORM\ArrayList;
use SilverStripe\ORM\DataExtension;
+use SilverStripe\ORM\DataList;
+use SilverStripe\ORM\DataObject;
+use SilverStripe\ORM\DB;
-/**
- * @todo Cleanup, refactor, test this class
- */
class SiteTreeFolderExtension extends DataExtension
{
-
/**
* Looks for files used in system and create where clause which contains all ID's of files.
*
- * @returns String where clause which will work as filter.
+ * @returns string where clause which will work as filter.
*/
public function getUnusedFilesListFilter()
{
- $result = DB::query("SELECT DISTINCT \"FileID\" FROM \"SiteTree_ImageTracking\"");
- $usedFiles = array();
- $where = '';
- $classes = ClassInfo::subclassesFor('SilverStripe\\CMS\\Model\\SiteTree');
+ // Add all records in link tracking
+ $usedFiles = DB::query("SELECT DISTINCT \"FileID\" FROM \"SiteTree_ImageTracking\"")->column('FileID');
- if ($result->numRecords() > 0) {
- while ($nextResult = $result->next()) {
- $where .= $nextResult['FileID'] . ',';
- }
- }
+ // Get all classes that aren't folder
+ $fileClasses = array_diff_key(
+ ClassInfo::subclassesFor(File::class),
+ ClassInfo::subclassesFor(Folder::class)
+ );
+ // Search on a class-by-class basis
+ $classes = ClassInfo::subclassesFor(SiteTree::class);
+
+ $schema = DataObject::getSchema();
foreach ($classes as $className) {
- $query = new DataQuery($className);
- $ids = $query->execute()->column();
- if (!count($ids)) {
+ // Build query based on all direct has_ones on this class
+ $hasOnes = Config::inst()->get($className, 'has_one', Config::UNINHERITED);
+ if (empty($hasOnes)) {
continue;
}
-
- foreach (singleton($className)->hasOne() as $relName => $joinClass) {
- if ($joinClass == 'SilverStripe\\Assets\\Image' || $joinClass == 'SilverStripe\\Assets\\File') {
- $fieldName = $relName .'ID';
- $query = DataList::create($className)->where("$fieldName > 0");
- $query->distinct = true;
- $query->select(array($fieldName));
- $usedFiles = array_merge($usedFiles, $query->execute()->column());
- } elseif ($joinClass == 'SilverStripe\\Assets\\Folder') {
- // @todo
+ $where = [];
+ $columns = [];
+ foreach ($hasOnes as $relName => $joinClass) {
+ if (in_array($joinClass, $fileClasses)) {
+ $column = $relName . 'ID';
+ $columns[] = $column;
+ $quotedColumn = $schema->sqlColumnForField($className, $column);
+ $where[] = "{$quotedColumn} > 0";
}
}
+
+ // Get all records with any file ID in the searched columns
+ $recordsArray = DataList::create($className)->whereAny($where)->toArray();
+ $records = ArrayList::create($recordsArray);
+ foreach ($columns as $column) {
+ $usedFiles = array_unique(array_merge($usedFiles, $records->column($column)));
+ }
}
+ // Create filter based on class and id
+ $classFilter = sprintf(
+ "(\"File\".\"ClassName\" IN (%s))",
+ implode(", ", Convert::raw2sql($fileClasses, true))
+ );
if ($usedFiles) {
- return "\"File\".\"ID\" NOT IN (" . implode(', ', $usedFiles) . ") AND (\"ClassName\" = 'File' OR \"ClassName\" = 'Image')";
+ return "\"File\".\"ID\" NOT IN (" . implode(', ', $usedFiles) . ") AND $classFilter";
} else {
- return "(\"ClassName\" = 'File' OR \"ClassName\" = 'Image')";
+ return $classFilter;
}
- return $where; // @todo - How?
}
}
diff --git a/code/Model/SiteTreeLinkTracking_Parser.php b/code/Model/SiteTreeLinkTracking_Parser.php
index 9b081950..7066ad7f 100644
--- a/code/Model/SiteTreeLinkTracking_Parser.php
+++ b/code/Model/SiteTreeLinkTracking_Parser.php
@@ -56,7 +56,7 @@ class SiteTreeLinkTracking_Parser
// Link to a page on this site.
$matches = array();
if (preg_match('/\[sitetree_link(?:\s*|%20|,)?id=(?[0-9]+)\](#(?.*))?/i', $href, $matches)) {
- $page = DataObject::get_by_id('SilverStripe\\CMS\\Model\\SiteTree', $matches['id']);
+ $page = DataObject::get_by_id(SiteTree::class, $matches['id']);
$broken = false;
if (!$page) {
diff --git a/code/Model/VirtualPage.php b/code/Model/VirtualPage.php
index b0389eb8..4757eadf 100644
--- a/code/Model/VirtualPage.php
+++ b/code/Model/VirtualPage.php
@@ -25,7 +25,6 @@ use Page;
*/
class VirtualPage extends Page
{
-
private static $description = 'Displays the content of another page';
public static $virtualFields;
@@ -114,7 +113,7 @@ class VirtualPage extends Page
public function setCopyContentFromID($val)
{
// Sanity check to prevent pages virtualising other virtual pages
- if ($val && DataObject::get_by_id('SilverStripe\\CMS\\Model\\SiteTree', $val) instanceof VirtualPage) {
+ if ($val && DataObject::get_by_id(SiteTree::class, $val) instanceof VirtualPage) {
$val = 0;
}
return $this->setField("CopyContentFromID", $val);
@@ -193,7 +192,7 @@ class VirtualPage extends Page
// Unpublished source
if (!Versioned::get_versionnumber_by_stage(
- 'SilverStripe\\CMS\\Model\\SiteTree',
+ SiteTree::class,
'Live',
$this->CopyContentFromID
)) {
diff --git a/code/Reports/BrokenFilesReport.php b/code/Reports/BrokenFilesReport.php
index 3d39129f..9aa03649 100644
--- a/code/Reports/BrokenFilesReport.php
+++ b/code/Reports/BrokenFilesReport.php
@@ -2,6 +2,9 @@
namespace SilverStripe\CMS\Reports;
+use SilverStripe\CMS\Model\RedirectorPage;
+use SilverStripe\CMS\Model\SiteTree;
+use SilverStripe\CMS\Model\VirtualPage;
use SilverStripe\Core\ClassInfo;
use SilverStripe\Forms\CheckboxField;
use SilverStripe\Forms\FieldList;
@@ -26,17 +29,17 @@ class BrokenFilesReport extends Report
{
// Get class names for page types that are not virtual pages or redirector pages
$classes = array_diff(
- ClassInfo::subclassesFor('SilverStripe\\CMS\\Model\\SiteTree'),
- ClassInfo::subclassesFor('SilverStripe\\CMS\\Model\\VirtualPage'),
- ClassInfo::subclassesFor('SilverStripe\\CMS\\Model\\RedirectorPage')
+ ClassInfo::subclassesFor(SiteTree::class),
+ ClassInfo::subclassesFor(VirtualPage::class),
+ ClassInfo::subclassesFor(RedirectorPage::class)
);
$classParams = DB::placeholders($classes);
$classFilter = array(
"\"ClassName\" IN ($classParams) AND \"HasBrokenFile\" = 1" => $classes
);
- $stage = isset($params['OnLive']) ? 'Live' : 'Stage';
- return Versioned::get_by_stage('SilverStripe\\CMS\\Model\\SiteTree', $stage, $classFilter);
+ $stage = isset($params['OnLive']) ? Versioned::LIVE : Versioned::DRAFT;
+ return Versioned::get_by_stage(SiteTree::class, $stage, $classFilter);
}
public function columns()
diff --git a/code/Reports/BrokenLinksReport.php b/code/Reports/BrokenLinksReport.php
index eed4ac0c..c9ca159b 100644
--- a/code/Reports/BrokenLinksReport.php
+++ b/code/Reports/BrokenLinksReport.php
@@ -3,7 +3,9 @@
namespace SilverStripe\CMS\Reports;
use SilverStripe\CMS\Controllers\CMSPageEditController;
+use SilverStripe\CMS\Model\RedirectorPage;
use SilverStripe\CMS\Model\SiteTree;
+use SilverStripe\CMS\Model\VirtualPage;
use SilverStripe\Control\Controller;
use SilverStripe\Core\ClassInfo;
use SilverStripe\Forms\DropdownField;
@@ -21,7 +23,7 @@ class BrokenLinksReport extends Report
public function title()
{
- return _t('SilverStripe\\CMS\\Reports\\BrokenLinksReport.BROKENLINKS', "Broken links report");
+ return _t(__CLASS__ . '.BROKENLINKS', "Broken links report");
}
public function sourceRecords($params, $sort, $limit)
@@ -47,38 +49,37 @@ class BrokenLinksReport extends Report
);
$isLive = !isset($params['CheckSite']) || $params['CheckSite'] == 'Published';
if ($isLive) {
- $ret = Versioned::get_by_stage('SilverStripe\\CMS\\Model\\SiteTree', 'Live', $brokenFilter, $sort, $join, $limit);
+ $ret = Versioned::get_by_stage(SiteTree::class, 'Live', $brokenFilter, $sort, $join, $limit);
} else {
- $ret = DataObject::get('SilverStripe\\CMS\\Model\\SiteTree', $brokenFilter, $sort, $join, $limit);
+ $ret = DataObject::get(SiteTree::class, $brokenFilter, $sort, $join, $limit);
}
$returnSet = new ArrayList();
if ($ret) {
foreach ($ret as $record) {
$reason = false;
- $isRedirectorPage = in_array($record->ClassName, ClassInfo::subclassesFor('SilverStripe\\CMS\\Model\\RedirectorPage'));
- $isVirtualPage = in_array($record->ClassName, ClassInfo::subclassesFor('SilverStripe\\CMS\\Model\\VirtualPage'));
-
+ $isRedirectorPage = $record instanceof RedirectorPage;
+ $isVirtualPage = $record instanceof VirtualPage;
$reasonCodes = [];
if ($isVirtualPage) {
if ($record->HasBrokenLink) {
- $reason = _t('SilverStripe\\CMS\\Reports\\BrokenLinksReport.VirtualPageNonExistent', "virtual page pointing to non-existent page");
+ $reason = _t(__CLASS__ . '.VirtualPageNonExistent', "virtual page pointing to non-existent page");
$reasonCodes = array("VPBROKENLINK");
}
} elseif ($isRedirectorPage) {
if ($record->HasBrokenLink) {
- $reason = _t('SilverStripe\\CMS\\Reports\\BrokenLinksReport.RedirectorNonExistent', "redirector page pointing to non-existent page");
+ $reason = _t(__CLASS__ . '.RedirectorNonExistent', "redirector page pointing to non-existent page");
$reasonCodes = array("RPBROKENLINK");
}
} else {
if ($record->HasBrokenLink && $record->HasBrokenFile) {
- $reason = _t('SilverStripe\\CMS\\Reports\\BrokenLinksReport.HasBrokenLinkAndFile', "has broken link and file");
+ $reason = _t(__CLASS__ . '.HasBrokenLinkAndFile', "has broken link and file");
$reasonCodes = array("BROKENFILE", "BROKENLINK");
} elseif ($record->HasBrokenLink && !$record->HasBrokenFile) {
- $reason = _t('SilverStripe\\CMS\\Reports\\BrokenLinksReport.HasBrokenLink', "has broken link");
+ $reason = _t(__CLASS__ . '.HasBrokenLink', "has broken link");
$reasonCodes = array("BROKENLINK");
} elseif (!$record->HasBrokenLink && $record->HasBrokenFile) {
- $reason = _t('SilverStripe\\CMS\\Reports\\BrokenLinksReport.HasBrokenFile', "has broken file");
+ $reason = _t(__CLASS__ . '.HasBrokenFile', "has broken file");
$reasonCodes = array("BROKENFILE");
}
}
@@ -102,20 +103,20 @@ class BrokenLinksReport extends Report
public function columns()
{
if (isset($_REQUEST['filters']['CheckSite']) && $_REQUEST['filters']['CheckSite'] == 'Draft') {
- $dateTitle = _t('SilverStripe\\CMS\\Reports\\BrokenLinksReport.ColumnDateLastModified', 'Date last modified');
+ $dateTitle = _t(__CLASS__ . '.ColumnDateLastModified', 'Date last modified');
} else {
- $dateTitle = _t('SilverStripe\\CMS\\Reports\\BrokenLinksReport.ColumnDateLastPublished', 'Date last published');
+ $dateTitle = _t(__CLASS__ . '.ColumnDateLastPublished', 'Date last published');
}
$linkBase = CMSPageEditController::singleton()->Link('show');
$fields = array(
"Title" => array(
- "title" => _t('SilverStripe\\CMS\\Reports\\BrokenLinksReport.PageName', 'Page name'),
+ "title" => _t(__CLASS__ . '.PageName', 'Page name'),
'formatting' => function ($value, $item) use ($linkBase) {
return sprintf(
'%s',
Controller::join_links($linkBase, $item->ID),
- _t('SilverStripe\\CMS\\Reports\\BrokenLinksReport.HoverTitleEditPage', 'Edit page'),
+ _t(__CLASS__ . '.HoverTitleEditPage', 'Edit page'),
$value
);
}
@@ -125,10 +126,10 @@ class BrokenLinksReport extends Report
'casting' => 'DBDatetime->Full'
),
"BrokenReason" => array(
- "title" => _t('SilverStripe\\CMS\\Reports\\BrokenLinksReport.ColumnProblemType', "Problem type")
+ "title" => _t(__CLASS__ . '.ColumnProblemType', "Problem type")
),
'AbsoluteLink' => array(
- 'title' => _t('SilverStripe\\CMS\\Reports\\BrokenLinksReport.ColumnURL', 'URL'),
+ 'title' => _t(__CLASS__ . '.ColumnURL', 'URL'),
'formatting' => function ($value, $item) {
/** @var SiteTree $item */
$liveLink = $item->AbsoluteLiveLink;
@@ -148,19 +149,19 @@ class BrokenLinksReport extends Report
public function parameterFields()
{
return new FieldList(
- new DropdownField('CheckSite', _t('SilverStripe\\CMS\\Reports\\BrokenLinksReport.CheckSite', 'Check site'), array(
- 'Published' => _t('SilverStripe\\CMS\\Reports\\BrokenLinksReport.CheckSiteDropdownPublished', 'Published Site'),
- 'Draft' => _t('SilverStripe\\CMS\\Reports\\BrokenLinksReport.CheckSiteDropdownDraft', 'Draft Site')
+ new DropdownField('CheckSite', _t(__CLASS__ . '.CheckSite', 'Check site'), array(
+ 'Published' => _t(__CLASS__ . '.CheckSiteDropdownPublished', 'Published Site'),
+ 'Draft' => _t(__CLASS__ . '.CheckSiteDropdownDraft', 'Draft Site')
)),
new DropdownField(
'Reason',
- _t('SilverStripe\\CMS\\Reports\\BrokenLinksReport.ReasonDropdown', 'Problem to check'),
+ _t(__CLASS__ . '.ReasonDropdown', 'Problem to check'),
array(
- '' => _t('SilverStripe\\CMS\\Reports\\BrokenLinksReport.Any', 'Any'),
- 'BROKENFILE' => _t('SilverStripe\\CMS\\Reports\\BrokenLinksReport.ReasonDropdownBROKENFILE', 'Broken file'),
- 'BROKENLINK' => _t('SilverStripe\\CMS\\Reports\\BrokenLinksReport.ReasonDropdownBROKENLINK', 'Broken link'),
- 'VPBROKENLINK' => _t('SilverStripe\\CMS\\Reports\\BrokenLinksReport.ReasonDropdownVPBROKENLINK', 'Virtual page pointing to non-existent page'),
- 'RPBROKENLINK' => _t('SilverStripe\\CMS\\Reports\\BrokenLinksReport.ReasonDropdownRPBROKENLINK', 'Redirector page pointing to non-existent page'),
+ '' => _t(__CLASS__ . '.Any', 'Any'),
+ 'BROKENFILE' => _t(__CLASS__ . '.ReasonDropdownBROKENFILE', 'Broken file'),
+ 'BROKENLINK' => _t(__CLASS__ . '.ReasonDropdownBROKENLINK', 'Broken link'),
+ 'VPBROKENLINK' => _t(__CLASS__ . '.ReasonDropdownVPBROKENLINK', 'Virtual page pointing to non-existent page'),
+ 'RPBROKENLINK' => _t(__CLASS__ . '.ReasonDropdownRPBROKENLINK', 'Redirector page pointing to non-existent page'),
)
)
);
diff --git a/code/Reports/BrokenRedirectorPagesReport.php b/code/Reports/BrokenRedirectorPagesReport.php
index ce75f67c..42ff9766 100644
--- a/code/Reports/BrokenRedirectorPagesReport.php
+++ b/code/Reports/BrokenRedirectorPagesReport.php
@@ -2,6 +2,8 @@
namespace SilverStripe\CMS\Reports;
+use SilverStripe\CMS\Model\RedirectorPage;
+use SilverStripe\CMS\Model\SiteTree;
use SilverStripe\Core\ClassInfo;
use SilverStripe\Forms\CheckboxField;
use SilverStripe\Forms\FieldList;
@@ -24,13 +26,13 @@ class BrokenRedirectorPagesReport extends Report
public function sourceRecords($params = null)
{
- $classes = ClassInfo::subclassesFor('SilverStripe\\CMS\\Model\\RedirectorPage');
+ $classes = ClassInfo::subclassesFor(RedirectorPage::class);
$classParams = DB::placeholders($classes);
$classFilter = array(
"\"ClassName\" IN ($classParams) AND \"HasBrokenLink\" = 1" => $classes
);
$stage = isset($params['OnLive']) ? 'Live' : 'Stage';
- return Versioned::get_by_stage('SilverStripe\\CMS\\Model\\SiteTree', $stage, $classFilter);
+ return Versioned::get_by_stage(SiteTree::class, $stage, $classFilter);
}
public function columns()
diff --git a/code/Reports/BrokenVirtualPagesReport.php b/code/Reports/BrokenVirtualPagesReport.php
index 917d6729..9863b4e4 100644
--- a/code/Reports/BrokenVirtualPagesReport.php
+++ b/code/Reports/BrokenVirtualPagesReport.php
@@ -2,6 +2,8 @@
namespace SilverStripe\CMS\Reports;
+use SilverStripe\CMS\Model\SiteTree;
+use SilverStripe\CMS\Model\VirtualPage;
use SilverStripe\Core\ClassInfo;
use SilverStripe\Forms\CheckboxField;
use SilverStripe\Forms\FieldList;
@@ -24,13 +26,13 @@ class BrokenVirtualPagesReport extends Report
public function sourceRecords($params = null)
{
- $classes = ClassInfo::subclassesFor('SilverStripe\\CMS\\Model\\VirtualPage');
+ $classes = ClassInfo::subclassesFor(VirtualPage::class);
$classParams = DB::placeholders($classes);
$classFilter = array(
"\"ClassName\" IN ($classParams) AND \"HasBrokenLink\" = 1" => $classes
);
$stage = isset($params['OnLive']) ? 'Live' : 'Stage';
- return Versioned::get_by_stage('SilverStripe\\CMS\\Model\\SiteTree', $stage, $classFilter);
+ return Versioned::get_by_stage(SiteTree::class, $stage, $classFilter);
}
public function columns()
diff --git a/code/Tasks/MigrateSiteTreeLinkingTask.php b/code/Tasks/MigrateSiteTreeLinkingTask.php
index e10bac96..0a3c220d 100644
--- a/code/Tasks/MigrateSiteTreeLinkingTask.php
+++ b/code/Tasks/MigrateSiteTreeLinkingTask.php
@@ -2,6 +2,7 @@
namespace SilverStripe\CMS\Tasks;
+use SilverStripe\CMS\Model\SiteTree;
use SilverStripe\Dev\BuildTask;
use SilverStripe\ORM\DataList;
use SilverStripe\ORM\DataObject;
@@ -24,7 +25,7 @@ class MigrateSiteTreeLinkingTask extends BuildTask
$pages = 0;
$links = 0;
- $linkedPages = new DataList('SilverStripe\\CMS\\Model\\SiteTree');
+ $linkedPages = new DataList(SiteTree::class);
$linkedPages = $linkedPages->innerJoin('SiteTree_LinkTracking', '"SiteTree_LinkTracking"."SiteTreeID" = "SiteTree"."ID"');
if ($linkedPages) {
foreach ($linkedPages as $page) {
@@ -34,7 +35,7 @@ class MigrateSiteTreeLinkingTask extends BuildTask
)->map();
foreach ($tracking as $childID => $fieldName) {
- $linked = DataObject::get_by_id('SilverStripe\\CMS\\Model\\SiteTree', $childID);
+ $linked = DataObject::get_by_id(SiteTree::class, $childID);
// TOOD: Replace in all HTMLText fields
$page->Content = preg_replace(
@@ -50,8 +51,8 @@ class MigrateSiteTreeLinkingTask extends BuildTask
}
}
- $page->write();
- $pages++;
+ $page->write();
+ $pages++;
}
}
diff --git a/code/Tasks/RemoveOrphanedPagesTask.php b/code/Tasks/RemoveOrphanedPagesTask.php
index 4b53bc0b..1a058c69 100644
--- a/code/Tasks/RemoveOrphanedPagesTask.php
+++ b/code/Tasks/RemoveOrphanedPagesTask.php
@@ -63,7 +63,7 @@ in the other stage:
";
- protected $orphanedSearchClass = 'SilverStripe\\CMS\\Model\\SiteTree';
+ protected $orphanedSearchClass = SiteTree::class;
protected function init()
{
@@ -341,7 +341,7 @@ in the other stage:
* @param int|array $limit
* @return SS_List
*/
- public function getOrphanedPages($class = 'SilverStripe\\CMS\\Model\\SiteTree', $filter = array(), $sort = null, $join = null, $limit = null)
+ public function getOrphanedPages($class = SiteTree::class, $filter = array(), $sort = null, $join = null, $limit = null)
{
// Alter condition
$table = DataObject::getSchema()->tableName($class);
diff --git a/tests/php/Model/SiteTreeFolderExtensionTest.php b/tests/php/Model/SiteTreeFolderExtensionTest.php
new file mode 100644
index 00000000..ac01c0ed
--- /dev/null
+++ b/tests/php/Model/SiteTreeFolderExtensionTest.php
@@ -0,0 +1,62 @@
+logInWithPermission('ADMIN');
+
+ // Since we can't hard-code IDs, manually inject image tracking shortcode
+ $imageID = $this->idFromFixture(Image::class, 'image1');
+ $page = $this->objFromFixture(PageWithFile::class, 'page1');
+ $page->Content = sprintf(
+ '[image id="%d"]
',
+ $imageID
+ );
+ $page->write();
+ }
+
+ public function tearDown()
+ {
+ TestAssetStore::reset();
+ parent::tearDown();
+ }
+
+ public function testFindsFiles()
+ {
+ /** @var PageWithFile $page */
+ $page = $this->objFromFixture(PageWithFile::class, 'page1');
+ $query = $page->getUnusedFilesListFilter();
+ $this->assertContains('"ID" NOT IN', $query);
+ $this->assertContains('"ClassName" IN (', $query);
+
+ $files = File::get()->where($query);
+ $this->assertDOSEquals(
+ [
+ ['Name' => 'file2.txt'],
+ ['Name' => 'image2.jpg'],
+ ],
+ $files
+ );
+ }
+}
diff --git a/tests/php/Model/SiteTreeFolderExtensionTest.yml b/tests/php/Model/SiteTreeFolderExtensionTest.yml
new file mode 100644
index 00000000..fa7605da
--- /dev/null
+++ b/tests/php/Model/SiteTreeFolderExtensionTest.yml
@@ -0,0 +1,28 @@
+SilverStripe\Assets\Folder:
+ folder1:
+ Name: myfolder
+ folder2:
+ Name: other
+SilverStripe\Assets\File:
+ file1:
+ Name: file1.txt
+ FileFilename: myfolder/file1.txt
+ Parent: =>SilverStripe\Assets\Folder.folder1
+ file2:
+ Name: file2.txt
+ FileFilename: myfolder/file2.txt
+ Parent: =>SilverStripe\Assets\Folder.folder1
+SilverStripe\Assets\Image:
+ image1:
+ Name: image1.jpg
+ FileFilename: other/image1.jpg
+ Parent: =>SilverStripe\Assets\Folder.folder2
+ image2:
+ Name: image2.jpg
+ FileFilename: other/image2.jpg
+ Parent: =>SilverStripe\Assets\Folder.folder2
+SilverStripe\CMS\Tests\Model\SiteTreeFolderExtensionTest\PageWithFile:
+ page1:
+ Title: mypage
+ URLSegment: mypage
+ LinkedFile: =>SilverStripe\Assets\File.file1
diff --git a/tests/php/Model/SiteTreeFolderExtensionTest/PageWithFile.php b/tests/php/Model/SiteTreeFolderExtensionTest/PageWithFile.php
new file mode 100644
index 00000000..1d6d845b
--- /dev/null
+++ b/tests/php/Model/SiteTreeFolderExtensionTest/PageWithFile.php
@@ -0,0 +1,24 @@
+ File::class,
+ ];
+
+ private static $extensions = [
+ SiteTreeFolderExtension::class,
+ ];
+}