<?php class DMS implements DMSInterface { static $dmsFolder = 'dms-assets'; //folder to store the documents in //How many documents to store in a single folder. The square of this number is the maximum number of documents. //The number should be a multiple of 10 static $dmsFolderSize = 1000; static $dmsPath; //DMS path set on creation protected $modelClass; /** * Factory method that returns an instance of the DMS. This could be any class that implements the DMSInterface. * @static * @return DMSInterface An instance of the Document Management System */ static function getDMSInstance($className="DMSDocument") { self::$dmsPath = BASE_PATH . DIRECTORY_SEPARATOR . self::$dmsFolder; $dms = new DMS(); self::createStorageFolder(self::$dmsPath); $dms->modelClass = $className; return $dms; } static function transformFileToFilePath($file) { //confirm we have a file $filePath = null; if (is_string($file)) $filePath = $file; elseif (is_object($file) && $file->is_a("File")) $filePath = $file->Filename; if (!$filePath) throw new FileNotFoundException(); return $filePath; } /** * Takes a File object or a String (path to a file) and copies it into the DMS. The original file remains unchanged. * When storing a document, sets the fields on the File has "tag" metadata. * @param $file File object, or String that is path to a file to store, e.g. "assets/documents/industry/supplied-v1-0.pdf" */ function storeDocument($file) { $filePath = self::transformFileToFilePath($file); //create a new document and get its ID $modelClass = $this->modelClass; $doc = new $modelClass(); $doc->write(); $doc->storeDocument($filePath); return $doc; } /** * * Returns a number of Document objects based on the a search by tags. You can search by category alone, * by tag value alone, or by both. I.e: getByTag("fruits",null); getByTag(null,"banana"); getByTag("fruits","banana") * @param null $category The metadata category to search for * @param null $value The metadata value to search for * @param bool $showEmbargoed Boolean that specifies if embargoed documents should be included in results * @return DocumentInterface */ function getByTag($category = null, $value = null, $showEmbargoed = false) { // TODO: Implement getByTag() method. } /** * Returns a number of Document objects that match a full-text search of the Documents and their contents * (if contents is searchable and compatible search module is installed - e.g. FullTextSearch module) * @param $searchText String to search for * @param bool $showEmbargoed Boolean that specifies if embargoed documents should be included in results * @return DocumentInterface */ function getByFullTextSearch($searchText, $showEmbargoed = false) { // TODO: Implement getByFullTextSearch() method. } /** * Returns a list of Document objects associated with a Page * @param $page SiteTree to fetch the associated Documents from * @param bool $showEmbargoed Boolean that specifies if embargoed documents should be included in results * @return DataList Document list associated with the Page */ function getByPage($page, $showEmbargoed = false) { // TODO: Implement getByPage() method. } /** * Creates a storage folder for the given path * @param $path Path to create a folder for */ static function createStorageFolder($path) { if (!is_dir($path)) { mkdir($path, 0777); } } /** * Calculates the storage path from a database DMSDocument ID */ static function getStorageFolder($id) { $folderName = intval($id / self::$dmsFolderSize); return $folderName; } }