This repository has been archived on 2024-11-28. You can view files and clone it, but cannot push or open issues or pull requests.
Incam_SGD/ktapi/KTAPIFolder.inc.php

1597 lines
41 KiB
PHP

<?php
/**
* Folder API for KnowledgeTree
*
* KnowledgeTree Community Edition
* Document Management Made Simple
* Copyright (C) 2008, 2009 KnowledgeTree Inc.
*
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License version 3 as published by the
* Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco,
* California 94120-7775, or email info@knowledgetree.com.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "Powered by
* KnowledgeTree" logo and retain the original copyright notice. If the display of the
* logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices
* must display the words "Powered by KnowledgeTree" and retain the original
* copyright notice.
*
* @copyright 2008-2009, KnowledgeTree Inc.
* @license GNU General Public License version 3
* @author KnowledgeTree Team
* @package KTAPI
* @version Version 0.9
*/
require_once(KT_DIR . '/ktwebservice/KTUploadManager.inc.php');
require_once(KT_LIB_DIR . '/mime.inc.php');
/**
* This class handles folder related operations
*
* @author KnowledgeTree Team
* @package KTAPI
* @version Version 0.9
*
*/
class KTAPI_Folder extends KTAPI_FolderItem
{
/**
* This is a reference to a base Folder object.
*
* @access private
* @var Folder
*/
var $folder;
/**
* This is the id of the folder on the database.
*
* @access private
* @var int
*/
var $folderid;
/**
* This is used to get a folder based on a folder id.
* @author KnowledgeTree Team
* @access private
* @param KTAPI $ktapi
* @param int $folderid
* @return KTAPI_Folder
*/
function get(&$ktapi, $folderid)
{
assert(!is_null($ktapi));
assert(is_a($ktapi, 'KTAPI'));
assert(is_numeric($folderid));
$folderid += 0;
$folder = &Folder::get($folderid);
if (is_null($folder) || PEAR::isError($folder))
{
return new KTAPI_Error(KTAPI_ERROR_FOLDER_INVALID,$folder);
}
// A special case. We ignore permission checking on the root folder.
if ($folderid != 1)
{
$user = $ktapi->can_user_access_object_requiring_permission($folder, KTAPI_PERMISSION_READ);
if (is_null($user) || PEAR::isError($user))
{
$user = $ktapi->can_user_access_object_requiring_permission($folder, KTAPI_PERMISSION_VIEW_FOLDER);
if (is_null($user) || PEAR::isError($user))
{
return $user;
}
}
}
return new KTAPI_Folder($ktapi, $folder);
}
/**
* Checks if the folder is a shortcut
*
* @author KnowledgeTree Team
* @access public
* @return boolean
*/
function is_shortcut()
{
return $this->folder->isSymbolicLink();
}
/**
* Retrieves the shortcuts linking to this folder
*
* @author KnowledgeTree Team
* @access public
* @return array
*/
function get_shortcuts()
{
return $this->folder->getSymbolicLinks();
}
/**
* This is the constructor for the KTAPI_Folder.
*
* @author KnowledgeTree Team
* @access private
* @param KTAPI $ktapi
* @param Folder $folder
* @return KTAPI_Folder
*/
function KTAPI_Folder(&$ktapi, &$folder)
{
$this->ktapi = &$ktapi;
$this->folder = &$folder;
$this->folderid = $folder->getId();
}
/**
* This returns a reference to the internal folder object.
*
* @author KnowledgeTree Team
* @access protected
* @return Folder
*/
function get_folder()
{
return $this->folder;
}
/**
* This returns detailed information on the folder object.
*
* @author KnowledgeTree Team
* @access public
* @return array
*/
function get_detail()
{
$this->clearCache();
$config = KTConfig::getSingleton();
$wsversion = $config->get('webservice/version', LATEST_WEBSERVICE_VERSION);
$detail = array(
'id'=>(int) $this->folderid,
'folder_name'=>$this->get_folder_name(),
'parent_id'=>(int) $this->get_parent_folder_id(),
'full_path'=>$this->get_full_path(),
'linked_folder_id'=>$this->folder->getLinkedFolderId(),
'permissions' => KTAPI_Folder::get_permission_string($this->folder),
);
if($wsversion<3){
unset($detail['linked_folder_id']);
}
$folder = $this->folder;
// get the creator
$userid = $folder->getCreatorID();
$username='n/a';
if (is_numeric($userid))
{
$username = '* unknown *';
$user = User::get($userid);
if (!is_null($user) && !PEAR::isError($user))
{
$username = $user->getName();
}
}
$detail['created_by'] = $username;
// get the creation date
$detail['created_date'] = $folder->getCreatedDateTime();
// get the modified user
$userid = $folder->getModifiedUserId();
$username='n/a';
if (is_numeric($userid))
{
$username = '* unknown *';
$user = User::get($userid);
if (!is_null($user) && !PEAR::isError($user))
{
$username = $user->getName();
}
}
$detail['modified_by'] = $detail['updated_by'] = $username;
// get the modified date
$detail['updated_date'] = $detail['modified_date'] = $folder->getLastModifiedDate();
return $detail;
}
/**
* This clears the global object cache of the folder class.
*
* @author KnowledgeTree Team
* @access public
*
*/
function clearCache()
{
// TODO: we should only clear the cache for the document we are working on
// this is a quick fix but not optimal!!
$GLOBALS["_OBJECTCACHE"]['Folder'] = array();
$this->folder = &Folder::get($this->folderid);
}
/**
*
*
* @author KnowledgeTree Team
* @access public
* @return unknown
*/
function get_parent_folder_id()
{
return (int) $this->folder->getParentID();
}
/**
*
* @author KnowledgeTree Team
* @access public
* @return unknown
*/
function get_folder_name()
{
return $this->folder->getFolderName($this->folderid);
}
/**
* This returns the folderid.
* @author KnowledgeTree Team
* @access public
* @return int
*/
function get_folderid()
{
return (int) $this->folderid;
}
/**
* This function will return a folder by it's name (not ID)
*
* @author KnowledgeTree Team
* @access public
* @param KTAPI $ktapi
* @param string $foldername
* @param int $folderid
* @return KTAPI_Folder
*/
function _get_folder_by_name($ktapi, $foldername, $folderid)
{
$foldername=trim($foldername);
if (empty($foldername))
{
return new PEAR_Error('A valid folder name must be specified.');
}
$split = explode('/', $foldername);
foreach($split as $foldername)
{
if (empty($foldername))
{
continue;
}
$foldername = KTUtil::replaceInvalidCharacters($foldername);
$foldername = sanitizeForSQL($foldername);
$sql = "SELECT id FROM folders WHERE
(name='$foldername' and parent_id=$folderid) OR
(name='$foldername' and parent_id is null and $folderid=1)";
$row = DBUtil::getOneResult($sql);
if (is_null($row) || PEAR::isError($row))
{
return new KTAPI_Error(KTAPI_ERROR_FOLDER_INVALID,$row);
}
$folderid = $row['id'];
}
return KTAPI_Folder::get($ktapi, $folderid);
}
/**
* This can resolve a folder relative to the current directy by name
*
* @author KnowledgeTree Team
* @access public
* @param string $foldername
* @return KTAPI_Folder
*/
function get_folder_by_name($foldername)
{
return KTAPI_Folder::_get_folder_by_name($this->ktapi, $foldername, $this->folderid);
}
/**
* This will return the full path string of the current folder object
*
* @author KnowledgeTree Team
* @access public
* @return string
*/
function get_full_path()
{
$path = $this->folder->getFullPath();
if (empty($path)) $path = '/';
return $path;
}
/**
* This gets a document by filename or name.
*
* @author KnowledgeTree Team
* @access private
* @param string $documentname
* @param string $function
* @return KTAPI_Document
*/
function _get_document_by_name($documentname, $function='getByNameAndFolder')
{
$documentname=trim($documentname);
if (empty($documentname))
{
return new PEAR_Error('A valid document name must be specified.');
}
$foldername = dirname($documentname);
$documentname = basename($documentname);
$documentname = KTUtil::replaceInvalidCharacters($documentname);
$ktapi_folder = $this;
if (!empty($foldername) && ($foldername != '.'))
{
$ktapi_folder = $this->get_folder_by_name($foldername);
}
$currentFolderName = $this->get_folder_name();
if (PEAR::isError($ktapi_folder) && substr($foldername, 0, strlen($currentFolderName)) == $currentFolderName)
{
if ($currentFolderName == $foldername)
{
$ktapi_folder = $this;
}
else
{
$foldername = substr($foldername, strlen($currentFolderName)+1);
$ktapi_folder = $this->get_folder_by_name($foldername);
}
}
if (is_null($ktapi_folder) || PEAR::isError($ktapi_folder))
{
return new KTAPI_Error(KTAPI_ERROR_FOLDER_INVALID, $ktapi_folder);
}
//$folder = $ktapi_folder->get_folder();
$folderid = $ktapi_folder->folderid;
$document = Document::$function($documentname, $folderid);
if (is_null($document) || PEAR::isError($document))
{
return new KTAPI_Error(KTAPI_ERROR_DOCUMENT_INVALID, $document);
}
$user = $this->can_user_access_object_requiring_permission($document, KTAPI_PERMISSION_READ);
if (PEAR::isError($user))
{
return $user;
}
return new KTAPI_Document($this->ktapi, $ktapi_folder, $document);
}
/**
* This can resolve a document relative to the current directy by name.
* @author KnowledgeTree Team
* @access public
* @param string $documentname
* @return KTAPI_Document
*/
function get_document_by_name($documentname)
{
return $this->_get_document_by_name($documentname,'getByNameAndFolder');
}
/**
* This can resolve a document relative to the current directy by filename .
*
* @author KnowledgeTree Team
* @access public
* @param string $documentname
* @return KTAPI_Document
*/
function get_document_by_filename($documentname)
{
return $this->_get_document_by_name($documentname,'getByFilenameAndFolder');
}
/**
* Gets a User class based on the user id
*
* @author KnowledgeTree Team
* @param int $userid
* @return User
*/
function _resolve_user($userid)
{
$user=null;
if (!is_null($userid))
{
$user=User::get($userid);
if (is_null($user) || PEAR::isError($user))
{
$user=null;
}
}
return $user;
}
/**
* Get's a permission string for a folder eg: 'RW' or 'RWA'
*
* @author KnowledgeTree Team
* @access public
* @param Folder $folder
* @return string
*/
function get_permission_string($folder)
{
$perms = '';
if (Permission::userHasFolderReadPermission($folder))
{
$perms .= 'R';
}
if (Permission::userHasFolderWritePermission($folder))
{
$perms .= 'W';
}
if (Permission::userHasAddFolderPermission($folder))
{
$perms .= 'A';
}
// root folder cannot be renamed or deleted.
if ($folder->iId != 1) {
if (Permission::userHasRenameFolderPermission($folder))
{
$perms .= 'N';
}
if (Permission::userHasDeleteFolderPermission($folder))
{
$perms .= 'D';
}
}
return $perms;
}
/**
* Get's a folder listing, recursing to the given depth
*
* <code>
* $root = $this->ktapi->get_root_folder();
* $listing = $root->get_listing();
* foreach($listing as $val) {
* if($val['item_type'] == 'F') {
* // It's a folder
* echo $val['title'];
* }
* }
* </code>
*
* @author KnowledgeTree Team
* @access public
* @param int $depth
* @param string $what
* @return array
*/
function get_listing($depth=1, $what='DFS')
{
if ($depth < 1)
{
return array();
}
$what = strtoupper($what);
$read_permission = &KTPermission::getByName(KTAPI_PERMISSION_READ);
$folder_permission = &KTPermission::getByName(KTAPI_PERMISSION_VIEW_FOLDER);
$config = KTConfig::getSingleton();
$wsversion = $config->get('webservice/version', LATEST_WEBSERVICE_VERSION);
$user = $this->ktapi->get_user();
$contents = array();
if (strpos($what,'F') !== false)
{
$folder_children = Folder::getList(array('parent_id = ?', $this->folderid));
foreach ($folder_children as $folder)
{
if(KTPermissionUtil::userHasPermissionOnItem($user, $folder_permission, $folder) ||
KTPermissionUtil::userHasPermissionOnItem($user, $read_permission, $folder))
{
if ($depth-1 > 0)
{
$sub_folder = &$this->ktapi->get_folder_by_id($folder->getId());
$items = $sub_folder->get_listing($depth-1, $what);
}
else
{
$items=array();
}
$creator=$this->_resolve_user($folder->getCreatorID());
if ($wsversion >= 2)
{
$array = array(
'id' => (int) $folder->getId(),
'item_type' => 'F',
'custom_document_no'=>'n/a',
'oem_document_no'=>'n/a',
'title' => $folder->getName(),
'document_type' => 'n/a',
'filename' => $folder->getName(),
'filesize' => 'n/a',
'created_by' => is_null($creator)?'n/a':$creator->getName(),
'created_date' => 'n/a',
'checked_out_by' => 'n/a',
'checked_out_date' => 'n/a',
'modified_by' => 'n/a',
'modified_date' => 'n/a',
'owned_by' => 'n/a',
'version' => 'n/a',
'is_immutable'=> 'n/a',
'permissions' => KTAPI_Folder::get_permission_string($folder),
'workflow'=>'n/a',
'workflow_state'=>'n/a',
'mime_type' => 'folder',
'mime_icon_path' => 'folder',
'mime_display' => 'Folder',
'storage_path' => 'n/a',
);
if($wsversion>=3){
$array['linked_folder_id'] = $folder->getLinkedFolderId();
if($folder->isSymbolicLink()){
$array['item_type'] = "S";
}
}
$array['items']=$items;
if($wsversion<3 || (strpos($what,'F') !== false && !$folder->isSymbolicLink()) || ($folder->isSymbolicLink() && strpos($what,'S') !== false)){
$contents[] = $array;
}
}
else
{
$contents[] = array(
'id' => (int) $folder->getId(),
'item_type'=>'F',
'title'=>$folder->getName(),
'creator'=>is_null($creator)?'n/a':$creator->getName(),
'checkedoutby'=>'n/a',
'modifiedby'=>'n/a',
'filename'=>$folder->getName(),
'size'=>'n/a',
'major_version'=>'n/a',
'minor_version'=>'n/a',
'storage_path'=>'n/a',
'mime_type'=>'folder',
'mime_icon_path'=>'folder',
'mime_display'=>'Folder',
'items'=>$items,
'workflow'=>'n/a',
'workflow_state'=>'n/a'
);
}
}
}
}
if (strpos($what,'D') !== false)
{
$document_children = Document::getList(array('folder_id = ? AND status_id = 1', $this->folderid));
// I hate that KT doesn't cache things nicely...
$mime_cache=array();
foreach ($document_children as $document)
{
if (KTPermissionUtil::userHasPermissionOnItem($user, $read_permission, $document))
{
$created_by=$this->_resolve_user($document->getCreatorID());
$created_date = $document->getCreatedDateTime();
if (empty($created_date)) $created_date = 'n/a';
$checked_out_by=$this->_resolve_user($document->getCheckedOutUserID());
$checked_out_date = $document->getCheckedOutDate();
if (empty($checked_out_date)) $checked_out_date = 'n/a';
$modified_by=$this->_resolve_user($document->getCreatorID());
$modified_date = $document->getLastModifiedDate();
if (empty($modified_date)) $modified_date = 'n/a';
$owned_by =$this->_resolve_user($document->getOwnerID());
$mimetypeid=$document->getMimeTypeID();
if (!array_key_exists($mimetypeid, $mime_cache))
{
$type=KTMime::getMimeTypeName($mimetypeid);
$icon=KTMime::getIconPath($mimetypeid);
$display=KTMime::getFriendlyNameForString($type);
$mime_cache[$mimetypeid] = array(
'type'=>$type,
'icon'=>$icon,
'display'=>$display
);
}
$mimeinfo=$mime_cache[$mimetypeid];
$workflow='n/a';
$state='n/a';
$wf = KTWorkflowUtil::getWorkflowForDocument($document);
if (!is_null($wf) && !PEAR::isError($wf))
{
$workflow=$wf->getHumanName();
$ws=KTWorkflowUtil::getWorkflowStateForDocument($document);
if (!is_null($ws) && !PEAR::isError($ws))
{
$state=$ws->getHumanName();
}
}
if ($wsversion >= 2)
{
$docTypeId = $document->getDocumentTypeID();
$documentType = DocumentType::get($docTypeId);
$oemDocumentNo = $document->getOemNo();
if (empty($oemDocumentNo)) $oemDocumentNo = 'n/a';
$array = array(
'id' => (int) $document->getId(),
'item_type' => 'D',
'custom_document_no'=>'n/a',
'oem_document_no'=>$oemDocumentNo,
'title' => $document->getName(),
'document_type'=>$documentType->getName(),
'filename' => $document->getFileName(),
'filesize' => $document->getFileSize(),
'created_by' => is_null($created_by)?'n/a':$created_by->getName(),
'created_date' => $created_date,
'checked_out_by' => is_null($checked_out_by)?'n/a':$checked_out_by->getName(),
'checked_out_date' => $checked_out_date,
'modified_by' => is_null($modified_by)?'n/a':$modified_by->getName(),
'modified_date' => $modified_date,
'owned_by' => is_null($owned_by)?'n/a':$owned_by->getName(),
'version' => $document->getMajorVersionNumber() . '.' . $document->getMinorVersionNumber(),
'content_id' => $document->getContentVersionId(),
'is_immutable'=> $document->getImmutable()?'true':'false',
'permissions' => KTAPI_Document::get_permission_string($document),
'workflow'=> $workflow,
'workflow_state'=> $state,
'mime_type' => $mime_cache[$mimetypeid]['type'],
'mime_icon_path' => $mime_cache[$mimetypeid]['icon'],
'mime_display' => $mime_cache[$mimetypeid]['display'],
'storage_path' => $document->getStoragePath(),
);
if($wsversion>=3){
$document->switchToRealCore();
$array['linked_document_id'] = $document->getLinkedDocumentId();
$document->switchToLinkedCore();
if($document->isSymbolicLink()){
$array['item_type'] = "S";
}
}
$array['items']=array();
if($wsversion<3 || (strpos($what,'D') !== false && !$document->isSymbolicLink()) || ($document->isSymbolicLink() && strpos($what,'S') !== false)){
$contents[] = $array;
}
}
else
{
$contents[] = array(
'id' => (int) $document->getId(),
'item_type'=>'D',
'title'=>$document->getName(),
'creator'=>is_null($created_by)?'n/a':$created_by->getName(),
'checkedoutby'=>is_null($checked_out_by)?'n/a':$checked_out_by->getName(),
'modifiedby'=>is_null($modified_by)?'n/a':$modified_by->getName(),
'filename'=>$document->getFileName(),
'size'=>$document->getFileSize(),
'major_version'=>$document->getMajorVersionNumber(),
'minor_version'=>$document->getMinorVersionNumber(),
'storage_path'=>$document->getStoragePath(),
'mime_type'=>$mime_cache[$mimetypeid]['type'],
'mime_icon_path'=>$mime_cache[$mimetypeid]['icon'],
'mime_display'=>$mime_cache[$mimetypeid]['display'],
'items'=>array(),
'workflow'=>$workflow,
'workflow_state'=>$state
);
}
}
}
}
return $contents;
}
/**
* Get's a folder listing, recursing to the maximum depth.
* Derived from the get_listing function.
*
* <code>
* $root = $this->ktapi->get_root_folder();
* $listing = $root->get_full_listing();
* foreach($listing as $val) {
* if($val['item_type'] == 'F') {
* // It's a folder
* echo $val['title'];
* }
* }
* </code>
*
* @author KnowledgeTree Team
* @access public
* @param string $what
* @return array
*/
function get_full_listing($what='DFS')
{
$what = strtoupper($what);
$read_permission = &KTPermission::getByName(KTAPI_PERMISSION_READ);
$folder_permission = &KTPermission::getByName(KTAPI_PERMISSION_VIEW_FOLDER);
$config = KTConfig::getSingleton();
$wsversion = $config->get('webservice/version', LATEST_WEBSERVICE_VERSION);
$user = $this->ktapi->get_user();
$contents = array();
if (strpos($what,'F') !== false)
{
$folder_children = Folder::getList(array('parent_id = ?', $this->folderid));
foreach ($folder_children as $folder)
{
if(KTPermissionUtil::userHasPermissionOnItem($user, $folder_permission, $folder) ||
KTPermissionUtil::userHasPermissionOnItem($user, $read_permission, $folder))
{
$sub_folder = &$this->ktapi->get_folder_by_id($folder->getId());
if (!PEAR::isError($sub_folder))
{
$items = $sub_folder->get_full_listing($what);
}
else
{
$items = array();
}
$creator = $this->_resolve_user($folder->getCreatorID());
if ($wsversion >= 2)
{
$array = array(
'id' => (int) $folder->getId(),
'item_type' => 'F',
'custom_document_no'=>'n/a',
'oem_document_no'=>'n/a',
'title' => $folder->getName(),
'document_type' => 'n/a',
'filename' => $folder->getName(),
'filesize' => 'n/a',
'created_by' => is_null($creator)?'n/a':$creator->getName(),
'created_date' => 'n/a',
'checked_out_by' => 'n/a',
'checked_out_date' => 'n/a',
'modified_by' => 'n/a',
'modified_date' => 'n/a',
'owned_by' => 'n/a',
'version' => 'n/a',
'is_immutable'=> 'n/a',
'permissions' => KTAPI_Folder::get_permission_string($folder),
'workflow'=>'n/a',
'workflow_state'=>'n/a',
'mime_type' => 'folder',
'mime_icon_path' => 'folder',
'mime_display' => 'Folder',
'storage_path' => 'n/a',
);
if($wsversion>=3)
{
$array['linked_folder_id'] = $folder->getLinkedFolderId();
if($folder->isSymbolicLink()) {
$array['item_type'] = "S";
}
}
$array['items']=$items;
if($wsversion<3 || (strpos($what,'F') !== false && !$folder->isSymbolicLink()) ||
($folder->isSymbolicLink() && strpos($what,'S') !== false)) {
$contents[] = $array;
}
}
else
{
$contents[] = array(
'id' => (int) $folder->getId(),
'item_type'=>'F',
'title'=>$folder->getName(),
'creator'=>is_null($creator)?'n/a':$creator->getName(),
'checkedoutby'=>'n/a',
'modifiedby'=>'n/a',
'filename'=>$folder->getName(),
'size'=>'n/a',
'major_version'=>'n/a',
'minor_version'=>'n/a',
'storage_path'=>'n/a',
'mime_type'=>'folder',
'mime_icon_path'=>'folder',
'mime_display'=>'Folder',
'items'=>$items,
'workflow'=>'n/a',
'workflow_state'=>'n/a'
);
}
}
}
}
if (strpos($what,'D') !== false)
{
$document_children = Document::getList(array('folder_id = ? AND status_id = 1', $this->folderid));
// I hate that KT doesn't cache things nicely...
$mime_cache = array();
foreach ($document_children as $document)
{
if (KTPermissionUtil::userHasPermissionOnItem($user, $read_permission, $document))
{
$created_by=$this->_resolve_user($document->getCreatorID());
$created_date = $document->getCreatedDateTime();
if (empty($created_date)) $created_date = 'n/a';
$checked_out_by=$this->_resolve_user($document->getCheckedOutUserID());
$checked_out_date = $document->getCheckedOutDate();
if (empty($checked_out_date)) $checked_out_date = 'n/a';
$modified_by=$this->_resolve_user($document->getCreatorID());
$modified_date = $document->getLastModifiedDate();
if (empty($modified_date)) $modified_date = 'n/a';
$owned_by =$this->_resolve_user($document->getOwnerID());
$mimetypeid=$document->getMimeTypeID();
if (!array_key_exists($mimetypeid, $mime_cache))
{
$type=KTMime::getMimeTypeName($mimetypeid);
$icon=KTMime::getIconPath($mimetypeid);
$display=KTMime::getFriendlyNameForString($type);
$mime_cache[$mimetypeid] = array(
'type'=>$type,
'icon'=>$icon,
'display'=>$display
);
}
$mimeinfo=$mime_cache[$mimetypeid];
$workflow='n/a';
$state='n/a';
$wf = KTWorkflowUtil::getWorkflowForDocument($document);
if (!is_null($wf) && !PEAR::isError($wf))
{
$workflow=$wf->getHumanName();
$ws=KTWorkflowUtil::getWorkflowStateForDocument($document);
if (!is_null($ws) && !PEAR::isError($ws))
{
$state=$ws->getHumanName();
}
}
if ($wsversion >= 2)
{
$docTypeId = $document->getDocumentTypeID();
$documentType = DocumentType::get($docTypeId);
$oemDocumentNo = $document->getOemNo();
if (empty($oemDocumentNo)) $oemDocumentNo = 'n/a';
$array = array(
'id' => (int) $document->getId(),
'item_type' => 'D',
'custom_document_no'=>'n/a',
'oem_document_no'=>$oemDocumentNo,
'title' => $document->getName(),
'document_type'=>$documentType->getName(),
'filename' => $document->getFileName(),
'filesize' => $document->getFileSize(),
'created_by' => is_null($created_by)?'n/a':$created_by->getName(),
'created_date' => $created_date,
'checked_out_by' => is_null($checked_out_by)?'n/a':$checked_out_by->getName(),
'checked_out_date' => $checked_out_date,
'modified_by' => is_null($modified_by)?'n/a':$modified_by->getName(),
'modified_date' => $modified_date,
'owned_by' => is_null($owned_by)?'n/a':$owned_by->getName(),
'version' => $document->getMajorVersionNumber() . '.' . $document->getMinorVersionNumber(),
'content_id' => $document->getContentVersionId(),
'is_immutable'=> $document->getImmutable()?'true':'false',
'permissions' => KTAPI_Document::get_permission_string($document),
'workflow'=> $workflow,
'workflow_state'=> $state,
'mime_type' => $mime_cache[$mimetypeid]['type'],
'mime_icon_path' => $mime_cache[$mimetypeid]['icon'],
'mime_display' => $mime_cache[$mimetypeid]['display'],
'storage_path' => $document->getStoragePath(),
);
if($wsversion>=3){
$document->switchToRealCore();
$array['linked_document_id'] = $document->getLinkedDocumentId();
$document->switchToLinkedCore();
if($document->isSymbolicLink()){
$array['item_type'] = "S";
}
}
$array['items']=array();
if($wsversion<3 || (strpos($what,'D') !== false && !$document->isSymbolicLink()) || ($document->isSymbolicLink() && strpos($what,'S') !== false)){
$contents[] = $array;
}
}
else
{
$contents[] = array(
'id' => (int) $document->getId(),
'item_type'=>'D',
'title'=>$document->getName(),
'creator'=>is_null($created_by)?'n/a':$created_by->getName(),
'checkedoutby'=>is_null($checked_out_by)?'n/a':$checked_out_by->getName(),
'modifiedby'=>is_null($modified_by)?'n/a':$modified_by->getName(),
'filename'=>$document->getFileName(),
'size'=>$document->getFileSize(),
'major_version'=>$document->getMajorVersionNumber(),
'minor_version'=>$document->getMinorVersionNumber(),
'storage_path'=>$document->getStoragePath(),
'mime_type'=>$mime_cache[$mimetypeid]['type'],
'mime_icon_path'=>$mime_cache[$mimetypeid]['icon'],
'mime_display'=>$mime_cache[$mimetypeid]['display'],
'items'=>array(),
'workflow'=>$workflow,
'workflow_state'=>$state
);
}
}
}
}
return $contents;
}
/**
* This adds a shortcut to an existing document to the current folder
*
* @author KnowledgeTree Team
* @access public
* @param int $document_id The ID of the document to create a shortcut to
* @return KTAPI_Document
*
*/
function add_document_shortcut($document_id){
$user = $this->can_user_access_object_requiring_permission($this->folder, KTAPI_PERMISSION_WRITE);
if (PEAR::isError($user))
{
return $user;
}
$oDocument = Document::get($document_id);
if(PEAR::isError($oDocument)){
return $oDocument;
}
$user = $this->can_user_access_object_requiring_permission($oDocument, KTAPI_PERMISSION_READ);
if (PEAR::isError($user))
{
return $user;
}
$document = KTDocumentUtil::createSymbolicLink($document_id,$this->folder,$user);
if (PEAR::isError($document))
{
return new PEAR_Error(KTAPI_ERROR_INTERNAL_ERROR . ' : ' . $document->getMessage());
}
return new KTAPI_Document($this->ktapi,$this,$document);
}
/**
* This adds a shortcut pointing to an existing folder to the current folder
*
* @author KnowledgeTree Team
* @access public
* @param int $folder_id The ID of the folder to create a shortcut to
* @return KTAPI_Folder
*/
function add_folder_shortcut($folder_id){
$user = $this->can_user_access_object_requiring_permission($this->folder, KTAPI_PERMISSION_WRITE);
if (PEAR::isError($user))
{
return $user;
}
$oFolder = Folder::get($folder_id);
if(PEAR::isError($oFolder)){
return $oFolder;
}
$user = $this->can_user_access_object_requiring_permission($oFolder, KTAPI_PERMISSION_READ);
if (PEAR::isError($user))
{
return $user;
}
$folder = & KTFolderUtil::createSymbolicLink($folder_id,$this->folder,$user);
if (PEAR::isError($folder))
{
return new PEAR_Error(KTAPI_ERROR_INTERNAL_ERROR . ' : ' . $folder->getMessage());
}
return new KTAPI_Folder($this->ktapi,$folder);
}
/**
* This adds a document to the current folder.
*
* <code>
* $kt = new KTAPI();
* $kt->start_session("admin", "admin");
* $folder = $kt->get_folder_by_name("My New folder");
* $res = $folder->add_document("Test Document", "test.txt", "Default", $tmpfname);
* </code>
*
* @author KnowledgeTree Team
* @access public
* @param string $title This is the title for the file in the repository.
* @param string $filename This is the filename in the system for the file.
* @param string $documenttype This is the name or id of the document type. It first looks by name, then by id.
* @param string $tempfilename This is a reference to the file that is accessible locally on the file system.
* @return KTAPI_Document
*/
function add_document($title, $filename, $documenttype, $tempfilename)
{
if (!is_file($tempfilename))
{
return new PEAR_Error('File does not exist.');
}
$user = $this->can_user_access_object_requiring_permission($this->folder, KTAPI_PERMISSION_WRITE);
if (PEAR::isError($user))
{
return $user;
}
//KTS-4016: removed the replacing of special characters from the title as they should be allowed there
//$title = KTUtil::replaceInvalidCharacters($title);
$filename = basename($filename);
$filename = KTUtil::replaceInvalidCharacters($filename);
$documenttypeid = KTAPI::get_documenttypeid($documenttype);
if (PEAR::isError($documenttypeid))
{
$config = KTCache::getSingleton();
$defaultToDefaultDocType = $config->get('webservice/useDefaultDocumentTypeIfInvalid',true);
if ($defaultToDefaultDocType)
{
$documenttypeid = KTAPI::get_documenttypeid('Default');
}
else
{
return new KTAPI_DocumentTypeError('The document type could not be resolved or is disabled: ' . $documenttype);
}
}
$options = array(
'contents' => new KTFSFileLike($tempfilename),
'temp_file' => $tempfilename,
'novalidate' => true,
'documenttype' => DocumentType::get($documenttypeid),
'description' => $title,
'metadata'=>array(),
'cleanup_initial_file' => true
);
DBUtil::startTransaction();
$document =& KTDocumentUtil::add($this->folder, $filename, $user, $options);
if (PEAR::isError($document))
{
DBUtil::rollback();
return new PEAR_Error(KTAPI_ERROR_INTERNAL_ERROR . ' : ' . $document->getMessage());
}
DBUtil::commit();
KTUploadManager::temporary_file_imported($tempfilename);
return new KTAPI_Document($this->ktapi, $this, $document);
}
/**
* This adds a subfolder folder to the current folder.
*
* <code>
* <?php
* $kt = new KTAPI();
* $kt->start_session("admin", "admin");
* $root = $kt->get_root_folder();
* $root->add_folder("My New folder");
* ?>
* </code>
*
* @author KnowledgeTree Team
* @access public
* @param string $foldername
* @return KTAPI_Folder
*/
function add_folder($foldername)
{
$user = $this->can_user_access_object_requiring_permission($this->folder, KTAPI_PERMISSION_ADD_FOLDER);
if (PEAR::isError($user))
{
return $user;
}
$foldername = KTUtil::replaceInvalidCharacters($foldername);
DBUtil::startTransaction();
$result = KTFolderUtil::add($this->folder, $foldername, $user);
if (PEAR::isError($result))
{
DBUtil::rollback();
return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $result);
}
DBUtil::commit();
$folderid = $result->getId();
return $this->ktapi->get_folder_by_id($folderid);
}
/**
* This deletes the current folder.
*
* <code>
* $kt = new KTAPI();
* $kt->start_session("admin", "admin");
* $folder = $kt->get_folder_by_name("My New folder");
* $folder->delete("It was getting old!");
* </code>
*
* @author KnowledgeTree Team
* @access public
* @param string $reason
*/
function delete($reason)
{
$user = $this->can_user_access_object_requiring_permission($this->folder, KTAPI_PERMISSION_DELETE);
if (PEAR::isError($user))
{
return $user;
}
if ($this->folderid == 1)
{
return new PEAR_Error('Cannot delete root folder!');
}
DBUtil::startTransaction();
$result = KTFolderUtil::delete($this->folder, $user, $reason);
if (PEAR::isError($result))
{
DBUtil::rollback();
return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $result);
}
DBUtil::commit();
}
/**
* This renames the folder
*
* @author KnowledgeTree Team
* @access public
* @param string $newname
*/
function rename($newname)
{
$user = $this->can_user_access_object_requiring_permission($this->folder, KTAPI_PERMISSION_RENAME_FOLDER);
if (PEAR::isError($user))
{
return $user;
}
$newname = KTUtil::replaceInvalidCharacters($newname);
DBUtil::startTransaction();
$result = KTFolderUtil::rename($this->folder, $newname, $user);
if (PEAR::isError($result))
{
DBUtil::rollback();
return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $result);
}
DBUtil::commit();
}
/**
* This moves the folder to another location.
*
* @author KnowledgeTree Team
* @access public
* @param KTAPI_Folder $ktapi_target_folder
* @param string $reason
*/
function move($ktapi_target_folder, $reason='')
{
assert(!is_null($ktapi_target_folder));
assert(is_a($ktapi_target_folder,'KTAPI_Folder'));
$user = $this->ktapi->get_user();
$target_folder = $ktapi_target_folder->get_folder();
$result = $this->can_user_access_object_requiring_permission($target_folder, KTAPI_PERMISSION_WRITE);
if (PEAR::isError($result))
{
return $result;
}
DBUtil::startTransaction();
$result = KTFolderUtil::move($this->folder, $target_folder, $user, $reason);
if (PEAR::isError($result))
{
DBUtil::rollback();
return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $result);
}
// regenerate internal folder object
$res = $this->updateObject();
if (PEAR::isError($res))
{
DBUtil::rollback();
return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $result);
}
DBUtil::commit();
}
/**
* This copies a folder to another location.
*
* <code>
* $root = $this->ktapi->get_root_folder();
* $folder = $root->add_folder("Test folder");
* $new_folder = $root->add_folder("New test folder");
* $res = $folder->copy($new_folder, "Test copy");
* </code>
*
* @author KnowledgeTree Team
* @access public
* @param KTAPI_Folder $ktapi_target_folder
* @param string $reason
*/
function copy($ktapi_target_folder, $reason='')
{
assert(!is_null($ktapi_target_folder));
assert(is_a($ktapi_target_folder,'KTAPI_Folder'));
$user = $this->ktapi->get_user();
$target_folder = $ktapi_target_folder->get_folder();
$result =$this->can_user_access_object_requiring_permission($target_folder, KTAPI_PERMISSION_WRITE);
if (PEAR::isError($result))
{
return $result;
}
DBUtil::startTransaction();
$result = KTFolderUtil::copy($this->folder, $target_folder, $user, $reason);
if (PEAR::isError($result))
{
DBUtil::rollback();
return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $result);
}
DBUtil::commit();
}
/**
* This returns all permissions linked to the folder.
*
* @author KnowledgeTree Team
* @access public
* @return array
*/
function get_permissions()
{
return new PEAR_Error('TODO');
}
/**
* This returns the transaction history for the document.
*
* @author KnowledgeTree Team
* @access public
* @return array The list of transactions | a PEAR_Error on failure
*/
function get_transaction_history()
{
$sQuery = 'SELECT DTT.name AS transaction_name, U.name AS username, DT.comment AS comment, DT.datetime AS datetime ' .
'FROM ' . KTUtil::getTableName('folder_transactions') . ' AS DT INNER JOIN ' . KTUtil::getTableName('users') . ' AS U ON DT.user_id = U.id ' .
'INNER JOIN ' . KTUtil::getTableName('transaction_types') . ' AS DTT ON DTT.namespace = DT.transaction_namespace ' .
'WHERE DT.folder_id = ? ORDER BY DT.datetime DESC';
$aParams = array($this->folderid);
$transactions = DBUtil::getResultArray(array($sQuery, $aParams));
if (is_null($transactions) || PEAR::isError($transactions))
{
return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $transactions );
}
$config = KTConfig::getSingleton();
$wsversion = $config->get('webservice/version', LATEST_WEBSERVICE_VERSION);
foreach($transactions as $key=>$transaction)
{
$transactions[$key]['version'] = (float) $transaction['version'];
}
return $transactions;
}
/**
* Gets the KTAPI_Folder object of this instance
*
* @author KnowledgeTree Team
* @access public
* @return KTAPI_Folder
*/
public function getObject()
{
return $this->folder;
}
/**
* Updates the Folder object
*/
private function updateObject()
{
$folder = &Folder::get($this->folderid);
if (is_null($folder) || PEAR::isError($folder))
{
return new KTAPI_Error(KTAPI_ERROR_FOLDER_INVALID, $folder);
}
$this->folder = $folder;
}
/**
* Get the role allocation for the folder
*
* @return KTAPI_RoleAllocation Instance of the role allocation object
*/
public function getRoleAllocation()
{
$allocation = KTAPI_RoleAllocation::getAllocation($this->ktapi, $this);
return $allocation;
}
/**
* Get the permission allocation for the folder
*
* @return KTAPI_PermissionAllocation Instance of the permission allocation object
*/
public function getPermissionAllocation()
{
$allocation = KTAPI_PermissionAllocation::getAllocation($this->ktapi, $this);
return $allocation;
}
/**
* Determines whether the currently logged on user is subscribed
*
* @author KnowledgeTree Team
* @access public
* @return boolean
*/
public function isSubscribed()
{
$subscriptionType = SubscriptionEvent::subTypes('Folder');
$user = $this->ktapi->get_user();
$folder = $this->folder;
$result = Subscription::exists($user->getId(), $folder->getId(), $subscriptionType);
return $result;
}
/**
*
* @author KnowledgeTree Team
* @access public
*
*/
public function unsubscribe()
{
if (!$this->isSubscribed())
{
return TRUE;
}
$subscriptionType = SubscriptionEvent::subTypes('Folder');
$user = $this->ktapi->get_user();
$folder = $this->folder;
$subscription = & Subscription::getByIDs($user->getId(), $folder->getId(), $subscriptionType);
$result = $subscription->delete();
if(PEAR::isError($result)){
return $result->getMessage();
}
if($result){
return $result;
}
return $_SESSION['errorMessage'];
}
/**
* Subscribes the currently logged in KTAPI user to the folder
*
* @author KnowledgeTree Team
* @access public
*
*/
public function subscribe()
{
if ($this->isSubscribed())
{
return TRUE;
}
$subscriptionType = SubscriptionEvent::subTypes('Folder');
$user = $this->ktapi->get_user();
$folder = $this->folder;
$subscription = new Subscription($user->getId(), $folder->getId(), $subscriptionType);
$result = $subscription->create();
if(PEAR::isError($result)){
return $result->getMessage();
}
if($result){
return $result;
}
return $_SESSION['errorMessage'];
}
}
?>