diff --git a/code/FolderUnusedAssetsField.php b/code/FolderUnusedAssetsField.php new file mode 100644 index 00000000..0d2b430a --- /dev/null +++ b/code/FolderUnusedAssetsField.php @@ -0,0 +1,61 @@ +folder = $folder; + parent::__construct(new FieldSet()); + } + + public function getChildren() { + if($this->children->Count() == 0) { + $inlineFormAction = new InlineFormAction("delete_unused_thumbnails", _t('Folder.DELETEUNUSEDTHUMBNAILS', 'Delete unused thumbnails')); + $inlineFormAction->includeDefaultJS(false) ; + + $this->children = new FieldSet( + new LiteralField( "UnusedAssets", "

"._t('Folder.UNUSEDFILESTITLE', 'Unused files')."

" ), + $this->getAssetList(), + new FieldGroup( + new LiteralField( "UnusedThumbnails", "

"._t('Folder.UNUSEDTHUMBNAILSTITLE', 'Unused thumbnails')."

"), + $inlineFormAction + ) + ); + $this->children->setForm($this->form); + } + return $this->children; + } + + public function FieldHolder() { + $output = ""; + foreach($this->getChildren() as $child) { + $output .= $child->FieldHolder(); + } + return $output; + } + + + /** + * Creates table for displaying unused files. + * + * @returns AssetTableField + */ + protected function getAssetList() { + $where = $this->folder->getUnusedFilesListFilter(); + $assetList = new AssetTableField( + $this->folder, + "AssetList", + "File", + array("Title" => _t('Folder.TITLE', "Title"), "LinkedURL" => _t('Folder.FILENAME', "Filename")), + "", + $where + ); + $assetList->setPopupCaption(_t('Folder.VIEWASSET', "View Asset")); + $assetList->setPermissions(array("show","delete")); + $assetList->Markable = false; + return $assetList; + } +} \ No newline at end of file diff --git a/code/SiteTreeFolderDecorator.php b/code/SiteTreeFolderDecorator.php new file mode 100644 index 00000000..d7a64c54 --- /dev/null +++ b/code/SiteTreeFolderDecorator.php @@ -0,0 +1,55 @@ +push(new Tab("UnusedFiles", _t('Folder.UNUSEDFILESTAB', "Unused files"), + // new Folder_UnusedAssetsField($this) + // )); + } + + /** + * 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. + */ + public function getUnusedFilesListFilter() { + $result = DB::query("SELECT DISTINCT \"FileID\" FROM \"SiteTree_ImageTracking\""); + $usedFiles = array(); + $where = ''; + $classes = ClassInfo::subclassesFor('SiteTree'); + + if($result->numRecords() > 0) { + while($nextResult = $result->next()) { + $where .= $nextResult['FileID'] . ','; + } + } + + foreach($classes as $className) { + $query = singleton($className)->extendedSQL(); + $ids = $query->execute()->column(); + if(!count($ids)) continue; + + foreach(singleton($className)->has_one() as $relName => $joinClass) { + if($joinClass == 'Image' || $joinClass == 'File') { + $fieldName = $relName .'ID'; + $query = singleton($className)->extendedSQL("$fieldName > 0"); + $query->distinct = true; + $query->select = array($fieldName); + $usedFiles = array_merge($usedFiles, $query->execute()->column()); + + } elseif($joinClass == 'Folder') { + // @todo + } + } + } + + if($usedFiles) { + return "\"File\".\"ID\" NOT IN (" . implode(', ', $usedFiles) . ") AND (\"ClassName\" = 'File' OR \"ClassName\" = 'Image')"; + + } else { + return "(\"ClassName\" = 'File' OR \"ClassName\" = 'Image')"; + } + return $where; + } +} \ No newline at end of file