📄 bulkaction.php
字号:
<?php
/**
* $Id: bulkaction.php 9572 2008-10-13 10:49:58Z kevin_fourie $
*
* 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(KT_LIB_DIR . '/actions/actionregistry.inc.php');
require_once(KT_LIB_DIR . '/workflow/workflowutil.inc.php');
require_once(KT_LIB_DIR . '/dispatcher.inc.php');
require_once(KT_LIB_DIR . '/browse/browseutil.inc.php');
require_once(KT_LIB_DIR . '/actions/entitylist.php');
require_once(KT_LIB_DIR . '/foldermanagement/folderutil.inc.php');
require_once(KT_LIB_DIR . '/documentmanagement/documentutil.inc.php');
require_once(KT_LIB_DIR . '/widgets/forms.inc.php');
require_once(KT_LIB_DIR . "/util/sanitize.inc");
class KTBulkAction extends KTStandardDispatcher {
var $sName;
var $sDescription;
var $_sDisablePermission;
var $bAllowInAdminMode = false;
var $sHelpPage = 'ktcore/browse.html';
var $sSection = 'view_details';
var $_bMutator = false;
var $_bMutationAllowedByAdmin = true;
var $sIconClass;
// not 'sShowPermission' - mass actions are always shown
// this is used to check against individual entities
var $_sPermission = 'ktcore.permissions.read';
function KTBulkAction($oUser = null, $oPlugin = null) {
$this->oEntityList = null;
$this->oActiveEntityList = null;
$this->oUser =& $oUser;
$this->oPlugin =& $oPlugin;
$this->aBreadcrumbs = array(
array('action' => 'browse', 'name' => _kt('Browse')),
);
$this->persistParams('fEntityListCode');
parent::KTStandardDispatcher();
}
function setEntityList(&$oEntityList) {
$this->oEntityList =& $oEntityList;
}
function setUser(&$oUser) {
$this->oUser =& $oUser;
}
function _show() {
return true;
}
function getURL() {
$oKTConfig =& KTConfig::getSingleton();
$sExt = '.php';
if (KTUtil::arrayGet($_SERVER, 'kt_no_extensions')) {
$sExt = '';
}
if ($oKTConfig->get('KnowledgeTree/pathInfoSupport')) {
return sprintf('%s/action%s/%s', $GLOBALS['KTRootUrl'], $sExt, $this->sName);
} else {
return sprintf('%s/action%s?kt_path_info=%s', $GLOBALS['KTRootUrl'], $sExt, $this->sName);
}
}
function getInfo() {
if ($this->_show() === false) {
return null;
}
$url = $this->getURL();
$aInfo = array(
'description' => $this->sDescription,
'name' => $this->getDisplayName(),
'ns' => $this->sName,
'url' => $url,
'icon_class' => $this->sIconClass,
);
$aInfo = $this->customiseInfo($aInfo);
return $aInfo;
}
function getName() {
return sanitizeForSQLtoHTML($this->sName);
}
function getDisplayName() {
return sanitizeForSQLtoHTML($this->sDisplayName);
}
function getDescription() {
return sanitizeForSQLtoHTML($this->sDescription);
}
function customiseInfo($aInfo) {
return $aInfo;
}
// helper function
function _getNames($aIds, $sEntity) {
if(count($aIds)) {
$aNames = array();
$aFunc = array($sEntity, 'get');
foreach($aIds as $id) {
$oE =& call_user_func($aFunc, $id);
$name = array();
$name['name'] = $oE->getName();
//add shortcut notice if the entity is a shortcut
if($oE->isSymbolicLink()){
$name['notice'] = _kt("Shortcut");
}
$aNames[] = $name;
}
return $aNames;
} else {
return array();
}
}
/**
* Checks if there are symlinks that are linking to items in the current list
* Useful if you want to prompt the user with a confirmation because they're
* automatically deleted when their targets are deleted or archived.
*
* @return boolean
*/
function symlinksLinkingToCurrentList(){
$symlinksPresent = false;
foreach($this->oActiveEntityList->getDocumentIds() as $iDocument){
$oDocument = Document::get($iDocument);
if(count($oDocument->getSymbolicLinks()) > 0){
$symlinksPresent = true;
break;
}
}
if($symlinksPresent == false){
foreach($this->oActiveEntityList->getFolderIds() as $iFolder){
$oStartFolder = Folder::get($iFolder);
$aRemainingFolders = array($oStartFolder->getId());
while (!empty($aRemainingFolders)) {
$iFolderId = array_pop($aRemainingFolders);
$oFolder = Folder::get($iFolderId);
if(count($oFolder->getSymbolicLinks()) > 0){
$symlinksPresent = true;
break;
}
$aChildDocs = Document::getList(array('folder_id = ?',array($iFolderId)));
foreach ($aChildDocs as $oDoc) {
if(count($oDoc->getSymbolicLinks()) > 0){
$symlinksPresent = true;
break;
}
}
$aCFIds = Folder::getList(array('parent_id = ?', array($iFolderId)), array('ids' => true));
$aRemainingFolders = kt_array_merge($aRemainingFolders, $aCFIds);
}
}
}
return $symlinksPresent;
}
/**
* checks a folderList for shortcuts and queries the repositories for all folders
* that are somehow connected to these folders.
*/
function getLinkingEntities($aFolderList){
$aSearchFolders = array();
if(!empty($aFolderList)){
foreach($aFolderList as $oFolderItem){
if(Permission::userHasFolderReadPermission($oFolderItem)){
// If it is a shortcut, we should do some more searching
if($oFolderItem->isSymbolicLink()){
$oFolderItem = $oFolderItem->getLinkedFolder();
$aSearchFolders[] = $oFolderItem->getID();
}
}
}
}
$aLinkingFolders = array();
$aSearchCompletedFolders = array();
$count = 0;
while(count($aSearchFolders)>0){
$count++;
$oFolder = Folder::get(array_pop($aSearchFolders));
$sFolderId = $oFolder->getId();
// Get all the folders within the current folder
$sWhereClause = "parent_folder_ids = '{$sFolderId}' OR
parent_folder_ids LIKE '{$sFolderId},%' OR
parent_folder_ids LIKE '%,{$sFolderId},%' OR
parent_folder_ids LIKE '%,{$sFolderId}'";
$aFolderList = $this->oFolder->getList($sWhereClause);
foreach($aFolderList as $oFolderItem){
if($oFolderItem->isSymbolicLink()){
$oFolderItem = $oFolderItem->getLinkedFolder();
}
if(Permission::userHasFolderReadPermission($oFolderItem)){
if($aSearchCompletedFolders[$oFolderItem->getID()] != true){
$aSearchFolders[] = $oFolderItem->getID();
$aSearchCompletedFolders[$oFolderItem->getID()] = true;
}
}
}
if(!isset($aLinkingFolders[$oFolder->getId()])){
$aLinkingFolders[$oFolder->getId()] = $oFolder;
}
}
return $aLinkingFolders;
}
// doesn't actually do checks, as they have to be performed per-entity
function check() {
// not necessarily coming from a folder...
$iFolderId = KTUtil::arrayGet($_REQUEST, 'fFolderId', 1);
$this->oFolder = Folder::get($iFolderId);
//$this->oFolder =& $this->oValidator->validateFolder($_REQUEST['fFolderId']);
$aOptions = array(
'final' => false,
'documentaction' => 'viewDocument',
'folderaction' => 'browse',
);
$this->aBreadcrumbs = array(array('name'=>_kt('Bulk Actions')),
array('name'=>$this->getDisplayName()));
return true;
}
// check the entire entity list. this needn't be overrided at any point
function check_entities() {
$aFailed = array('documents' => array(), 'folders' => array());
$aSucceeded = array('documents' => array(), 'folders' => array());
if(!$this->oEntityList) {
return true;
}
foreach($this->oEntityList->getDocumentIds() as $iId) {
$oDocument =& Document::get($iId);
if(PEAR::isError($oDocument)) {
$aFailed['documents'][] = array($iId, _kt('No such document'));
} else {
$res = $this->check_entity($oDocument);
// all these checks allow a return from check_entity of:
// 1. a PEAR error, indicating failure, with the message in the error
// 2. false, for unknown error
// 3. true, to pass
if(PEAR::isError($res)) {
$aFailed['documents'][] = array($oDocument->getName(), $res->getMessage());
} else if($res === false) {
$aFailed['documents'][] = array($oDocument->getName(), _kt('Failed (unknown reason)'));
} else {
$aSucceeded['documents'][] = $oDocument->getId();
}
}
}
foreach($this->oEntityList->getFolderIds() as $iId) {
$oFolder =& Folder::get($iId);
if(PEAR::isError($oFolder)) {
$aFailed['folders'][] = array($iId, _kt('No such folder'));
} else {
$res = $this->check_entity($oFolder);
if(PEAR::isError($res)) {
$aFailed['folders'][] = array($oFolder->getName(), $res->getMessage());
} else if($res === false) {
$aFailed['folders'][] = array($oFolder->getName(), _kt('Failed (unknown reason)'));
} else {
$aSucceeded['folders'][] = $oFolder->getId();
}
}
}
$this->oActiveEntityList = new KTEntityList($aSucceeded['documents'], $aSucceeded['folders']);
$this->aFailed = $aFailed;
return count($aSucceeded['documents']) + count($aSucceeded['folders']);
}
// iterate over all entites to act on them
function perform_action_on_list() {
$this->aActionResults = array('folders'=>array(), 'documents'=>array());
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -