currentPageID(); if ($id === 0) { return SiteTree::singleton(); } return parent::currentPage(); } /** * Return fake-ID "root" if no ID is found (needed to upload files into the root-folder). Otherwise the page ID * is passed in from the {@link DMSGridFieldAddNewButton}. * * @return int */ public function currentPageID() { return (int) $this->getRequest()->getVar('page_id'); } /** * Get the current document set, if a document set ID was provided * * @return DMSDocumentSet */ public function getCurrentDocumentSet() { if ($id = $this->getRequest()->getVar('dsid')) { return DMSDocumentSet::get()->byId($id); } return singleton('DMSDocumentSet'); } /** * @return Form * @todo what template is used here? AssetAdmin_UploadContent.ss doesn't seem to be used anymore */ public function getEditForm($id = null, $fields = null) { Requirements::javascript(FRAMEWORK_DIR . '/javascript/AssetUploadField.js'); Requirements::css(FRAMEWORK_DIR . '/css/AssetUploadField.css'); Requirements::css(DMS_DIR . '/dist/css/cmsbundle.css'); /** @var SiteTree $page */ $page = $this->currentPage(); /** @var DMSDocumentSet $documentSet */ $documentSet = $this->getCurrentDocumentSet(); $uploadField = DMSUploadField::create('AssetUploadField', ''); $uploadField->setConfig('previewMaxWidth', 40); $uploadField->setConfig('previewMaxHeight', 30); // Required to avoid Solr reindexing (often used alongside DMS) to // return 503s because of too many concurrent reindex requests $uploadField->setConfig('sequentialUploads', 1); $uploadField->addExtraClass('ss-assetuploadfield'); $uploadField->removeExtraClass('ss-uploadfield'); $uploadField->setTemplate('AssetUploadField'); $uploadField->setRecord($documentSet); $uploadField->getValidator()->setAllowedExtensions($this->getAllowedExtensions()); $exts = $uploadField->getValidator()->getAllowedExtensions(); asort($exts); $backlink = $this->Backlink(); $done = " " . _t('UploadField.DONE', 'DONE') . " "; $addExistingField = new DMSDocumentAddExistingField( 'AddExisting', _t('DMSDocumentAddExistingField.ADDEXISTING', 'Add Existing') ); $addExistingField->setRecord($documentSet); $form = new Form( $this, 'getEditForm', new FieldList( new TabSet( _t('DMSDocumentAddController.MAINTAB', 'Main'), new Tab( _t('UploadField.FROMCOMPUTER', 'From your computer'), $uploadField, new LiteralField( 'AllowedExtensions', sprintf( '

%s: %s

', _t('AssetAdmin.ALLOWEDEXTS', 'Allowed extensions'), implode(', ', $exts) ) ) ), new Tab( _t('UploadField.FROMCMS', 'From the CMS'), $addExistingField ) ) ), new FieldList( new LiteralField('doneButton', $done) ) ); $form->addExtraClass('center cms-edit-form ' . $this->BaseCSSClasses()); $form->Backlink = $backlink; // Don't use AssetAdmin_EditForm, as it assumes a different panel structure $form->setTemplate($this->getTemplatesWithSuffix('_EditForm')); $form->Fields()->push(HiddenField::create('ID', false, $documentSet->ID)); $form->Fields()->push(HiddenField::create('DSID', false, $documentSet->ID)); return $form; } /** * @return ArrayList */ public function Breadcrumbs($unlinked = false) { $items = parent::Breadcrumbs($unlinked); // The root element should explicitly point to the root node. $items[0]->Link = Controller::join_links(singleton('CMSPageEditController')->Link('show'), 0); // Enforce linkage of hierarchy to AssetAdmin foreach ($items as $item) { $baselink = $this->Link('show'); if (strpos($item->Link, $baselink) !== false) { $item->Link = str_replace($baselink, singleton('CMSPageEditController')->Link('show'), $item->Link); } } $items->push(new ArrayData(array( 'Title' => _t('DMSDocumentSet.ADDDOCUMENTBUTTON', 'Add Document'), 'Link' => $this->Link() ))); return $items; } /** * Returns the link to be used to return the user after uploading a document. Scenarios: * * 1) Page context: page ID and document set ID provided, redirect back to the page and document set * 2) Document set context: no page ID, document set ID provided, redirect back to document set in ModelAdmin * 3) Document context: no page ID and no document set ID provided, redirect back to documents in ModelAdmin * * @return string */ public function Backlink() { if (!$this->getRequest()->getVar('dsid') || !$this->currentPageID()) { $modelAdmin = new DMSDocumentAdmin; $modelAdmin->init(); if ($this->getRequest()->getVar('dsid')) { return Controller::join_links( $modelAdmin->Link('DMSDocumentSet'), 'EditForm/field/DMSDocumentSet/item', $this->getRequest()->getVar('dsid'), 'edit' ); } return $modelAdmin->Link(); } return $this->getPageEditLink($this->currentPageID(), $this->getRequest()->getVar('dsid')); } /** * Return a link to a page. In SS <= 3.5 this is loaded from the session, whereas in SS >= 3.6 this is set * explicitly to a class property on CMSMain. This method checks whether the URL handler to detect this ID * exists on CMSMain, if so include it in the URL. * * @param int $pageId * @param int $documentSetId * @return string */ protected function getPageEditLink($pageId, $documentSetId) { // Only get configuration from CMSMain, not its descendants or extensions $urlHandlers = (array) Config::inst()->get('CMSMain', 'url_handlers', Config::UNINHERITED); $pageIdSegment = array_key_exists('EditForm/$ID', $urlHandlers) ? $pageId . '/' : ''; return Controller::join_links( singleton('CMSPagesController')->Link(), sprintf('edit/EditForm/%sfield/Document Sets/item/%d', $pageIdSegment, $documentSetId) ); } public function documentautocomplete() { $term = (string) $this->getRequest()->getVar('term'); $termSql = Convert::raw2sql($term); $data = DMSDocument::get() ->where( '("ID" LIKE \'%' . $termSql . '%\' OR "Filename" LIKE \'%' . $termSql . '%\'' . ' OR "Title" LIKE \'%' . $termSql . '%\')' ) ->sort('ID ASC') ->limit(20); $return = array(); foreach ($data as $doc) { $return[] = array( 'label' => $doc->ID . ' - ' . $doc->Title, 'value' => $doc->ID ); } return Convert::raw2json($return); } /** * Link an existing document to the given document set ID * @return string JSON */ public function linkdocument() { $return = array('error' => _t('UploadField.FIELDNOTSET', 'Could not add document to page')); $documentSet = $this->getCurrentDocumentSet(); if (!empty($documentSet)) { $document = DMSDocument::get()->byId($this->getRequest()->getVar('documentID')); $documentSet->Documents()->add($document); $buttonText = ''; // Collect all output data. $return = array( 'id' => $document->ID, 'name' => $document->getTitle(), 'thumbnail_url' => $document->Icon($document->getExtension()), 'edit_url' => $this->getEditForm()->Fields()->fieldByName('Main.From your computer.AssetUploadField') ->getItemHandler($document->ID)->EditLink(), 'size' => $document->getFileSizeFormatted(), 'buttons' => $buttonText, 'showeditform' => true ); } return Convert::raw2json($return); } /** * Returns HTML representing a list of documents that are associated with the given page ID, across all document * sets. * * @return string HTML */ public function documentlist() { if (!$this->getRequest()->getVar('pageID')) { return $this->httpError(400); } $page = SiteTree::get()->byId($this->getRequest()->getVar('pageID')); if ($page && $page->getAllDocuments()->count() > 0) { $list = ''; return $list; } return sprintf( '

%s

', _t('DMSDocumentAddController.NODOCUMENTS', 'There are no documents attached to the selected page.') ); } /** * Get an array of allowed file upload extensions, merged with {@link File} and extra configuration from this * class * * @return array */ public function getAllowedExtensions() { return array_filter( array_merge( (array) Config::inst()->get('File', 'allowed_extensions'), (array) $this->config()->get('allowed_extensions') ) ); } /** * Overrides the parent method to allow users with access to DMS admin to access this controller * * @param Member $member * @return bool */ public function canView($member = null) { if (!$member || !(is_a($member, 'Member')) || is_numeric($member)) { $member = Member::currentUser(); } if ($member && Permission::checkMember( $member, array( 'CMS_ACCESS_DMSDocumentAdmin', ) ) ) { return true; } return parent::canView($member); } }