mydropdocumentspage.php

来自「PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。」· PHP 代码 · 共 706 行 · 第 1/2 页

PHP
706
字号
<?php
/**
 * $Id: $
 *
 * KnowledgeTree Community Edition
 * Document Management Made Simple
 * Copyright (C) 2008 KnowledgeTree Inc.
 * Portions copyright The Jam Warehouse Software (Pty) Limited
 *
 * 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.
 * Contributor( s): ______________________________________
 *
 */

require_once("config/dmsDefaults.php");
require_once(KT_DIR .  "/ktapi/ktapi.inc.php");
require_once(KT_LIB_DIR . "/plugins/plugin.inc.php");
require_once(KT_LIB_DIR . "/plugins/pluginregistry.inc.php");
require_once(KT_LIB_DIR . "/dashboard/dashlet.inc.php");
require_once(KT_DIR . "/plugins/ktcore/KTFolderActions.php");
require_once(KT_DIR . "/ktapi/KTAPIFolder.inc.php");
require_once(KT_LIB_DIR . "/roles/Role.inc");
require_once(KT_LIB_DIR . "/roles/roleallocation.inc.php");
require_once(KT_LIB_DIR . "/permissions/permissionutil.inc.php");
require_once(KT_LIB_DIR . '/mime.inc.php');
/* This page is run via an AJAX call from the update.js for this plugin.
 * It checks to see if both the dropdocuments folder and the users personal folder exist.
 * If they don't, it creates them and assigns permission and roles accordingly.
 * If the dropdocuments folder does exist it checks if the WorkSpaceOwner role exists.
 * If the role exists it assigns the current user to the role on the dropdocuments folder.
 * Therefore any users running the plugin after the dropdocuments folder has been created will have access to it too.
 * The underlying logic is that everyone is assigned to the WorkSpaceOwner Role, they have all permission except
 * Delete, Rename Folder, Manage security and Manage workflow on the dropdocuments folder.
 * This role is then assigned to their personal folder too (which is named according to their username) and is overidden
 * to give only the current user full rights to their folder.
 * Essentially everyone can look at the dropdocuments folder but will only see their own folder within it.
 */

class MyDropDocumentsPage extends KTStandardDispatcher {

    function do_main() {

       $iRootID = (int)1;
       $oUser = $this->oUser;
       $sUserName = (string)$this->oUser->getUserName();
       $this->ktapi = new KTAPI();
       $this->session = $this->ktapi->start_system_session();

       if(!Folder::FolderExistsName('DroppedDocuments', $iRootID))
       {

            		$root=$this->ktapi->get_root_folder();

					//Create dropdocuments folder
					$userFolder = $root->add_folder('DroppedDocuments');

					//In order to stop permission inheritance a copy of the parent permission object is created.
					//This copy is then used to set separate permissions for this folder.
					KTPermissionUtil::copyPermissionObject($userFolder->get_folder());

					//If WorkSpaceOwner role doesn't exist, create it
					if(!$this->roleExistsName('WorkSpaceOwner'))
		       		{
		       			$oWorkSpaceOwnerRole = $this->createRole('WorkSpaceOwner');
		       			if ($oWorkSpaceOwnerRole == null)
		       			{
		       				$this->session->logout();
		       				return _kt('Error: Failed to create WorkSpaceOwner Role');
		       			}
		       		}

	       			//$root=$this->ktapi->get_root_folder();
	       			//$personalFolder = $root->get_folder_by_name('/dropdocuments/'.$sUserName);

	       			//Get the folder object
	       			$userFolderObject = $userFolder->get_folder();

	       			//Get the permission object from the dropdocuments folder object
	       			$oUserPO = KTPermissionObject::get($userFolderObject->getPermissionObjectId());

	       			//Check to see if there are duplicate WorkSpaceOwner roles.
	       			if (count($this->getRoleIdByName('WorkSpaceOwner')) > 1)
	       			{
	       				$this->session->logout();
	       				return _kt('Error: cannot set user role permissions: more than one role named \'WorkSpaceOwner\' exists');

	       			}

	       			//call the function to set the permission on the dropdocuments folder
	       			$this->setUserDocsPermissions($oUserPO);

					//Assign the current user to the WorkSpaceOwner role
	                $this->setUserDocsRoleAllocation($userFolderObject);

       }
       else
       {

       		$root = $this->ktapi->get_root_folder();
       		$userFolder = $root->get_folder_by_name('/DroppedDocuments');

       		//Get the dropdocuments folder object
       		$userFolderObject = $userFolder->get_folder();

       		if(!$this->roleExistsName('WorkSpaceOwner'))
       		{

       			$oWorkSpaceOwnerRole = $this->createRole('WorkSpaceOwner');
       			if ($oWorkSpaceOwnerRole == null)
       			{
       				$this->session->logout();
       				return _kt('Error: Failed to create WorkSpaceOwner Role');
       			}

       			//set permissions
       			$oUserPO = KTPermissionObject::get($userFolderObject->getPermissionObjectId());
       			$this->setUserDocsPermissions($oUserPO);
       			//assign current user to role
       			$this->setUserDocsRoleAllocation($userFolderObject);
       		}
       		else
       		{

       			//update WrokSpaceOwner role to include current user
       			$this->updateUserDocsRoleAllocation($userFolderObject);
       		}

       }

       $iUserDocsFolderID = $this->getFolderID('DroppedDocuments');
       $oUserDocsFolder = Folder::get($iUserDocsFolderID);

       if(!Folder::FolderExistsName($sUserName, $iUserDocsFolderID))
       {


            		$root=$this->ktapi->get_root_folder();
            		$userDocsFolder = $root->get_folder_by_name('/DroppedDocuments');

            		//create the personal folder. (Use the username to create it)
            		$personalFolder = $userDocsFolder->add_folder($sUserName);

            		//Copy the permission object to stop permission inheritance
            		KTPermissionUtil::copyPermissionObject($personalFolder->get_folder());

            		//The role should exist by now.
            		//In both the if and else statements for the dropdocuments above the role is created
            		//If its doesn't exist by now there is an error
 					if(!$this->roleExistsName('WorkSpaceOwner'))
       				{

		       					$this->session->logout();
		       					return _kt('Error: WorkSpaceOwner Role not setup, cannot assign to Personal Folder');

       				}

   					$personalFolderRole = $root->get_folder_by_name('/DroppedDocuments/'.$sUserName);
   					$PersonalFolderObject = ($personalFolderRole->get_folder());

   					//Get permission object
   					$oPO = KTPermissionObject::get($PersonalFolderObject->getPermissionObjectId());

   					//Check for duplicate WorkSpaceOwner roles
   					if (count($this->getRoleIdByName('WorkSpaceOwner')) > 1)
   					{
   						$this->session->logout();
   						return _kt('Error: cannot set personal folder role permissions: more than one role named \'WorkSpaceOwner\' exists');

	       			}

	       			$this->setPersonalFolderPermissions($oPO);

					$this->updatePersonalFolderRoleAllocation($PersonalFolderObject);


            	//folder just created so no top list of last modified documents

       		$iMyDocsFolderID = $this->getFolderID($sUserName);
       		$this->session->logout();
       		return _kt('<span class="descriptiveText"> You do not have any dropped documents </span><br><br><br>');


       }

       else //if personal folder does exist
       {
      		//Getting personal folder id
      		$iMyDocsFolderID = $this->getFolderID($sUserName);


      		if(!$this->roleExistsName('WorkSpaceOwner'))
       		{
       			$this->session->logout();
       			return _kt('Error: WorkSpaceOwner Role does not exist');
       		}
       		else
       		{

       			$oTempPersonalFolder = $root->get_folder_by_name('/DroppedDocuments/'.$sUserName);
       			$oPersonalFolder = $oTempPersonalFolder->get_folder();
       			//update WorkSpaceOwner role to include current user

       			//Get permission object
   				$oPO = KTPermissionObject::get($oPersonalFolder->getPermissionObjectId());

       			$this->setPersonalFolderPermissions($oPO);

       			$this->updatePersonalFolderRoleAllocation($oPersonalFolder);

       		}

       		$fullPath = $oUserDocsFolder->getFullPath() . '/' . $sUserName;

       		$aExternalWhereClauses[] = '(DT.transaction_namespace IN (?,?,?) AND (D.full_path LIKE "'.$fullPath.'/%"))';
       		$aExternalWhereParams[] = 'ktcore.transactions.create';
        	$aExternalWhereParams[] = 'ktcore.transactions.check_in';
			$aExternalWhereParams[] = 'ktcore.transactions.event';


        	$aDocumentTransactions = $this->getTransactionsMatchingQuery($oUser, '', $aExternalWhereClauses, $aExternalWhereParams);
			if (empty($aDocumentTransactions))
			{
				$this->session->logout();
				return _kt('<span class="descriptiveText"> You do not have any dropped documents </span><br><br><br>');
			}

        	$maxcount = 5;

       		$sReturnTable =  '<span class="descriptiveText">'._kt('Recently Dropped Documents').'</span>
       				<table width="100%" class="kt_collection drop_box" cellspacing="0">

					<thead>
    				<tr>
        			<th width="100%">'._kt('Document').'</th>
        			<th width="1%">'._kt('Date Dropped').'</th>
        			</tr>
					</thead>
					<tbody>';

			$sOddorEven = '';
			$count = 1;
			$rendered = array();
			foreach ($aDocumentTransactions as $aRow)
			{
			    $documentId = $aRow['document_id'];
			    if (in_array($documentId, $rendered))
			    {
			        continue;
			    }

			    $rendered[] = $documentId;
    			$oDocument = Document::get($documentId);

				$sContentType = KTMime::getIconPath($oDocument->getMimeTypeID());
				$aAnchorData = $this->getDocInfo($documentId);
				$sLink = $aAnchorData[0];
				$sShortDocName = $sDocName = $aAnchorData[1];

				$iDocLength = strlen($sDocName);
				$iMax = 40;
				if ( $iDocLength > $iMax )
				{
					$sShortDocName = substr($sDocName, 0, $iMax) . '...';
				}

				$sOddorEven = ($count%2 == 0)?'even':'odd';

    			$sReturnTable .= '<tr class="'.$sOddorEven.'">'.
        						 '<td width="100%"><span class="contenttype '.$sContentType.'"><a title="'.$sDocName.'" href='.$sLink.'>'.$sShortDocName.'</a></span></td>'.
        						 '<td width="1%">'.$aRow['datetime'].'</td>'.
    							 '</tr>';
    			if (++$count > 5)
    			{
    			    break;
    			}
			}

			$location = 'browse.php?fFolderId='.$iMyDocsFolderID;
			$sReturnTable .= '</tbody>'.
							 '</table>'.
							 '<br>'.
							 '<a href="'.$location.'">'._kt(' View All').' </a><br><br>';
			$this->session->logout();

       		return $sReturnTable;

       }
	}

    function handleOutput($sOutput) {
        print $sOutput;
    }

    //This function is used to set the permission on the dropdocuments folder
	function setUserDocsPermissions($oUserPO)
	{
		//arrays returned from get Role ID's
		$aWorkSpaceOwnerRoleID = $this->getRoleIdByName('WorkSpaceOwner');
		$aAdminGroupID = $this->getGroupIdByName('System Administrators');

		//arrays used to make integers for $aAllowed array variable
		$iWorkSpaceOwnerRoleID = $aWorkSpaceOwnerRoleID[0]['id'];
		$iAdminGroupID = $aAdminGroupID[0]['id'];
		//$aBothAllowed is used to give permissions to the admin group and the WorkSpaceOwner role
		$aBothAllowed = array('group' => array($iAdminGroupID), 'role' => array($iWorkSpaceOwnerRoleID));

		//$aAdminAllowed is used to give permissions to the admin group only
		$aAdminAllowed = array('group' => array($iAdminGroupID));

		//Get the list of permissions
		$aPermissions = KTPermission::getList();

		foreach ($aPermissions as $oPermission)
		{
   			//If the permission is not one of the below then both are allowed the permission
   			//Otherwise only the admin group is allowed the permission
   			if($oPermission->getHumanName() != 'Delete' && $oPermission->getHumanName() != 'Rename Folder'
   				&& $oPermission->getHumanName() != 'Manage security' && $oPermission->getHumanName() != 'Manage workflow')
   			{
   				KTPermissionUtil::setPermissionForId($oPermission, $oUserPO, $aBothAllowed);
   			}
   			else
   			{
   				KTPermissionUtil::setPermissionForId($oPermission, $oUserPO, $aAdminAllowed);
   			}
   		}

        //UPdate the permission lookup
        KTPermissionUtil::updatePermissionLookupForPO($oUserPO);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?