oDocument->getId(), "Document downloaded", DOWNLOAD); $oDocumentTransaction->create(); $oStorage->download($this->oDocument); exit(0); } } $oKTActionRegistry->registerAction('documentaction', 'KTDocumentViewAction', 'ktcore.actions.document.view'); // }}} // {{{ KTDocumentCheckOutAction class KTDocumentCheckOutAction extends KTDocumentAction { var $sBuiltInAction = 'checkOutDocument'; var $sDisplayName = 'Checkout'; var $sName = 'ktcore.actions.document.checkout'; var $_sDisablePermission = "ktcore.permissions.write"; function getInfo() { if ($this->oDocument->getIsCheckedOut()) { return null; } return parent::getInfo(); } function check() { $res = parent::check(); if ($res !== true) { return $res; } if ($this->oDocument->getIsCheckedOut()) { $_SESSION['KTErrorMessage'][] = "This document is already checked out"; controllerRedirect('viewDocument', 'fDocumentId=' . $this->oDocument->getId()); exit(0); } return true; } function do_main() { $this->oPage->setBreadcrumbDetails("checkout"); $oTemplate =& $this->oValidator->validateTemplate('ktcore/action/checkout'); $checkout_fields = array(); $checkout_fields[] = new KTStringWidget('Reason', 'The reason for the checkout of this document for historical purposes, and to inform those who wish to check out this document.', 'reason', "", $this->oPage, true); $oTemplate->setData(array( 'context' => &$this, 'checkout_fields' => $checkout_fields, )); return $oTemplate->render(); } function do_checkout() { $sReason = KTUtil::arrayGet($_REQUEST, 'reason'); $this->oValidator->notEmpty($sReason); $oTemplate =& $this->oValidator->validateTemplate('ktcore/action/checkout_final'); $oTemplate->setData(array( 'context' => &$this, 'reason' => $sReason, )); return $oTemplate->render(); } function do_checkout_final() { $sReason = KTUtil::arrayGet($_REQUEST, 'reason'); $this->oValidator->notEmpty($sReason); // flip the checkout status $this->oDocument->setIsCheckedOut(true); // set the user checking the document out $this->oDocument->setCheckedOutUserID($_SESSION["userID"]); // update it if (!$this->oDocument->update()) { $_SESSION['KTErrorMessage'][] = "There was a problem checking out the document."; controllerRedirect('viewDocument', 'fDocumentId=' . $this->oDocument->getId()); } $oKTTriggerRegistry = KTTriggerRegistry::getSingleton(); $aTriggers = $oKTTriggerRegistry->getTriggers('checkout', 'postValidate'); foreach ($aTriggers as $aTrigger) { $sTrigger = $aTrigger[0]; $oTrigger = new $sTrigger; $aInfo = array( "document" => $this->oDocument, ); $oTrigger->setInfo($aInfo); $ret = $oTrigger->postValidate(); if (PEAR::isError($ret)) { $this->oDocument->delete(); return $ret; } } $oDocumentTransaction = & new DocumentTransaction($this->oDocument->getID(), $sReason, CHECKOUT); $oDocumentTransaction->create(); $oStorage =& KTStorageManagerUtil::getSingleton(); $oStorage->download($this->oDocument); exit(0); } } $oKTActionRegistry->registerAction('documentaction', 'KTDocumentCheckOutAction', 'ktcore.actions.document.checkout'); // }}} // {{{ KTDocumentCheckInAction class KTDocumentCheckInAction extends KTDocumentAction { var $sBuiltInAction = 'checkInDocument'; var $sDisplayName = 'Checkin'; var $sName = 'ktcore.actions.document.checkin'; var $_sShowPermission = "ktcore.permissions.write"; function getInfo() { if (!$this->oDocument->getIsCheckedOut()) { return null; } if ($this->oDocument->getCheckedOutUserID() != $this->oUser->getId()) { return null; } return parent::getInfo(); } function check() { $res = parent::check(); if ($res !== true) { return $res; } if (!$this->oDocument->getIsCheckedOut()) { $_SESSION['KTErrorMessage'][] = "This document is not checked out"; controllerRedirect('viewDocument', 'fDocumentId=' . $this->oDocument->getId()); exit(0); } if ($this->oDocument->getCheckedOutUserID() != $this->oUser->getId()) { $_SESSION['KTErrorMessage'][] = "This document is checked out, but not by you"; controllerRedirect('viewDocument', 'fDocumentId=' . $this->oDocument->getId()); exit(0); } return true; } function do_main() { $this->oPage->setBreadcrumbDetails("checkin"); $oTemplate =& $this->oValidator->validateTemplate('ktcore/action/checkin'); $sReason = KTUtil::arrayGet($_REQUEST, 'reason', ""); $checkin_fields = array(); $checkin_fields[] = new KTFileUploadWidget('File', 'The updated document.', 'file', "", $this->oPage, true); $checkin_fields[] = new KTStringWidget('Description', 'Describe the changes made to the document.', 'reason', $sReason, $this->oPage, true); $oTemplate->setData(array( 'context' => &$this, 'checkin_fields' => $checkin_fields, )); return $oTemplate->render(); } function do_checkin() { $sReason = KTUtil::arrayGet($_REQUEST, 'reason'); $sReason = $this->oValidator->notEmpty($sReason); // make sure the user actually selected a file first if (strlen($_FILES['file']['name']) == 0) { $this->errorRedirectToMain("No file was uploaded", 'fDocumentId=' . $this->oDocument->getId() . '&reason=' . $sReason); } // and that the filename matches global $default; $default->log->info("checkInDocumentBL.php uploaded filename=" . $_FILES['file']['name'] . "; current filename=" . $this->oDocument->getFileName()); if ($this->oDocument->getFileName() != $_FILES['file']['name']) { $this->errorRedirectToMain("The file name of the uploaded file does not match the file name of the document in the system", 'fDocumentId=' . $this->oDocument->getId() . '&reason=' . $sReason); } $res = KTDocumentUtil::checkin($this->oDocument, $_FILES['file']['tmp_name'], $sReason, $this->oUser); if (PEAR::isError($res)) { $this->errorRedirectToMain("An error occurred while trying to check in the document", 'fDocumentId=' . $this->oDocument->getId() . '&reason=' . $sReason); } redirect("$default->rootUrl/control.php?action=viewDocument&fDocumentID=" . $this->oDocument->getID()); } } $oKTActionRegistry->registerAction('documentaction', 'KTDocumentCheckInAction', 'ktcore.actions.document.checkin'); // }}} // {{{ KTDocumentDeleteAction class KTDocumentDeleteAction extends KTDocumentAction { var $sBuiltInAction = 'deleteDocument'; var $sDisplayName = 'Delete'; var $sName = 'ktcore.actions.document.delete'; var $_sDisablePermission = "ktcore.permissions.write"; function getInfo() { if ($this->oDocument->getIsCheckedOut()) { return null; } return parent::getInfo(); } function check() { $res = parent::check(); if ($res !== true) { return $res; } if ($this->oDocument->getIsCheckedOut()) { $_SESSION["KTErrorMessage"][]= _("This document can't be deleted because it is checked out"); controllerRedirect('viewDocument', 'fDocumentId=' . $this->oDocument->getId()); exit(0); } return true; } function do_main() { $this->oPage->setBreadcrumbDetails("delete"); $oTemplate =& $this->oValidator->validateTemplate('ktcore/action/delete'); $delete_fields = array(); $delete_fields[] = new KTStringWidget('Reason', 'The reason for this document to be removed.', 'reason', "", $this->oPage, true); $oTemplate->setData(array( 'context' => &$this, 'delete_fields' => $delete_fields, )); return $oTemplate->render(); } function do_delete() { global $default; $sReason = KTUtil::arrayGet($_REQUEST, 'reason'); $this->oValidator->notEmpty($sReason); $this->startTransaction(); // flip the status id $this->oDocument->setStatusID(DELETED); if (!$this->oDocument->update()) { $_SESSION["KTErrorMessage"][]= _("There was a problem deleting the document from the database."); controllerRedirect('viewDocument', 'fDocumentId=' . $this->oDocument->getId()); exit(0); } // now move the document to the delete folder if (!PhysicalDocumentManager::delete($this->oDocument)) { //could not delete the document from the file system $default->log->error("deleteDocumentBL.php Filesystem error deleting document " . $this->oDocument->getFileName() . " from folder " . Folder::getFolderPath($this->oDocument->getFolderID()) . " id=" . $this->oDocument->getFolderID()); //reverse the document deletion $this->oDocument->setStatusID(LIVE); $this->oDocument->update(); //get rid of the document transaction $_SESSION["KTErrorMessage"][]= _("There was a problem deleting the document from storage."); controllerRedirect('viewDocument', 'fDocumentId=' . $this->oDocument->getId()); exit(0); } $oDocumentTransaction = & new DocumentTransaction($this->oDocument->getId(), "Document deleted: " . $sReason, DELETE); $oDocumentTransaction->create(); $this->commitTransaction(); // At this point, the document is deleted. $oKTTriggerRegistry = KTTriggerRegistry::getSingleton(); $aTriggers = $oKTTriggerRegistry->getTriggers('delete', 'postValidate'); foreach ($aTriggers as $aTrigger) { $sTrigger = $aTrigger[0]; $oTrigger = new $sTrigger; $aInfo = array( "document" => $this->oDocument, ); $oTrigger->setInfo($aInfo); $ret = $oTrigger->postValidate(); if (PEAR::isError($ret)) { $this->oDocument->delete(); return $ret; } } controllerRedirect('viewDocument', 'fDocumentId=' . $this->oDocument->getId()); exit(0); } } $oKTActionRegistry->registerAction('documentaction', 'KTDocumentDeleteAction', 'ktcore.actions.document.delete'); // }}} require_once(KT_LIB_DIR . "/browse/DocumentCollection.inc.php"); require_once(KT_LIB_DIR . "/browse/BrowseColumns.inc.php"); require_once(KT_LIB_DIR . "/browse/PartialQuery.inc.php"); class KTDocumentMoveColumn extends TitleColumn { function KTDocumentMoveColumn($sLabel, $sName, $oDocument) { $this->oDocument = $oDocument; parent::TitleColumn($sLabel, $sName); } function buildFolderLink($aDataRow) { $baseurl = KTUtil::arrayGet($this->aOptions, "folderurl", ""); return sprintf('%s?fDocumentId=%d&fFolderId=%d', $baseurl, $this->oDocument->getId(), $aDataRow["folder"]->getId()); } } // {{{ KTDocumentMoveAction class KTDocumentMoveAction extends KTDocumentAction { var $sBuiltInAction = 'moveDocument'; var $sDisplayName = 'Move'; var $sName = 'ktcore.actions.document.move'; var $_sShowPermission = "ktcore.permissions.write"; function getInfo() { if ($this->oDocument->getIsCheckedOut()) { return null; } return parent::getInfo(); } function check() { $res = parent::check(); if ($res !== true) { return $res; } if ($this->oDocument->getIsCheckedOut()) { $_SESSION["KTErrorMessage"][]= _("This document can't be deleted because it is checked out"); controllerRedirect('viewDocument', 'fDocumentId=' . $this->oDocument->getId()); exit(0); } $iFolderId = KTUtil::arrayGet($_REQUEST, 'fFolderId', $this->oDocument->getFolderId()); $this->oFolder = $this->oValidator->validateFolder($iFolderId); $this->oDocumentFolder = $this->oValidator->validateFolder($this->oDocument->getFolderId()); return true; } /* function getURL() { return sprintf("/control.php?action=%s&fDocumentIDs[]=%d&fReturnDocumentID=%d&fFolderID=%d", $this->sBuiltInAction, $this->oDocument->getID(), $this->oDocument->getID(), $this->oDocument->getFolderID()); } */ function do_main() { $this->oPage->setBreadcrumbDetails("move"); $oTemplate =& $this->oValidator->validateTemplate('ktcore/action/move'); $move_fields = array(); $aNames = $this->oDocumentFolder->getPathArray(); $aNames[] = $this->oDocument->getName(); $sDocumentName = join(" » ", $aNames); $move_fields[] = new KTStaticTextWidget('Document to move', '', 'fDocumentId', $sDocumentName, $this->oPage, false); $collection = new DocumentCollection(); $collection->addColumn(new KTDocumentMoveColumn("Test 1 (title)","title", $this->oDocument)); $qObj = new FolderBrowseQuery($this->oFolder->getId()); $collection->setQueryObject($qObj); $batchPage = (int) KTUtil::arrayGet($_REQUEST, "page", 0); $batchSize = 20; $resultURL = sprintf("?fDocumentId=%d&fFolderId=%d", $this->oDocument->getId(), $this->oFolder->getId()); $collection->setBatching($resultURL, $batchPage, $batchSize); // ordering. (direction and column) $displayOrder = KTUtil::arrayGet($_REQUEST, 'sort_order', "asc"); if ($displayOrder !== "asc") { $displayOrder = "desc"; } $displayControl = KTUtil::arrayGet($_REQUEST, 'sort_on', "title"); $collection->setSorting($displayControl, $displayOrder); $collection->getResults(); $aBreadcrumbs = array(); $folder_path_names = $this->oFolder->getPathArray(); $folder_path_ids = explode(',', $this->oFolder->getParentFolderIds()); if ($folder_path_ids[0] == 0) { $folder_path_ids = array(); } $folder_path_ids[] = $this->oFolder->getId(); foreach (range(0, count($folder_path_ids) - 1) as $index) { $id = $folder_path_ids[$index]; $url = sprintf("?fDocumentId=%d&fFolderId=%d", $this->oDocument->getId(), $id); $aBreadcrumbs[] = array("url" => $url, "name" => $folder_path_names[$index]); } $oTemplate->setData(array( 'context' => &$this, 'move_fields' => $move_fields, 'collection' => $collection, 'collection_breadcrumbs' => $aBreadcrumbs, )); return $oTemplate->render(); } function do_move() { $this->oPage->setBreadcrumbDetails("move"); $oTemplate =& $this->oValidator->validateTemplate('ktcore/action/move_final'); $sFolderPath = join(" » ", $this->oFolder->getPathArray()); $aNames = $this->oDocumentFolder->getPathArray(); $aNames[] = $this->oDocument->getName(); $sDocumentName = join(" » ", $aNames); $move_fields = array(); $move_fields[] = new KTStaticTextWidget('Document to move', '', 'fDocumentId', $sDocumentName, $this->oPage, false); $move_fields[] = new KTStaticTextWidget('Target folder', '', 'fFolderId', $sFolderPath, $this->oPage, false); $move_fields[] = new KTStringWidget('Reason', 'The reason for this document to be moved.', 'reason', "", $this->oPage, true); $oTemplate->setData(array( 'context' => &$this, 'move_fields' => $move_fields, )); return $oTemplate->render(); } function do_move_final() { $sReason = KTUtil::arrayGet($_REQUEST, 'reason'); $aOptions = array( 'message' => "No reason given", 'redirect_to' => array('move', sprintf('fDocumentId=%d&fFolderId=%d', $this->oDocument->getId(), $this->oFolder->getId())), ); $this->oValidator->notEmpty($sReason, $aOptions); if (!Permission::userHasFolderWritePermission($this->oFolder)) { $this->errorRedirectTo("main", "You do not have permission to move a document to this location", sprintf("fDocumentId=%d&fFolderId=%d", $this->oDocument->getId(), $this->oFolder->getId())); exit(0); } $this->startTransaction(); //put the document in the new folder $this->oDocument->setFolderID($this->oFolder->getId()); if (!$this->oDocument->update(true)) { $this->errorRedirectTo("main", "There was a problem updating the document's location in the database", sprintf("fDocumentId=%d&fFolderId=%d", $this->oDocument->getId(), $this->oFolder->getId())); } //move the document on the file system $oStorage =& KTStorageManagerUtil::getSingleton(); if (!$oStorage->moveDocument($this->oDocument, $this->oDocumentFolder, $this->oFolder)) { $this->oDocument->setFolderID($this->oDocumentFolder->getId()); $this->oDocument->update(true); errorRedirectTo("move", "There was a problem updating the document's location in the repository storage", sprintf("fDocumentId=%d&fFolderId=%d", $this->oDocument->getId(), $this->oFolder->getId())); } $this->oDocument->update(); $sMoveMessage = sprintf("Moved from %s/%s to %s/%s: %s", $this->oDocumentFolder->getFullPath(), $this->oDocumentFolder->getName(), $this->oFolder->getFullPath(), $this->oFolder->getName(), $sReason); // create the document transaction record $oDocumentTransaction = & new DocumentTransaction($this->oDocument->getID(), $sMoveMessage, MOVE); $oDocumentTransaction->create(); $this->commitTransaction(); $oKTTriggerRegistry = KTTriggerRegistry::getSingleton(); $aTriggers = $oKTTriggerRegistry->getTriggers('moveDocument', 'postValidate'); foreach ($aTriggers as $aTrigger) { $sTrigger = $aTrigger[0]; $oTrigger = new $sTrigger; $aInfo = array( "document" => $this->oDocument, "old_folder" => $this->oDocumentFolder, "new_folder" => $this->oFolder, ); $oTrigger->setInfo($aInfo); $ret = $oTrigger->postValidate(); if (PEAR::isError($ret)) { $this->oDocument->delete(); return $ret; } } controllerRedirect('viewDocument', 'fDocumentId=' . $this->oDocument->getId()); exit(0); } } $oKTActionRegistry->registerAction('documentaction', 'KTDocumentMoveAction', 'ktcore.actions.document.move'); // }}} class KTDocumentHistoryAction extends KTDocumentAction { var $sDisplayName = 'History'; var $sName = 'ktcore.actions.document.history'; function getURL() { return generateControllerLink("viewDocument", sprintf("action=history&fDocumentId=%d", $this->oDocument->getID())); } } $oKTActionRegistry->registerAction('documentaction', 'KTDocumentHistoryAction', 'ktcore.actions.document.history'); class KTDocumentDiscussionAction extends KTBuiltInDocumentAction { var $sBuiltInAction = 'viewDiscussion'; var $sDisplayName = 'Discussion'; var $sName = 'ktcore.actions.document.discussion'; } $oKTActionRegistry->registerAction('documentaction', 'KTDocumentDiscussionAction', 'ktcore.actions.document.discussion'); class KTDocumentArchiveAction extends KTBuiltInDocumentAction { var $_sDisablePermission = "ktcore.permissions.write"; var $sBuiltInAction = 'archiveDocument'; var $sDisplayName = 'Archive'; var $sName = 'ktcore.actions.document.archive'; function _disable() { /* if ($this->oDocument->hasCollaboration() && DocumentCollaboration::documentCollaborationStarted($this->oDocument->getID()) && !DocumentCollaboration::documentCollaborationDone($this->oDocument->getID())) { $sDisabledText = _("This document is in collaboration and cannot be archived"); } */ if ($this->oDocument->getIsCheckedOut()) { $this->_sDisabledText = _("This document is checked out and cannot be archived."); return true; } return parent::_disable(); } } $oKTActionRegistry->registerAction('documentaction', 'KTDocumentArchiveAction', 'ktcore.actions.document.archive'); class KTDocumentDependentAction extends KTBuiltInDocumentAction { var $sBuiltInAction = 'createDependantDocument'; var $sDisplayName = 'Link New Doc'; var $sName = 'ktcore.actions.document.dependent'; } $oKTActionRegistry->registerAction('documentaction', 'KTDocumentDependentAction', 'ktcore.actions.document.dependent'); class KTDocumentPublishAction extends KTDocumentAction { var $_sDisablePermission = "ktcore.permissions.write"; var $sDisplayName = 'Publish'; var $sName = 'ktcore.actions.document.publish'; function _disable() { if ($this->oDocument->getIsCheckedOut()) { $this->_sDisabledText = _("This document is checked out and cannot be archived."); return true; } /* if (DocumentCollaboration::documentIsPublished($oDocument->getID())) { $this->_sDisabledText = _("This document is already published."); return true; } if (DocumentCollaboration::documentIsPendingWebPublishing($oDocument->getID())) { $this->_sDisabledText = _("This document has been marked as pending publishing and the web publisher has been notified."); return true; } if ($oDocument->hasCollaboration()) { if (!DocumentCollaboration::documentCollaborationDone($oDocument->getID())) { $this->_sDisabledText = _("You cannot publish this document until collaboration is complete"); return true; } } */ return parent::_disable(); } function getURL() { return sprintf("/control.php?action=%s&fDocumentID=%d&fForPublish=1", 'viewDocument', $this->oDocument->getID(), $this->oDocument->getID()); } } $oKTActionRegistry->registerAction('documentaction', 'KTDocumentPublishAction', 'ktcore.actions.document.publish'); class KTDocumentPermissionsAction extends KTBuiltInDocumentAction { var $sBuiltInAction = 'editDocumentPermissions'; var $sDisplayName = 'Permissions'; var $sName = 'ktcore.actions.document.permissions'; } $oKTActionRegistry->registerAction('documentaction', 'KTDocumentPermissionsAction', 'ktcore.actions.document.permissions'); class KTDocumentWorkflowAction extends KTDocumentAction { var $sBuiltInAction = 'documentWorkflow'; var $sDisplayName = 'Workflow'; var $sName = 'ktcore.actions.document.workflow'; var $_sShowPermission = "ktcore.permissions.write"; function do_main() { $this->oPage->setBreadcrumbDetails("workflow"); $oTemplate =& $this->oValidator->validateTemplate("ktcore/workflow/documentWorkflow"); $oDocument =& $this->oValidator->validateDocument($_REQUEST['fDocumentId']); $oWorkflow = KTWorkflowUtil::getWorkflowForDocument($oDocument); $oWorkflowState = KTWorkflowUtil::getWorkflowStateForDocument($oDocument); $oUser =& User::get($_SESSION['userID']); $aTransitions = KTWorkflowUtil::getTransitionsForDocumentUser($oDocument, $oUser); $aWorkflows = KTWorkflow::getList(); $fieldErrors = null; $transition_fields = array(); if ($aTransitions) { $aVocab = array(); foreach ($aTransitions as $oTransition) { $aVocab[$oTransition->getId()] = $oTransition->showDescription(); } $fieldOptions = array("vocab" => $aVocab); $transition_fields[] = new KTLookupWidget('Transition to perform', 'FIXME', 'fTransitionId', null, $this->oPage, true, null, $fieldErrors, $fieldOptions); $transition_fields[] = new KTStringWidget('Reason for transition', 'Describe the changes made to the document.', 'fComments', "", $this->oPage, true); } $aTemplateData = array( 'oDocument' => $oDocument, 'oWorkflow' => $oWorkflow, 'oState' => $oWorkflowState, 'aTransitions' => $aTransitions, 'aWorkflows' => $aWorkflows, 'transition_fields' => $transition_fields, ); return $oTemplate->render($aTemplateData); } function do_startWorkflow() { $oDocument =& $this->oValidator->validateDocument($_REQUEST['fDocumentId']); $oWorkflow =& $this->oValidator->validateWorkflow($_REQUEST['fWorkflowId']); $res = KTWorkflowUtil::startWorkflowOnDocument($oWorkflow, $oDocument); $this->successRedirectToMain('Workflow started', array('fDocumentId' => $oDocument->getId())); exit(0); } function do_performTransition() { $oDocument =& $this->oValidator->validateDocument($_REQUEST['fDocumentId']); $oTransition =& $this->oValidator->validateWorkflowTransition($_REQUEST['fTransitionId']); $sComments =& $this->oValidator->notEmpty($_REQUEST['fComments']); $oUser =& User::get($_SESSION['userID']); $res = KTWorkflowUtil::performTransitionOnDocument($oTransition, $oDocument, $oUser, $sComments); $this->successRedirectToMain('Transition performed', array('fDocumentId' => $oDocument->getId())); } } $oKTActionRegistry->registerAction('documentaction', 'KTDocumentWorkflowAction', 'ktcore.actions.document.workflow'); ?>