'DMSDocument' ); private static $noDocumentsList = array(); private static $showDocumentsList = array(); /** * Do not show the documents tab on the array of pages set here * @static * @param $mixed Array of page types to not show the Documents tab on * * @deprecated 2.0 Will be removed in favour of YAML configuration */ public static function no_documents_tab($array = array()) { if (empty($array)) { return; } if (is_array($array)) { self::$noDocumentsList = $array; } else { self::$noDocumentsList = array($array); } } /** * Only show the documents tab on the list of pages set here. Any pages set in the no_documents_tab array will * still not be shown. If this isn't called, or if it is called with an empty array, all pages will get * Document tabs. * @static * @param $array Array of page types to show the Documents tab on * * @deprecated 2.0 Will be removed in favour of YAML configuration */ public static function show_documents_tab($array = array()) { if (empty($array)) { return; } if (is_array($array)) { self::$showDocumentsList = $array; } else { self::$showDocumentsList = array($array); } } public function updateCMSFields(FieldList $fields) { // Prevent certain pages from having a Document tab in the CMS if (in_array($this->owner->ClassName, self::$noDocumentsList)) { return; } if (count(self::$showDocumentsList) > 0 && !in_array($this->owner->ClassName, self::$showDocumentsList)) { return; } // Javascript to customize the grid field for the DMS document (overriding entwine // in FRAMEWORK_DIR.'/javascript/GridField.js' Requirements::javascript(DMS_DIR.'/javascript/DMSGridField.js'); Requirements::css(DMS_DIR.'/css/DMSMainCMS.css'); // Javascript for the link editor pop-up in TinyMCE Requirements::javascript(DMS_DIR."/javascript/DocumentHtmlEditorFieldToolbar.js"); // Document listing $gridFieldConfig = GridFieldConfig::create()->addComponents( new GridFieldToolbarHeader(), new GridFieldFilterHeader(), new GridFieldSortableHeader(), new GridFieldOrderableRows('DocumentSort'), new GridFieldDataColumns(), new GridFieldEditButton(), new DMSGridFieldDeleteAction(), //special delete dialog to handle custom behaviour of unlinking and deleting new GridFieldDetailForm() //GridFieldLevelup::create($folder->ID)->setLinkSpec('admin/assets/show/%d') ); if (class_exists('GridFieldPaginatorWithShowAll')) { $paginatorComponent = new GridFieldPaginatorWithShowAll(15); } else { $paginatorComponent = new GridFieldPaginator(15); } $gridFieldConfig->addComponent($paginatorComponent); if (class_exists('GridFieldSortableRows')) { $sortableComponent = new GridFieldSortableRows('DocumentSort'); //setUsePagenation method removed from newer version of SortableGridField. if (method_exists($sortableComponent, 'setUsePagination')) { $sortableComponent->setUsePagination(false)->setForceRedraw(true); } $gridFieldConfig->addComponent($sortableComponent); } // HACK: Create a singleton of DMSDocument to ensure extensions are applied before we try to get display fields. singleton('DMSDocument'); $gridFieldConfig->getComponentByType('GridFieldDataColumns') ->setDisplayFields(Config::inst()->get('DMSDocument', 'display_fields')) ->setFieldCasting(array('LastChanged'=>"Datetime->Ago")) ->setFieldFormatting( array( 'FilenameWithoutID'=>'$FilenameWithoutID' ) ); //override delete functionality with this class $gridFieldConfig->getComponentByType('GridFieldDetailForm') ->setItemRequestClass('DMSGridFieldDetailForm_ItemRequest'); $gridField = GridField::create( 'Documents', false, $this->owner->Documents()->Sort('DocumentSort'), $gridFieldConfig ); $gridField->addExtraClass('documents'); $uploadBtn = new LiteralField( 'UploadButton', sprintf( '%s', Controller::join_links(singleton('DMSDocumentAddController')->Link(), '?ID=' . $this->owner->ID), "Add Documents" ) ); $fields->addFieldsToTab( 'Root.Documents (' . $this->owner->Documents()->Count() . ')', array( $uploadBtn, $gridField ) ); } /** * Enforce sorting for frontend * * @deprecated 2.0 Will be removed in future */ public function PageDocuments() { return $this->owner->getManyManyComponents('Documents')->sort('DocumentSort'); } public function onBeforeDelete() { if (Versioned::current_stage() == 'Live') { $existsOnOtherStage = !$this->owner->getIsDeletedFromStage(); } else { $existsOnOtherStage = $this->owner->getExistsOnLive(); } // Only remove if record doesn't still exist on live stage. if (!$existsOnOtherStage) { $dmsDocuments = $this->owner->Documents(); foreach ($dmsDocuments as $document) { //if the document is only associated with one page, i.e. only associated with this page if ($document->Pages()->Count() <= 1) { //delete the document before deleting this page $document->delete(); } } } } public function onBeforePublish() { $embargoedDocuments = $this->owner->Documents()->filter('EmbargoedUntilPublished', true); if ($embargoedDocuments->Count() > 0) { foreach ($embargoedDocuments as $doc) { $doc->EmbargoedUntilPublished = false; $doc->write(); } } } public function getTitleWithNumberOfDocuments() { return $this->owner->Title . ' (' . $this->owner->Documents()->Count() . ')'; } }