, Jam Warehouse (Pty) Ltd, South Africa
*/
// main library routines and defaults
require_once("config/dmsDefaults.php");
require_once(KT_LIB_DIR . "/templating/templating.inc.php");
require_once(KT_LIB_DIR . "/templating/kt3template.inc.php");
require_once(KT_LIB_DIR . "/dispatcher.inc.php");
require_once(KT_LIB_DIR . "/util/ktutil.inc");
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");
require_once(KT_LIB_DIR . "/browse/browseutil.inc.php");
require_once(KT_LIB_DIR . "/foldermanagement/Folder.inc");
require_once(KT_LIB_DIR . "/documentmanagement/DocumentType.inc");
require_once(KT_LIB_DIR . "/documentmanagement/Document.inc");
require_once(KT_LIB_DIR . "/documentmanagement/DocumentField.inc");
require_once(KT_LIB_DIR . "/widgets/portlet.inc.php");
require_once(KT_LIB_DIR . '/actions/folderaction.inc.php');
require_once(KT_DIR . '/plugins/ktcore/KTFolderActions.php');
require_once(KT_LIB_DIR . "/permissions/permissionutil.inc.php");
require_once(KT_LIB_DIR . "/permissions/permission.inc.php");
require_once(KT_LIB_DIR . '/users/userhistory.inc.php');
require_once(KT_LIB_DIR . '/browse/columnregistry.inc.php');
/******* NBM's FAMOUS MOVECOLUMN HACK
*
* Also in /plugins/ktcore/KTDocumentActions.php
*/
class KTMassMoveColumn extends TitleColumn {
var $sMoveCode;
function KTMassMoveColumn($sLabel, $sName, $sMoveCode) {
$this->sMoveCode = $sMoveCode;
parent::TitleColumn($sLabel, $sName);
}
function renderFolderLink($aDataRow) {
$aFolders = $_SESSION['moves'][$this->sMoveCode]['folders'];
if (array_search($aDataRow['folder']->getId(), $aFolders) === false) {
$outStr = '';
$outStr .= $aDataRow["folder"]->getName();
$outStr .= '';
} else {
$outStr = $aDataRow["folder"]->getName() . ' (' . _kt('you cannot move folders to themselves') . ')';
}
return $outStr;
}
function buildFolderLink($aDataRow) {
return KTUtil::addQueryStringSelf(sprintf('fMoveCode=%s&fFolderId=%d&action=startMove', $this->sMoveCode, $aDataRow["folder"]->getId()));
}
}
$sectionName = "browse";
class BrowseDispatcher extends KTStandardDispatcher {
var $oFolder = null;
var $sSection = "browse";
var $browse_mode = null;
var $query = null;
var $resultURL;
var $sHelpPage = 'ktcore/browse.html';
var $editable;
function BrowseDispatcher() {
$this->aBreadcrumbs = array(
array('action' => 'browse', 'name' => _kt('Browse')),
);
return parent::KTStandardDispatcher();
}
function check() {
$this->browse_mode = KTUtil::arrayGet($_REQUEST, 'fBrowseMode', "folder");
$action = KTUtil::arrayGet($_REQUEST, $this->event_var, 'main');
$this->editable = false;
// catch the alternative actions.
if ($action != 'main') {
return true;
}
// if we're going to main ...
if ($this->browse_mode == 'folder') {
$in_folder_id = KTUtil::arrayGet($_REQUEST, "fFolderId");
if (empty($in_folder_id)) {
$oConfig = KTConfig::getSingleton();
if ($oConfig->get('tweaks/browseToUnitFolder')) {
$iHomeFolderId = $this->oUser->getHomeFolderId();
if ($iHomeFolderId) {
$in_folder_id = $iHomeFolderId;
}
}
}
$folder_id = (int) $in_folder_id; // conveniently, will be 0 if not possible.
if ($folder_id == 0) {
$folder_id = 1;
}
$_REQUEST['fBrowseMode'] = 'folder';
// here we need the folder object to do the breadcrumbs.
$oFolder =& Folder::get($folder_id);
if (PEAR::isError($oFolder)) {
return false; // just fail.
}
$oPerm = KTPermission::getByName('ktcore.permissions.write');
if (KTPermissionUtil::userHasPermissionOnItem($this->oUser, $oPerm, $oFolder)) {
$this->editable = true;
} else {
$this->editable = false;
}
$this->oPage->setTitle(_kt('Browse'));
if (KTPermissionUtil::userHasPermissionOnItem($this->oUser, 'ktcore.permissions.folder_details', $oFolder)) {
$this->oPage->setSecondaryTitle($oFolder->getName());
} else {
if (KTBrowseUtil::inAdminMode($this->oUser, $oFolder)) {
$this->oPage->setSecondaryTitle(sprintf('(%s)', $oFolder->getName()));
} else {
$this->oPage->setSecondaryTitle('...');
}
}
$this->oFolder =& $oFolder;
if (PEAR::isError($oFolder)) {
$this->oPage->addError(_kt("invalid folder"));
$folder_id = 1;
$oFolder =& Folder::get($folder_id);
}
$aOptions = array(
'ignorepermissions' => KTBrowseUtil::inAdminMode($this->oUser, $oFolder),
);
// we now have a folder, and need to create the query.
$this->oQuery = new BrowseQuery($oFolder->getId(), $this->oUser, $aOptions);
$this->aBreadcrumbs = array_merge($this->aBreadcrumbs,
KTBrowseUtil::breadcrumbsForFolder($oFolder));
$portlet = new KTActionPortlet(_kt("Folder Actions"));
$aActions = KTFolderActionUtil::getFolderActionsForFolder($oFolder, $this->oUser);
$portlet->setActions($aActions,null);
$this->oPage->addPortlet($portlet);
$this->resultURL = KTUtil::addQueryString($_SERVER['PHP_SELF'], sprintf("fFolderId=%d", $oFolder->getId()));
} else if ($this->browse_mode == 'lookup_value') {
$this->editable = false;
$field = KTUtil::arrayGet($_REQUEST, 'fField', null);
$oField = DocumentField::get($field);
if (PEAR::isError($oField) || ($oField == false)) {
$this->errorRedirectToMain('No Field selected.');
exit(0);
}
$value = KTUtil::arrayGet($_REQUEST, 'fValue', null);
$oValue = MetaData::get($value);
if (PEAR::isError($oValue) || ($oValue == false)) {
$this->errorRedirectToMain('No Value selected.');
exit(0);
}
$this->oQuery = new ValueBrowseQuery($oField, $oValue);
$this->resultURL = KTUtil::addQueryString($_SERVER['PHP_SELF'], sprintf("fBrowseMode=lookup_value&fField=%d&fValue=%d", $field, $value));
$this->aBreadcrumbs[] = array('name' => _kt('Lookup Values'), 'url' => KTUtil::addQueryString($_SERVER['PHP_SELF'], 'action=selectField'));
$this->aBreadcrumbs[] = array('name' => $oField->getName(), 'url' => KTUtil::addQueryString($_SERVER['PHP_SELF'], 'action=selectLookup&fField=' . $oField->getId()));
$this->aBreadcrumbs[] = array('name' => $oValue->getName(), 'url' => KTUtil::addQueryString($_SERVER['PHP_SELF'], sprintf("fBrowseMode=lookup_value&fField=%d&fValue=%d", $field, $value)));
} else if ($this->browse_mode == 'document_type') {
$this->editable = false;
// FIXME implement document_type browsing.
$doctype = KTUtil::arrayGet($_REQUEST, 'fType',null);
$oDocType = DocumentType::get($doctype);
if (PEAR::isError($oDocType) || ($oDocType == false)) {
$this->errorRedirectToMain('No Document Type selected.');
exit(0);
}
$this->oQuery = new TypeBrowseQuery($oDocType);
// FIXME probably want to redirect to self + action=selectType
$this->aBreadcrumbs[] = array('name' => _kt('Document Types'), 'url' => KTUtil::addQueryString($_SERVER['PHP_SELF'], 'action=selectType'));
$this->aBreadcrumbs[] = array('name' => $oDocType->getName(), 'url' => KTUtil::addQueryString($_SERVER['PHP_SELF'], 'fBrowseMode=document_type&fType=' . $oDocType->getId()));
$this->resultURL = KTUtil::addQueryString($_SERVER['PHP_SELF'], sprintf("fType=%s&fBrowseMode=document_type", $doctype));;
} else {
// FIXME what should we do if we can't initiate the browse? we "pretend" to have no perms.
return false;
}
return true;
}
function do_main() {
$collection = new AdvancedCollection;
$oColumnRegistry = KTColumnRegistry::getSingleton();
$aColumns = $oColumnRegistry->getColumnsForView('ktcore.views.browse');
$collection->addColumns($aColumns);
$aOptions = $collection->getEnvironOptions(); // extract data from the environment
$aOptions['result_url'] = $this->resultURL;
$collection->setOptions($aOptions);
$collection->setQueryObject(new BrowseQuery("1", $this->oUser, array('ignorepermissions' => false)));
$oTemplating =& KTTemplating::getSingleton();
$oTemplate = $oTemplating->loadTemplate("kt3/browse");
$aTemplateData = array(
"context" => $this,
"collection" => $collection,
'browse_mode' => $this->browse_mode,
'isEditable' => $this->editable,
);
return $oTemplate->render($aTemplateData);
}
function do_selectField() {
$aFields = DocumentField::getList('has_lookup = 1');
if (empty($aFields)) {
$this->errorRedirectToMain(_kt('No lookup fields available.'));
exit(0);
}
$_REQUEST['fBrowseMode'] = 'lookup_value';
$oTemplating =& KTTemplating::getSingleton();
$oTemplate = $oTemplating->loadTemplate("kt3/browse_lookup_selection");
$aTemplateData = array(
"context" => $this,
"fields" => $aFields,
);
return $oTemplate->render($aTemplateData);
}
function do_selectLookup() {
$field = KTUtil::arrayGet($_REQUEST, 'fField', null);
$oField = DocumentField::get($field);
if (PEAR::isError($oField) || ($oField == false) || (!$oField->getHasLookup())) {
$this->errorRedirectToMain('No Field selected.');
exit(0);
}
$_REQUEST['fBrowseMode'] = 'lookup_value';
$aValues = MetaData::getByDocumentField($oField);
$oTemplating =& KTTemplating::getSingleton();
$oTemplate = $oTemplating->loadTemplate("kt3/browse_lookup_value");
$aTemplateData = array(
"context" => $this,
"oField" => $oField,
"values" => $aValues,
);
return $oTemplate->render($aTemplateData);
}
function do_selectType() {
$aTypes = DocumentType::getList();
// FIXME what is the error message?
$_REQUEST['fBrowseMode'] = 'document_type';
if (empty($aTypes)) {
$this->errorRedirectToMain('No document types available.');
exit(0);
}
$oTemplating =& KTTemplating::getSingleton();
$oTemplate = $oTemplating->loadTemplate("kt3/browse_types");
$aTemplateData = array(
"context" => $this,
"document_types" => $aTypes,
);
return $oTemplate->render($aTemplateData);
}
function do_massaction() {
// FIXME replace this by using real actions.
$act = (array) KTUtil::arrayGet($_REQUEST, 'submit',null);
$targets = array_keys($act);
if (!empty($targets)) {
$target = $targets[0];
} else {
$this->errorRedirectToMain(_kt('No action selected.'));
exit(0);
}
$aFolderSelection = KTUtil::arrayGet($_REQUEST, 'selection_f' , array());
$aDocumentSelection = KTUtil::arrayGet($_REQUEST, 'selection_d' , array());
$oFolder = Folder::get(KTUtil::arrayGet($_REQUEST, 'fFolderId', 1));
if (PEAR::isError($oFolder)) {
$this->errorRedirectToMain(_kt('Invalid folder selected.'));
exit(0);
}
if (empty($aFolderSelection) && empty($aDocumentSelection)) {
$this->errorRedirectToMain(_kt('Please select documents or folders first.'), sprintf('fFolderId=%d', $oFolder->getId()));
exit(0);
}
if ($target == 'delete') {
return $this->do_startDelete();
} else if ($target == 'move') {
return $this->do_startMove();
} else {
$this->errorRedirectToMain(_kt('No such action.'));
exit(0);
}
return $target;
}
function do_startMove() {
$this->oPage->setTitle('Move Files and Folders');
$this->oPage->setBreadcrumbDetails('Move Files and Folders');
// FIXME double-check that the movecode actually exists...
$sMoveCode = KTUtil::arrayGet($_REQUEST, 'fMoveCode', null);
if ($sMoveCode == null) {
$aFolderSelection = KTUtil::arrayGet($_REQUEST, 'selection_f' , array());
$aDocumentSelection = KTUtil::arrayGet($_REQUEST, 'selection_d' , array());
$aCantMove = array();
$aFinalDocumentSelection = array();
$aMoveData = array('folders' => $aFolderSelection, 'documents' => array());
foreach ($aDocumentSelection as $iDocumentId) {
$oDocument = Document::get($iDocumentId);
if (!KTDocumentUtil::canBeMoved($oDocument)) {
$aCantMove['documents'][] = $iDocumentId;
continue;
}
$aMoveData['documents'][] = $iDocumentId;
}
$sMoveCode = KTUtil::randomString();
$moves = KTUtil::arrayGet($_SESSION, 'moves', array());
$moves = (array) $moves; // ?
$moves[$sMoveCode] = $aMoveData;
$_SESSION['moves'] = $moves; // ...
}
if (!empty($aCantMove)) {
$cantMoveItems = array();
$cantMoveItems['folders'] = array();
$cantMoveItems['documents'] = array();
$folderStr = '';
$documentStr = '';
if (!empty($aCantMove['folders'])) {
$folderStr = '' . _kt('Folders: ') . '';
foreach ($aCantMove['folders'] as $iFolderId) {
$oF = Folder::get($iFolderId);
$cantMoveItems['folders'][] = $oF->getName();
}
$folderStr .= implode(', ', $cantMoveItems['folders']);
}
if (!empty($aCantMove['documents'])) {
$documentStr = '' . _kt('Documents: ') . '';
foreach ($aCantMove['documents'] as $iDocId) {
$oD = Document::get($iDocId);
$cantMoveItems['documents'][] = $oD->getName();
}
$documentStr .= implode(', ', $cantMoveItems['documents']);
}
$bMoveError = false;
if (!empty($folderStr)) {
$_SESSION["KTErrorMessage"][] = _kt("The following folders can not be moved") . ": " . $folderStr;
}
if (!empty($documentStr)) {
$_SESSION["KTErrorMessage"][] = _kt("The following documents can not be moved as they are either checked out, or controlled by a workflow") . ": " . $documentStr;
$bMoveError = true;
}
}
$oFolder = Folder::get(KTUtil::arrayGet($_REQUEST, 'fFolderId', 1));
if (PEAR::isError($oFolder)) {
$this->errorRedirectToMain(_kt('Invalid folder selected.'));
exit(0);
}
$moveSet = $_SESSION['moves'][$sMoveCode];
if (empty($moveSet['folders']) && empty($moveSet['documents'])) {
if(!$bMoveError) {
$sMsg = _kt('Please select documents or folders first.');
} else {
$sMsg = '';
}
$this->errorRedirectToMain($sMsg, sprintf('fFolderId=%d', $oFolder->getId()));
exit(0);
}
// Setup the collection for move display.
$collection = new DocumentCollection();
$collection->addColumn(new KTMassMoveColumn("Test 1 (title)","title", $sMoveCode));
$qObj = new FolderBrowseQuery($oFolder->getId());
$collection->setQueryObject($qObj);
$batchPage = (int) KTUtil::arrayGet($_REQUEST, "page", 0);
$batchSize = 20;
$resultURL = KTUtil::addQueryString($_SERVER['PHP_SELF'], sprintf("fMoveCode=%s&fFolderId=%d&action=startMove", $sMoveCode, $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 = $oFolder->getPathArray();
$folder_path_ids = explode(',', $oFolder->getParentFolderIds());
$folder_path_ids[] = $oFolder->getId();
if ($folder_path_ids[0] == 0) {
array_shift($folder_path_ids);
array_shift($folder_path_names);
}
foreach (range(0, count($folder_path_ids) - 1) as $index) {
$id = $folder_path_ids[$index];
$url = KTUtil::addQueryString($_SERVER['PHP_SELF'], sprintf("fMoveCode=%s&fFolderId=%d&action=startMove", $sMoveCode, $id));
$aBreadcrumbs[] = array("url" => $url, "name" => $folder_path_names[$index]);
}
// now show the items...
$moveItems = array();
$moveItems['folders'] = array();
$moveItems['documents'] = array();
$folderStr = '';
$documentStr = '';
if (!empty($moveSet['folders'])) {
$folderStr = '' . _kt('Folders: ') . '';
foreach ($moveSet['folders'] as $iFolderId) {
$oF = Folder::get($iFolderId);
$moveItems['folders'][] = $oF->getName();
}
$folderStr .= implode(', ', $moveItems['folders']);
}
if (!empty($moveSet['documents'])) {
$documentStr = '' . _kt('Documents: ') . '';
foreach ($moveSet['documents'] as $iDocId) {
$oD = Document::get($iDocId);
$moveItems['documents'][] = $oD->getName();
}
$documentStr .= implode(', ', $moveItems['documents']);
}
$oTemplating =& KTTemplating::getSingleton();
$oTemplate = $oTemplating->loadTemplate("ktcore/action/mass_move");
$aTemplateData = array(
"context" => $this,
'folder' => $oFolder,
'move_code' => $sMoveCode,
'collection' => $collection,
'collection_breadcrumbs' => $aBreadcrumbs,
'folders' => $folderStr,
'documents' => $documentStr,
);
return $oTemplate->render($aTemplateData);
}
function do_finaliseMove() {
// FIXME this is a PITA.
$action_a = (array) KTUtil::arrayGet($_REQUEST, 'submit', null);
$actions = array_keys($action_a);
if (empty($actions)) {
$this->errorRedirectToMain(_kt('No action selected.'));
} else {
$action = $actions[0];
}
if ($action != 'move') {
$this->successRedirectToMain(_kt('Move cancelled.'));
}
$target_folder = KTUtil::arrayGet($_REQUEST, 'fFolderId');
if ($target_folder == null ) { $this->errorRedirectToMain(_kt('No folder selected.')); }
$move_code = KTUtil::arrayGet($_REQUEST, 'fMoveCode');
$aFields = array();
$aFields[] = new KTStaticTextWidget(_kt('Destination folder'), _kt('The folder which will contain the previously selected files and folders.'), 'fDocumentId', Folder::getFolderDisplayPath($target_folder), $this->oPage, false);
$aFields[] = new KTStringWidget(_kt('Reason'), _kt('The reason for moving these documents and folders, for historical purposes.'), 'sReason', "", $this->oPage, true);
// now show the items...
$moveSet = $_SESSION['moves'][$move_code];
$moveItems = array();
$moveItems['folders'] = array();
$moveItems['documents'] = array();
$folderStr = '';
$documentStr = '';
if (!empty($moveSet['folders'])) {
$folderStr = '' . _kt('Folders: ') . '';
foreach ($moveSet['folders'] as $iFolderId) {
$oF = Folder::get($iFolderId);
$moveItems['folders'][] = $oF->getName();
}
$folderStr .= implode(', ', $moveItems['folders']);
}
if (!empty($moveSet['documents'])) {
$documentStr = '' . _kt('Documents: ') . '';
foreach ($moveSet['documents'] as $iDocId) {
$oD = Document::get($iDocId);
$moveItems['documents'][] = $oD->getName();
}
$documentStr .= implode(', ', $moveItems['documents']);
}
$oTemplating =& KTTemplating::getSingleton();
$oTemplate = $oTemplating->loadTemplate("ktcore/action/finalise_mass_move");
$aTemplateData = array(
"context" => $this,
'form_fields' => $aFields,
'folder' => $target_folder,
'move_code' => $move_code,
'folders' => $folderStr,
'documents' => $documentStr,
);
return $oTemplate->render($aTemplateData);
}
function do_move() {
$move_code = KTUtil::arrayGet($_REQUEST, 'fMoveCode');
$target_folder = KTUtil::arrayGet($_REQUEST, 'fFolderId');
$reason = KTUtil::arrayGet($_REQUEST, 'sReason');
if (empty($reason)) {
$_SESSION['KTErrorMessage'][] = _kt('You must supply a reason.');
return $this->do_finaliseMove();
}
// FIXME check perms? or will that happen "lower" in the stack.
$aMoveStack = $_SESSION['moves'][$move_code];
$oTargetFolder = Folder::get($target_folder);
if (PEAR::isError($oTargetFolder)) {
return print_r($oTargetFolder, true);
}
if (!Permission::userHasFolderWritePermission($oTargetFolder)) {
$this->errorRedirectTo("main", _kt("You do not have permission to move items to this location"), sprintf("fFolderId=%d", $oTargetFolder->getId()));
exit(0);
}
$oStorage =& KTStorageManagerUtil::getSingleton();
// FIXME refactor this IMMEDIATELY into documentutil::
foreach ($aMoveStack['documents'] as $iDocId) {
$this->startTransaction();
$oDoc = Document::get($iDocId);
if (PEAR::isError($oDoc)) {
$this->errorRedirectToMain(_kt('Invalid document.'));
}
$oOriginalFolder = Folder::get($oDoc->getFolderId());
$iOriginalFolderPermissionObjectId = $oOriginalFolder->getPermissionObjectId();
$iDocumentPermissionObjectId = $oDoc->getPermissionObjectId();
if ($iDocumentPermissionObjectId === $iOriginalFolderPermissionObjectId) {
$oDoc->setPermissionObjectId($oTargetFolder->getPermissionObjectId());
}
//put the document in the new folder
$oDoc->setFolderID($oTargetFolder->getId());
$res = $oDoc->update(true);
if (!$res) {
$this->errorRedirectTo("move", _kt("There was a problem updating the document's location in the database"), sprintf("fDocumentId=%d&fFolderId=%d", $oDoc->getId(), $oTargetFolder->getId()));
}
//move the document on the file system
$oStorage =& KTStorageManagerUtil::getSingleton();
if (!$oStorage->moveDocument($oDoc, $oOriginalFolder, $oTargetFolder)) {
$oDoc->setFolderID($oOriginalFolder->getId());
$oDoc->update(true);
$this->errorRedirectTo("move", _kt("There was a problem updating the document's location in the repository storage"), sprintf("fDocumentId=%d&fFolderId=%d", $oDoc->getId(), $oTargetFolder->getId()));
}
$sMoveMessage = sprintf("Moved from %s/%s to %s/%s: %s",
$oOriginalFolder->getFullPath(),
$oOriginalFolder->getName(),
$oTargetFolder->getFullPath(),
$oTargetFolder->getName(),
$reason);
// create the document transaction record
$oDocumentTransaction = & new DocumentTransaction($oDoc, $sMoveMessage, 'ktcore.transactions.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" => $oDoc,
"old_folder" => $oDocumentFolder,
"new_folder" => $oTargetFolder,
);
$oTrigger->setInfo($aInfo);
$ret = $oTrigger->postValidate();
if (PEAR::isError($ret)) {
$oDoc->delete();
return $ret;
}
}
}
// now folders ... these are easier.
$this->startTransaction();
foreach ($aMoveStack['folders'] as $iFolderId) {
$oFolder = Folder::get($iFolderId);
if (PEAR::isError($oFolder)) { $this->errorRedirectToMain(_kt('Invalid folder.')); }
$res = KTFolderUtil::move($oFolder, $oTargetFolder, $this->oUser);
if (PEAR::isError($res)) {
$this->errorRedirectToMain(_kt('Failed to move the folder: ') . $res->getMessage());
}
}
$this->commitTransaction();
$this->successRedirectToMain(_kt('Move completed.'), sprintf('fFolderId=%d', $target_folder));
}
function do_startDelete() {
$this->oPage->setTitle('Delete Files and Folders');
$this->oPage->setBreadcrumbDetails('Delete Files and Folders');
$fFolderId = KTUtil::arrayGet($_REQUEST, 'fFolderId', 1);
$aFolderSelection = KTUtil::arrayGet($_REQUEST, 'selection_f' , array());
$aDocumentSelection = KTUtil::arrayGet($_REQUEST, 'selection_d' , array());
$oPerm = KTPermission::getByName('ktcore.permissions.delete');
// now show the items...
$delItems = array();
$delItems['folders'] = array();
$delItems['documents'] = array();
$folderStr = '';
$documentStr = '';
if (!empty($aFolderSelection)) {
$folderStr = '' . _kt('Folders: ') . '';
foreach ($aFolderSelection as $iFolderId) {
$oF = Folder::get($iFolderId);
if (!KTPermissionUtil::userHasPermissionOnItem($this->oUser, $oPerm, $oF)) {
$this->errorRedirectToMain(_kt('You do not have permission to delete the folder: ') . $oF->getName());
}
$delItems['folders'][] = $oF->getName();
}
$folderStr .= implode(', ', $delItems['folders']);
}
if (!empty($aDocumentSelection)) {
$documentStr = '' . _kt('Documents: ') . '';
foreach ($aDocumentSelection as $iDocId) {
$oD = Document::get($iDocId);
if (!KTPermissionUtil::userHasPermissionOnItem($this->oUser, $oPerm, $oD)) {
$this->errorRedirectToMain(_kt('You do not have permission to delete the document: ') . $oD->getName());
}
if (!PEAR::isError($oD)) {
$delItems['documents'][] = $oD->getName();
}
}
$documentStr .= implode(', ', $delItems['documents']);
}
$aFields = array();
$aFields[] = new KTStringWidget(_kt('Reason'), _kt('The reason for the deletion of these documents and folders for historical purposes.'), 'sReason', "", $this->oPage, true);
$oTemplating =& KTTemplating::getSingleton();
$oTemplate = $oTemplating->loadTemplate("ktcore/folder/mass_delete");
$aTemplateData = array(
"context" => $this,
"folder_id" => $fFolderId,
'form_fields' => $aFields,
'folders' => $aFolderSelection,
'documents' => $aDocumentSelection,
'folder_string' => $folderStr,
'document_string' => $documentStr,
);
return $oTemplate->render($aTemplateData);
}
function do_doDelete() {
$aFolderSelection = KTUtil::arrayGet($_REQUEST, 'selection_f' , array());
$aDocumentSelection = KTUtil::arrayGet($_REQUEST, 'selection_d' , array());
$fFolderId = KTUtil::arrayGet($_REQUEST, 'fFolderId', 1);
$oPerm = KTPermission::getByName('ktcore.permissions.delete');
$res = KTUtil::arrayGet($_REQUEST,'sReason');
$sReason = $res;
if (empty($res)) {
$_SESSION['KTErrorMessage'][] = _kt('You must supply a reason.');
return $this->do_startDelete();
}
// FIXME we need to sort out the (inconsistent) use of transactions here.
$aFolders = array();
$aDocuments = array();
foreach ($aFolderSelection as $id) {
$oF = Folder::get($id);
if (PEAR::isError($oF) || ($oF == false)) {
return $this->errorRedirectToMain(_kt('Invalid Folder selected.'));
} else if (!KTPermissionUtil::userHasPermissionOnItem($this->oUser, $oPerm, $oF)) {
return $this->errorRedirectToMain(sprintf(_kt('You do not have permissions to delete the folder: %s'), $oF->getName()));
} else{
$aFolders[] = $oF;
}
}
foreach ($aDocumentSelection as $id) {
$oD = Document::get($id);
if (PEAR::isError($oD) || ($oD == false)) {
return $this->errorRedirectToMain(_kt('Invalid Document selected.'));
} else if (!KTPermissionUtil::userHasPermissionOnItem($this->oUser, $oPerm, $oD)) {
return $this->errorRedirectToMain(sprintf(_kt('You do not have permissions to delete the document: %s'), $oD->getName()));
} else {
$aDocuments[] = $oD;
}
}
foreach ($aFolders as $oFolder) {
$res = KTFolderUtil::delete($oFolder, $this->oUser, $sReason);
if (PEAR::isError($res)) {
return $this->errorRedirectToMain($res->getMessage());
}
}
foreach ($aDocuments as $oDocument) {
$res = KTDocumentUtil::delete($oDocument, $sReason);
if (PEAR::isError($res)) {
return $this->errorRedirectToMain($res->getMessage());
}
}
$this->successRedirectToMain(_kt('Folders and Documents Deleted.'),sprintf('fFolderId=%d', $fFolderId));
}
function do_enableAdminMode() {
$iDocumentId = KTUtil::arrayGet($_REQUEST, 'fDocumentId');
$iFolderId = KTUtil::arrayGet($_REQUEST, 'fFolderId');
if ($iDocumentId) {
$oDocument = Document::get($iDocumentId);
if (PEAR::isError($oDocument) || ($oDocument === false)) {
return null;
}
$iFolderId = $oDocument->getFolderId();
}
if (!Permission::userIsSystemAdministrator() && !Permission::isUnitAdministratorForFolder($this->oUser, $iFolderId)) {
$this->errorRedirectToMain(_kt('You are not an administrator'));
}
// log this entry
$oLogEntry =& KTUserHistory::createFromArray(array(
'userid' => $this->oUser->getId(),
'datetime' => date("Y-m-d H:i:s", time()),
'actionnamespace' => 'ktcore.user_history.enable_admin_mode',
'comments' => 'Admin Mode enabled',
'sessionid' => $_SESSION['sessionID'],
));
$aOpts = array(
'redirect_to' => 'main',
'message' => _kt('Unable to log admin mode entry. Not activating admin mode.'),
);
$this->oValidator->notError($oLogEntry, $aOpts);
$_SESSION['adminmode'] = true;
if ($_REQUEST['fDocumentId']) {
$_SESSION['KTInfoMessage'][] = _kt('Administrator mode enabled');
redirect(KTBrowseUtil::getUrlForDocument($iDocumentId));
exit(0);
}
if ($_REQUEST['fFolderId']) {
$this->successRedirectToMain(_kt('Administrator mode enabled'), sprintf('fFolderId=%d', $_REQUEST['fFolderId']));
}
$this->successRedirectToMain(_kt('Administrator mode enabled'));
}
function do_disableAdminMode() {
$iDocumentId = KTUtil::arrayGet($_REQUEST, 'fDocumentId');
$iFolderId = KTUtil::arrayGet($_REQUEST, 'fFolderId');
if ($iDocumentId) {
$oDocument = Document::get($iDocumentId);
if (PEAR::isError($oDocument) || ($oDocument === false)) {
return null;
}
$iFolderId = $oDocument->getFolderId();
}
if (!Permission::userIsSystemAdministrator() && !Permission::isUnitAdministratorForFolder($this->oUser, $iFolderId)) {
$this->errorRedirectToMain(_kt('You are not an administrator'));
}
// log this entry
$oLogEntry =& KTUserHistory::createFromArray(array(
'userid' => $this->oUser->getId(),
'datetime' => date("Y-m-d H:i:s", time()),
'actionnamespace' => 'ktcore.user_history.disable_admin_mode',
'comments' => 'Admin Mode disabled',
'sessionid' => $_SESSION['sessionID'],
));
$aOpts = array(
'redirect_to' => 'main',
'message' => _kt('Unable to log admin mode exit. Not de-activating admin mode.'),
);
$this->oValidator->notError($oLogEntry, $aOpts);
$_SESSION['adminmode'] = false;
if ($_REQUEST['fDocumentId']) {
$_SESSION['KTInfoMessage'][] = _kt('Administrator mode disabled');
redirect(KTBrowseUtil::getUrlForDocument($iDocumentId));
exit(0);
}
if ($_REQUEST['fFolderId']) {
$this->successRedirectToMain(_kt('Administrator mode disabled'), sprintf('fFolderId=%d', $_REQUEST['fFolderId']));
}
$this->successRedirectToMain(_kt('Administrator mode disabled'));
}
}
$oDispatcher = new BrowseDispatcher();
$oDispatcher->dispatch();
?>