Go to file
Julian Seidenberg c571d5bc8d ENHANCEMENT: protecting the "dms-assets" folder from web access 2012-08-07 11:16:10 +12:00
_config ENHANCEMENT: download link functionality 2012-07-27 17:40:17 +12:00
code ENHANCEMENT: protecting the "dms-assets" folder from web access 2012-08-07 11:16:10 +12:00
css MINOR: Adjust styling for gridfield showing where-else document is linked 2012-08-06 17:55:18 +12:00
images/app_icons MINOR: Add aditional app_icons 2012-08-06 15:57:47 +12:00
javascript ENHANCEMENT: delete button warning 2012-08-06 18:17:01 +12:00
resources ENHANCEMENT: protecting the "dms-assets" folder from web access 2012-08-07 11:16:10 +12:00
scss MINOR: Adjust styling for gridfield showing where-else document is linked 2012-08-06 17:55:18 +12:00
templates FEATURE: WIP add existing document to page 2012-08-06 17:52:41 +12:00
tests APICHANGE: change DMSDocumentInterface::downloadLink() to DMSDocumentInterface::getDownloadLink() so that a $DownloadLink could be used as a field to make GridField for DMSDocument to have a formatted linkable column 2012-08-01 12:35:44 +12:00
.gitignore ENHANCEMENT: adding scss stlying 2012-08-01 16:12:11 +12:00
README.md Added README 2012-08-06 16:20:33 +02:00
_config.php FEATURE: Upload button for documents (WIP) 2012-07-31 14:12:20 +12:00
config.rb ENHANCEMENT: adding scss stlying 2012-08-01 16:12:11 +12:00
testfile MINOR: adding test file 2012-07-18 17:58:00 +12:00

README.md

Document Management Module (DMS)

Overview

The module adds a new DMSDocument model which allows management of large amounts of files, and their relations to pages. In contrast to the File model built into SilverStripe core, it aims to wrap storage and access concerns in a generic API, which allows more fine-grained control over how the documents are managed and exposed through the website.

Features:

  • Relation of documents to pages
  • Management and upload of documents within a page context in the CMS
  • Metadata management through the powerful GridField and UploadField core APIs
  • Configurable tags for documents
  • Download via SilverStripe controller (rather than filesystem URLs)
  • Access control based on PHP logic, and page relations
  • Replacement of existing files

Documents on the Filesystem

While the DMS architecture allows for remote storage of files, the default implementation (the DMS class) stores them locally. Relations to pages and tags are persisted as many-many relationships through the SilverStripe ORM.

File locations in this implementation are structured into subfolders, in order to avoid exceeding filesystem limits. The file name is a composite based on its database ID and the original file name. The exact location shouldn't be relied on by custom logic, but rather retrieved through the API (DMSDocument->getDownloadLink()).

Example:

dms-assets/
	0/
		1234~myfile.pdf
	1/
		2345~myotherfile.pdf

Requirements

  • PHP 5.3 with the "fileinfo" module (or alternatively the "whereis" and "file" Unix commands)

Configuration

The file location is set via the DMS::$dmsFolder static, and points to a location in the webroot.

Usage

Create Documents

Create by relative path:

$dms = DMS::getDMSInstance();
$doc = $dms->storeDocument('assets/myfile.pdf');

Create from an existing File record:

$dms = DMS::getDMSInstance();
$file = File::get()->byID(99);
$doc = $dms->storeDocument($file);

Note: Both operations copy the existing file.

Download Documents

$dms = DMS::getDMSInstance();
$docs = $dms->getByTag('priority', 'important')->First();
$link = $doc->getDownloadLink();

Manage Page Relations

// Find documents by page
$dms = DMS::getDMSInstance();
$page = SiteTree::get()->filter('URLSegment', 'home')->First();
$docs = $dms->getByPage($page);

// Add documents to page

Manage Tags

// Find documents by tag
$dms = DMS::getDMSInstance();
$docs = $dms->getByTag('priority', 'important');

// Add tag to existing document
$doc = Document::get()->byID(99);
$doc->addTag('priority', 'low');

// Supports multiple values for tags
$doc->addTag('category', 'keyboard');
$doc->addTag('category', 'input device');

// Removing tags is abstracted as well
$doc->removeTag('category', 'keyboard'); 
$doc->removeTag('category', 'input device'); 
$doc->removeAllTags();