From 4672f890d3ce0de363caa642bee4223e33a332e5 Mon Sep 17 00:00:00 2001 From: bshuttle Date: Tue, 31 Jan 2006 09:39:04 +0000 Subject: [PATCH] fix for KTS-61: assigning workflows to folders. --- config/tableMappings.inc | 1 + lib/actions/folderaction.inc.php | 10 +++++++++- lib/templating/kt3template.inc.php | 3 ++- plugins/ktstandard/KTWorkflowAssociation.php | 8 +++----- plugins/ktstandard/workflow/FolderAssociator.php | 127 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ templates/ktstandard/workflow/folderconfigure.smarty | 26 ++++++++++++++++++++++++++ 6 files changed, 168 insertions(+), 7 deletions(-) create mode 100644 plugins/ktstandard/workflow/FolderAssociator.php create mode 100644 templates/ktstandard/workflow/folderconfigure.smarty diff --git a/config/tableMappings.inc b/config/tableMappings.inc index aed0a40..30c4df6 100644 --- a/config/tableMappings.inc +++ b/config/tableMappings.inc @@ -148,4 +148,5 @@ $default->document_metadata_version_table = "document_metadata_version"; $default->document_content_version_table = "document_content_version"; $default->trigger_selection_table = "trigger_selection"; $default->type_workflow_map_table = "type_workflow_map"; +$default->folder_workflow_map_table = "folder_workflow_map"; ?> diff --git a/lib/actions/folderaction.inc.php b/lib/actions/folderaction.inc.php index 310dda5..51867b7 100644 --- a/lib/actions/folderaction.inc.php +++ b/lib/actions/folderaction.inc.php @@ -113,7 +113,9 @@ class KTFolderAction extends KTStandardDispatcher { function check() { $this->oFolder =& $this->oValidator->validateFolder($_REQUEST['fFolderId']); - + + if ($this->_disable()) { return false; } + if (!is_null($this->_sShowPermission)) { $oPermission =& KTPermission::getByName($this->_sShowPermission); if (!PEAR::isError($oPermission)) { @@ -130,6 +132,12 @@ class KTFolderAction extends KTStandardDispatcher { ); $this->aBreadcrumbs = array_merge($this->aBreadcrumbs, KTBrowseUtil::breadcrumbsForFolder($this->oFolder, $aOptions)); + + $portlet = new KTActionPortlet(_("Folder Actions")); + $aActions = KTFolderActionUtil::getFolderActionsForFolder($this->oFolder, $this->oUser); + $portlet->setActions($aActions,null); + $this->oPage->addPortlet($portlet); + return true; } diff --git a/lib/templating/kt3template.inc.php b/lib/templating/kt3template.inc.php index ae843bb..c303b0c 100644 --- a/lib/templating/kt3template.inc.php +++ b/lib/templating/kt3template.inc.php @@ -178,7 +178,8 @@ class KTPage { function setSection($sSection) { if ($sSection == 'administration') { $this->componentLabel = _('DMS Administration'); - $this->componentClass = 'administration'; + $this->componentClass = 'administration'; + $this->menu['administration']['active'] = 1; } else if ($sSection == 'dashboard') { $this->componentLabel = _('Dashboard'); $this->componentClass = 'dashboard'; diff --git a/plugins/ktstandard/KTWorkflowAssociation.php b/plugins/ktstandard/KTWorkflowAssociation.php index d6f26b9..d175005 100644 --- a/plugins/ktstandard/KTWorkflowAssociation.php +++ b/plugins/ktstandard/KTWorkflowAssociation.php @@ -29,25 +29,22 @@ class KTWorkflowAssociationDelegator { var $_document; function KTWorkflowAssociationDelegator() { - $oKTTriggerRegistry = KTTriggerRegistry::getSingleton(); $aTriggers = $oKTTriggerRegistry->getTriggers('workflow', 'objectModification'); - + // if we have _some_ triggers. if (!empty($aTriggers)) { $sQuery = 'SELECT selection_ns FROM ' . KTUtil::getTableName('trigger_selection'); $sQuery .= ' WHERE event_ns = ?'; $aParams = array('ktstandard.workflowassociation.handler'); $res = DBUtil::getOneResultKey(array($sQuery, $aParams), 'selection_ns'); - + if (PEAR::isError($res)) { $this->_handler = new KTWorkflowAssociationHandler(); } if (array_key_exists($res, $aTriggers)) { $this->_handler = new $aTriggers[$res][0]; } else { - global $default; - $default->log->debug('KTWorkflowAssociationDelegator failed to acquire trigger selection'); $this->_handler = new KTWorkflowAssociationHandler(); } } @@ -109,5 +106,6 @@ $oPluginRegistry->registerPlugin('KTWorkflowAssociationPlugin', 'ktstandard.work /* include others */ require_once('workflow/TypeAssociator.php'); +require_once('workflow/FolderAssociator.php'); ?> diff --git a/plugins/ktstandard/workflow/FolderAssociator.php b/plugins/ktstandard/workflow/FolderAssociator.php new file mode 100644 index 0000000..b726150 --- /dev/null +++ b/plugins/ktstandard/workflow/FolderAssociator.php @@ -0,0 +1,127 @@ +registerTrigger('workflow', 'objectModification', 'FolderWorkflowAssociator', + 'ktstandard.triggers.workflowassociation.folder.handler'); + + $sQuery = 'SELECT selection_ns FROM ' . KTUtil::getTableName('trigger_selection'); + $sQuery .= ' WHERE event_ns = ?'; + $aParams = array('ktstandard.workflowassociation.handler'); + $res = DBUtil::getOneResultKey(array($sQuery, $aParams), 'selection_ns'); + + if ($res == 'ktstandard.triggers.workflowassociation.folder.handler') { + $this->registerAction('folderaction', 'FolderWorkflowAssignmentFolderAction', + 'ktstandard.workflowassociation.folder.action'); + } + } +} + +class FolderWorkflowAssociator extends KTWorkflowAssociationHandler { + function addTrigger($oDocument) { + return $oW = $this->getWorkflowForDoc($oDocument); + } + + function editTrigger($oDocument) { + return $oW = $this->getWorkflowForDoc($oDocument); + } + + function getWorkflowForDoc($oDocument) { + + $sQuery = 'SELECT `workflow_id` FROM ' . KTUtil::getTableName('folder_workflow_map'); + $sQuery .= ' WHERE `folder_id` = ?'; + $aParams = array($oDocument->getFolderID()); + $res = DBUtil::getOneResultKey(array($sQuery, $aParams), 'workflow_id'); + + + if (PEAR::isError($res) || (is_null($res))) { + return KTWorkflowUtil::getWorkflowForDocument($oDocument); // don't remove if moved out. + } + return KTWorkflow::get($res); + } +} + +class FolderWorkflowAssignmentFolderAction extends KTFolderAction { + var $sDisplayName = 'Configure Workflows'; + var $sName = 'ktstandard.workflowassociation.folder.action'; + + var $_sShowPermission = "ktcore.permissions.addFolder"; + + function do_main() { + $this->oPage->setBreadcrumbDetails(_("Configure Workflows for Folder")); + $this->oPage->setTitle(_("Configure Workflows for Folder")); + $oTemplate =& $this->oValidator->validateTemplate('ktstandard/workflow/folderconfigure'); + $fields = array(); + + $aWorkflows = KTWorkflow::getList('start_state_id IS NOT NULL'); + $aVocab = array(); + $aVocab[] = _('No automatic workflow.'); + foreach ($aWorkflows as $oWorkflow) { + $aVocab[$oWorkflow->getId()] = $oWorkflow->getName(); + } + $fieldOptions = array("vocab" => $aVocab); + + // grab the value. + $sQuery = 'SELECT `workflow_id` FROM ' . KTUtil::getTableName('folder_workflow_map'); + $sQuery .= ' WHERE `folder_id` = ?'; + $aParams = array($this->oFolder->getId()); + $res = DBUtil::getOneResultKey(array($sQuery, $aParams), 'workflow_id'); + if (PEAR::isError($res)) { + $res = null; + } + $fields[] = new KTLookupWidget(_('Automatic Workflow'), _('If you specify an automatic workflow, new documents will automatically enter that workflow\'s starting state. Setting this to "No Automatic Workflow" will mean that users can choose the appropriate workflow.'), 'fWorkflowId', $res, $this->oPage, true, null, $fieldErrors, $fieldOptions); + + + $oTemplate->setData(array( + 'context' => &$this, + 'folder_id' => $this->oFolder->getId(), + 'fields' => $fields, + )); + return $oTemplate->render(); + } + + function do_allocate() { + $fWorkflowId = KTUtil::arrayGet($_REQUEST, 'fWorkflowId', null); + + $this->startTransaction(); + + $sQuery = 'DELETE FROM ' . KTUtil::getTableName('folder_workflow_map') . ' WHERE folder_id = ?'; + $aParams = array($this->oFolder->getId()); + DBUtil::runQuery(array($sQuery, $aParams)); + + if (is_null($fWorkflowId)) { + $this->successRedirectToMain(_('Workflow assignment removed.'), 'fFolderId='.$this->oFolder->getId()); + } + + $aOptions = array('noid' => true); + $sTable = KTUtil::getTableName('folder_workflow_map'); + if ($fWorkflowId == null) { $fWorkflowId = null; } + $res = DBUtil::autoInsert($sTable, array( + 'folder_id' => $this->oFolder->getId(), + 'workflow_id' => $fWorkflowId, + ), $aOptions); + + if (PEAR::isError($res)) { + $this->errorRedirectToMain(_('Error assigning workflow.'), 'fFolderId='.$this->oFolder->getId()); + } + + $this->successRedirectToMain(_('Workflow assignment updated.'), 'fFolderId='.$this->oFolder->getId()); + } + +} + + +$oPluginRegistry =& KTPluginRegistry::getSingleton(); +$oPluginRegistry->registerPlugin('KTFolderWorkflowAssociationPlugin', 'ktstandard.workflowassociation.folder.plugin', __FILE__); + + +?> \ No newline at end of file diff --git a/templates/ktstandard/workflow/folderconfigure.smarty b/templates/ktstandard/workflow/folderconfigure.smarty new file mode 100644 index 0000000..45cb331 --- /dev/null +++ b/templates/ktstandard/workflow/folderconfigure.smarty @@ -0,0 +1,26 @@ +

{i18n}Configure Workflows for this Folder{/i18n}

+ +

{i18n}This installation of KnowledgeTree allocates workflows +to documents by their location. To specify the workflow to be used by all documents +directly in this folder, please specify the workflow below. Otherwise, +users will be able to choose the workflow, and some documents may have no workflow +attached.{/i18n}

+ +

{i18n}Note that documents which are moved into this folder +will change to use this workflow, and if their previous workflow was different +they will lose any progress they have made in that workflow.{/i18n}

+ +
+ + +
+{i18n}Select appropriate workflow{/i18n} + +{foreach item=oWidget from=$fields} + {$oWidget->render()} +{/foreach} +
+ +
+
+
\ No newline at end of file -- libgit2 0.21.4