2019-11-04 15:22:11 +00:00
|
|
|
<?php
|
2020-08-20 16:30:16 +00:00
|
|
|
|
2019-11-04 15:22:11 +00:00
|
|
|
/**
|
|
|
|
* Project:
|
|
|
|
* Contenido Content Management System
|
|
|
|
*
|
|
|
|
* Description:
|
|
|
|
* Workflow functions
|
|
|
|
*
|
|
|
|
* Requirements:
|
|
|
|
* @con_php_req 5.0
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* @package Contenido Backend classes
|
|
|
|
* @version 1.8.1
|
|
|
|
* @author Timo Hummel
|
|
|
|
* @copyright four for business AG <www.4fb.de>
|
|
|
|
* @license http://www.contenido.org/license/LIZENZ.txt
|
|
|
|
* @link http://www.4fb.de
|
|
|
|
* @link http://www.contenido.org
|
|
|
|
*/
|
2020-08-20 16:30:16 +00:00
|
|
|
if (!defined('CON_FRAMEWORK')) {
|
|
|
|
die('Illegal call');
|
2019-11-04 15:22:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
cInclude("includes", "functions.con.php");
|
|
|
|
|
2020-08-20 16:30:16 +00:00
|
|
|
function getUsers($listid, $default) {
|
|
|
|
global $idclient, $cfg, $auth;
|
|
|
|
|
|
|
|
$userlist = new Users;
|
|
|
|
$users = $userlist->getAccessibleUsers(explode(',', $auth->auth['perm']));
|
|
|
|
$grouplist = new Groups;
|
|
|
|
$groups = $grouplist->getAccessibleGroups(explode(',', $auth->auth['perm']));
|
|
|
|
|
|
|
|
$tpl2 = new Template;
|
|
|
|
$tpl2->set('s', 'NAME', 'user' . $listid);
|
2019-11-04 15:22:11 +00:00
|
|
|
$tpl2->set('s', 'CLASS', 'text_small');
|
|
|
|
$tpl2->set('s', 'OPTIONS', 'size=1');
|
|
|
|
|
2020-08-20 16:30:16 +00:00
|
|
|
$tpl2->set('d', 'VALUE', 0);
|
|
|
|
$tpl2->set('d', 'CAPTION', '--- ' . i18n("None", "workflow") . ' ---');
|
|
|
|
if ($default == 0) {
|
|
|
|
$tpl2->set('d', 'SELECTED', 'SELECTED');
|
|
|
|
} else {
|
|
|
|
$tpl2->set('d', 'SELECTED', '');
|
|
|
|
}
|
|
|
|
$tpl2->next();
|
|
|
|
|
|
|
|
if (is_array($users)) {
|
|
|
|
|
|
|
|
foreach ($users as $key => $value) {
|
|
|
|
|
|
|
|
$tpl2->set('d', 'VALUE', $key);
|
|
|
|
$tpl2->set('d', 'CAPTION', $value["realname"] . " (" . $value["username"] . ")");
|
|
|
|
|
|
|
|
if ($default == $key) {
|
|
|
|
$tpl2->set('d', 'SELECTED', 'SELECTED');
|
|
|
|
} else {
|
|
|
|
$tpl2->set('d', 'SELECTED', '');
|
|
|
|
}
|
|
|
|
|
2019-11-04 15:22:11 +00:00
|
|
|
$tpl2->next();
|
2020-08-20 16:30:16 +00:00
|
|
|
}
|
|
|
|
}
|
2019-11-04 15:22:11 +00:00
|
|
|
|
2020-08-20 16:30:16 +00:00
|
|
|
$tpl2->set('d', 'VALUE', '0');
|
|
|
|
$tpl2->set('d', 'CAPTION', '------------------------------------');
|
2019-11-04 15:22:11 +00:00
|
|
|
$tpl2->set('d', 'SELECTED', 'disabled');
|
2020-08-20 16:30:16 +00:00
|
|
|
$tpl2->next();
|
|
|
|
|
|
|
|
if (is_array($groups)) {
|
|
|
|
|
|
|
|
foreach ($groups as $key => $value) {
|
|
|
|
|
|
|
|
$tpl2->set('d', 'VALUE', $key);
|
|
|
|
$tpl2->set('d', 'CAPTION', $value["groupname"]);
|
|
|
|
|
|
|
|
if ($default == $key) {
|
|
|
|
$tpl2->set('d', 'SELECTED', 'SELECTED');
|
|
|
|
} else {
|
|
|
|
$tpl2->set('d', 'SELECTED', '');
|
|
|
|
}
|
|
|
|
|
2019-11-04 15:22:11 +00:00
|
|
|
$tpl2->next();
|
|
|
|
}
|
2020-08-20 16:30:16 +00:00
|
|
|
}
|
2019-11-04 15:22:11 +00:00
|
|
|
|
2020-08-20 16:30:16 +00:00
|
|
|
return $tpl2->generate($cfg['path']['templates'] . $cfg['templates']['generic_select'], true);
|
2019-11-04 15:22:11 +00:00
|
|
|
}
|
|
|
|
|
2020-08-20 16:30:16 +00:00
|
|
|
function isCurrentEditor($uid) {
|
|
|
|
global $auth, $cfg;
|
|
|
|
|
2019-11-04 15:22:11 +00:00
|
|
|
/* Check if the UID is a group. If yes, check if we are in it */
|
|
|
|
$user = new User;
|
2020-08-20 16:30:16 +00:00
|
|
|
if ($user->loadUserByUserID($uid) == false) {
|
|
|
|
$db2 = new DB_ConLite;
|
|
|
|
|
|
|
|
/* Yes, it's a group. Let's try to load the group members! */
|
|
|
|
$sql = "SELECT user_id FROM "
|
|
|
|
. $cfg["tab"]["groupmembers"] . "
|
|
|
|
WHERE group_id = '" . Contenido_Security::escapeDB($uid, $db2) . "'";
|
|
|
|
|
2019-11-04 15:22:11 +00:00
|
|
|
$db2->query($sql);
|
2020-08-20 16:30:16 +00:00
|
|
|
|
|
|
|
while ($db2->next_record()) {
|
|
|
|
if ($db2->f("user_id") == $auth->auth["uid"]) {
|
|
|
|
return true;
|
|
|
|
}
|
2019-11-04 15:22:11 +00:00
|
|
|
}
|
|
|
|
} else {
|
2020-08-20 16:30:16 +00:00
|
|
|
if ($uid == $auth->auth["uid"]) {
|
|
|
|
return true;
|
|
|
|
}
|
2019-11-04 15:22:11 +00:00
|
|
|
}
|
2020-08-20 16:30:16 +00:00
|
|
|
|
2019-11-04 15:22:11 +00:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2020-08-20 16:30:16 +00:00
|
|
|
function getActionSelect($idartlang, $idusersequence) {
|
|
|
|
global $cfg;
|
|
|
|
|
|
|
|
$workflowActions = new WorkflowActions;
|
|
|
|
|
|
|
|
$allActions = $workflowActions->getAvailableWorkflowActions();
|
|
|
|
|
|
|
|
$wfSelect = new Template;
|
|
|
|
$wfSelect->set('s', 'NAME', 'wfselect' . $idartlang);
|
|
|
|
$wfSelect->set('s', 'CLASS', 'text_medium');
|
|
|
|
|
|
|
|
$userSequence = new WorkflowUserSequence;
|
|
|
|
$userSequence->loadByPrimaryKey($idusersequence);
|
|
|
|
|
2019-11-04 15:22:11 +00:00
|
|
|
$workflowItem = $userSequence->getWorkflowItem();
|
2020-08-20 16:30:16 +00:00
|
|
|
|
|
|
|
if ($workflowItem === false) {
|
|
|
|
return;
|
2019-11-04 15:22:11 +00:00
|
|
|
}
|
2020-08-20 16:30:16 +00:00
|
|
|
|
2019-11-04 15:22:11 +00:00
|
|
|
$wfRights = $workflowItem->getStepRights();
|
2020-08-20 16:30:16 +00:00
|
|
|
|
2019-11-04 15:22:11 +00:00
|
|
|
$artAllocation = new WorkflowArtAllocations;
|
|
|
|
$artAllocation->select("idartlang = '$idartlang'");
|
2020-08-20 16:30:16 +00:00
|
|
|
|
|
|
|
if ($obj = $artAllocation->next()) {
|
|
|
|
$laststep = $obj->get("lastusersequence");
|
2019-11-04 15:22:11 +00:00
|
|
|
}
|
2020-08-20 16:30:16 +00:00
|
|
|
|
2019-11-04 15:22:11 +00:00
|
|
|
$bExistOption = false;
|
2020-08-20 16:30:16 +00:00
|
|
|
if ($laststep != $idusersequence) {
|
|
|
|
$wfSelect->set('d', 'VALUE', 'next');
|
|
|
|
$wfSelect->set('d', 'CAPTION', i18n("Confirm", "workflow"));
|
|
|
|
$wfSelect->set('d', 'SELECTED', 'SELECTED');
|
|
|
|
$wfSelect->next();
|
2019-11-04 15:22:11 +00:00
|
|
|
$bExistOption = true;
|
2020-08-20 16:30:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if ($wfRights["last"] == true) {
|
|
|
|
$wfSelect->set('d', 'VALUE', 'last');
|
|
|
|
$wfSelect->set('d', 'CAPTION', i18n("Back to last editor", "workflow"));
|
|
|
|
$wfSelect->set('d', 'SELECTED', '');
|
|
|
|
$wfSelect->next();
|
2019-11-04 15:22:11 +00:00
|
|
|
$bExistOption = true;
|
2020-08-20 16:30:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if ($wfRights["reject"] == true) {
|
|
|
|
$wfSelect->set('d', 'VALUE', 'reject');
|
|
|
|
$wfSelect->set('d', 'CAPTION', i18n("Reject article", "workflow"));
|
|
|
|
$wfSelect->set('d', 'SELECTED', '');
|
|
|
|
$wfSelect->next();
|
2019-11-04 15:22:11 +00:00
|
|
|
$bExistOption = true;
|
2020-08-20 16:30:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if ($wfRights["revise"] == true) {
|
|
|
|
$wfSelect->set('d', 'VALUE', 'revise');
|
|
|
|
$wfSelect->set('d', 'CAPTION', i18n("Revise article", "workflow"));
|
|
|
|
$wfSelect->set('d', 'SELECTED', '');
|
|
|
|
$wfSelect->next();
|
2019-11-04 15:22:11 +00:00
|
|
|
$bExistOption = true;
|
2020-08-20 16:30:16 +00:00
|
|
|
}
|
|
|
|
|
2019-11-04 15:22:11 +00:00
|
|
|
if ($bExistOption)
|
2020-08-20 16:30:16 +00:00
|
|
|
return ($wfSelect->generate($cfg['path']['templates'] . $cfg['templates']['generic_select'], true));
|
2019-11-04 15:22:11 +00:00
|
|
|
else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#function for inserting todos in wokflow_art_allocation used, when a workflow is associated with a category in content->category
|
2020-08-20 16:30:16 +00:00
|
|
|
|
|
|
|
function setUserSequence($idartlang, $defaultidworkflow) {
|
2019-11-04 15:22:11 +00:00
|
|
|
$wfaa = new WorkflowArtAllocations;
|
|
|
|
$wfaa->select("idartlang = '$idartlang'");
|
|
|
|
$idusersequence = 0;
|
2020-08-20 16:30:16 +00:00
|
|
|
|
|
|
|
if ($associatedUserSequence = $wfaa->next()) {
|
2019-11-04 15:22:11 +00:00
|
|
|
$idartallocation = $associatedUserSequence->get("idartallocation");
|
|
|
|
$wfaa->delete($idartallocation);
|
|
|
|
}
|
2020-08-20 16:30:16 +00:00
|
|
|
|
2019-11-04 15:22:11 +00:00
|
|
|
if ($defaultidworkflow != -1) {
|
|
|
|
$newObj = $wfaa->create($idartlang);
|
2020-08-20 16:30:16 +00:00
|
|
|
|
|
|
|
if (!$newObj) {
|
2019-11-04 15:22:11 +00:00
|
|
|
/* Try to load */
|
|
|
|
$newObj = new WorkflowArtAllocation;
|
2020-08-20 16:30:16 +00:00
|
|
|
|
2019-11-04 15:22:11 +00:00
|
|
|
echo $wfaa->lasterror;
|
|
|
|
return false;
|
|
|
|
}
|
2020-08-20 16:30:16 +00:00
|
|
|
|
2019-11-04 15:22:11 +00:00
|
|
|
/* Get the first idusersequence for the new item */
|
|
|
|
$workflowItems = new WorkflowItems;
|
|
|
|
$workflowItems->select("idworkflow = '$defaultidworkflow' AND position = '1'");
|
2020-08-20 16:30:16 +00:00
|
|
|
|
|
|
|
if ($obj = $workflowItems->next()) {
|
2019-11-04 15:22:11 +00:00
|
|
|
$firstitem = $obj->get("idworkflowitem");
|
|
|
|
}
|
2020-08-20 16:30:16 +00:00
|
|
|
|
2019-11-04 15:22:11 +00:00
|
|
|
$workflowUserSequences = new WorkflowUserSequences;
|
|
|
|
$workflowUserSequences->select("idworkflowitem = '$firstitem' AND position = '1'");
|
2020-08-20 16:30:16 +00:00
|
|
|
|
|
|
|
if ($obj = $workflowUserSequences->next()) {
|
2019-11-04 15:22:11 +00:00
|
|
|
$firstIDUserSequence = $obj->get("idusersequence");
|
|
|
|
}
|
2020-08-20 16:30:16 +00:00
|
|
|
|
2019-11-04 15:22:11 +00:00
|
|
|
$newObj->set("idusersequence", $firstIDUserSequence);
|
|
|
|
$newObj->store();
|
|
|
|
|
|
|
|
$idusersequence = $newObj->get("idusersequence");
|
|
|
|
$associatedUserSequence = $newObj;
|
2020-08-20 16:30:16 +00:00
|
|
|
}
|
2019-11-04 15:22:11 +00:00
|
|
|
}
|
|
|
|
|
2020-08-20 16:30:16 +00:00
|
|
|
function getCurrentUserSequence($idartlang, $defaultidworkflow) {
|
|
|
|
$wfaa = new WorkflowArtAllocations;
|
|
|
|
$wfaa->select("idartlang = '$idartlang'");
|
|
|
|
$idusersequence = 0;
|
|
|
|
|
|
|
|
if ($associatedUserSequence = $wfaa->next()) {
|
|
|
|
$idusersequence = $associatedUserSequence->get("idusersequence");
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($idusersequence == 0) {
|
|
|
|
if ($associatedUserSequence != false) {
|
|
|
|
$newObj = $associatedUserSequence;
|
|
|
|
} else {
|
|
|
|
$newObj = $wfaa->create($idartlang);
|
|
|
|
|
|
|
|
if (!$newObj) {
|
|
|
|
/* Try to load */
|
|
|
|
$newObj = new WorkflowArtAllocation;
|
|
|
|
|
|
|
|
echo $wfaa->lasterror;
|
|
|
|
return false;
|
2019-11-04 15:22:11 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-08-20 16:30:16 +00:00
|
|
|
/* Get the first idusersequence for the new item */
|
|
|
|
$workflowItems = new WorkflowItems;
|
|
|
|
$workflowItems->select("idworkflow = '$defaultidworkflow' AND position = '1'");
|
|
|
|
|
|
|
|
if ($obj = $workflowItems->next()) {
|
|
|
|
$firstitem = $obj->get("idworkflowitem");
|
2019-11-04 15:22:11 +00:00
|
|
|
}
|
2020-08-20 16:30:16 +00:00
|
|
|
|
|
|
|
$workflowUserSequences = new WorkflowUserSequences;
|
|
|
|
$workflowUserSequences->select("idworkflowitem = '$firstitem' AND position = '1'");
|
|
|
|
|
|
|
|
if ($obj = $workflowUserSequences->next()) {
|
|
|
|
$firstIDUserSequence = $obj->get("idusersequence");
|
2019-11-04 15:22:11 +00:00
|
|
|
}
|
2020-08-20 16:30:16 +00:00
|
|
|
|
|
|
|
$newObj->set("idusersequence", $firstIDUserSequence);
|
|
|
|
$newObj->store();
|
|
|
|
|
|
|
|
$idusersequence = $newObj->get("idusersequence");
|
|
|
|
$associatedUserSequence = $newObj;
|
|
|
|
}
|
|
|
|
|
|
|
|
return ($idusersequence);
|
2019-11-04 15:22:11 +00:00
|
|
|
}
|
|
|
|
|
2020-08-20 16:30:16 +00:00
|
|
|
function getLastWorkflowStatus($idartlang) {
|
|
|
|
$wfaa = new WorkflowArtAllocations;
|
|
|
|
|
|
|
|
$wfaa->select("idartlang = '$idartlang'");
|
|
|
|
|
|
|
|
if ($associatedUserSequence = $wfaa->next()) {
|
|
|
|
$laststatus = $associatedUserSequence->get("laststatus");
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch ($laststatus) {
|
|
|
|
case "reject":
|
|
|
|
return (i18n("Rejected", "workflow"));
|
|
|
|
break;
|
|
|
|
case "revise":
|
|
|
|
return (i18n("Revised", "workflow"));
|
|
|
|
break;
|
|
|
|
case "last":
|
|
|
|
return (i18n("Last", "workflow"));
|
|
|
|
break;
|
|
|
|
case "confirm":
|
|
|
|
return (i18n("Confirmed", "workflow"));
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
return (i18n("None", "workflow"));
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return ("");
|
|
|
|
}
|
|
|
|
|
|
|
|
function doWorkflowAction($idartlang, $action) {
|
|
|
|
global $cfg, $idcat;
|
|
|
|
|
|
|
|
switch ($action) {
|
|
|
|
case "last":
|
|
|
|
$artAllocations = new WorkflowArtAllocations;
|
|
|
|
$artAllocations->select("idartlang = '$idartlang'");
|
|
|
|
|
|
|
|
if ($obj = $artAllocations->next()) {
|
|
|
|
$usersequence = new WorkflowUserSequence;
|
|
|
|
$usersequence->loadByPrimaryKey($obj->get("idusersequence"));
|
|
|
|
|
|
|
|
$workflowitem = $usersequence->getWorkflowItem();
|
|
|
|
|
|
|
|
$idworkflow = $workflowitem->get("idworkflow");
|
|
|
|
$newpos = $workflowitem->get("position") - 1;
|
|
|
|
|
|
|
|
if ($newpos < 1) {
|
|
|
|
$newpos = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
$workflowitems = new WorkflowItems;
|
|
|
|
$workflowitems->select("idworkflow = '$idworkflow' AND position = '" . Contenido_Security::escapeDB($newpos, NULL) . "'");
|
|
|
|
|
|
|
|
if ($nextObj = $workflowitems->next()) {
|
|
|
|
$userSequences = new WorkflowUserSequences;
|
|
|
|
$idworkflowitem = $nextObj->get("idworkflowitem");
|
|
|
|
$userSequences->select("idworkflowitem = '$idworkflowitem'");
|
|
|
|
|
|
|
|
if ($nextSeqObj = $userSequences->next()) {
|
|
|
|
$obj->set("lastusersequence", $obj->get("idusersequence"));
|
|
|
|
$obj->set("idusersequence", $nextSeqObj->get("idusersequence"));
|
|
|
|
$obj->set("laststatus", "last");
|
|
|
|
$obj->store();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case "next":
|
|
|
|
$artAllocations = new WorkflowArtAllocations;
|
|
|
|
$artAllocations->select("idartlang = '$idartlang'");
|
|
|
|
|
|
|
|
if ($obj = $artAllocations->next()) {
|
|
|
|
$usersequence = new WorkflowUserSequence;
|
|
|
|
$usersequence->loadByPrimaryKey($obj->get("idusersequence"));
|
|
|
|
|
|
|
|
$workflowitem = $usersequence->getWorkflowItem();
|
|
|
|
|
|
|
|
$idworkflow = $workflowitem->get("idworkflow");
|
|
|
|
$newpos = $workflowitem->get("position") + 1;
|
|
|
|
|
|
|
|
$workflowitems = new WorkflowItems;
|
|
|
|
$workflowitems->select("idworkflow = '$idworkflow' AND position = '" . Contenido_Security::escapeDB($newpos, NULL) . "'");
|
|
|
|
|
|
|
|
if ($nextObj = $workflowitems->next()) {
|
|
|
|
$userSequences = new WorkflowUserSequences;
|
|
|
|
$idworkflowitem = $nextObj->get("idworkflowitem");
|
|
|
|
$userSequences->select("idworkflowitem = '$idworkflowitem'");
|
|
|
|
|
|
|
|
if ($nextSeqObj = $userSequences->next()) {
|
|
|
|
$obj->set("lastusersequence", '10');
|
|
|
|
$obj->set("idusersequence", $nextSeqObj->get("idusersequence"));
|
|
|
|
$obj->set("laststatus", "confirm");
|
|
|
|
$obj->store();
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
$workflowitems->select("idworkflow = '$idworkflow' AND position = '" . Contenido_Security::escapeDB($workflowitem->get("position"), NULL) . "'");
|
|
|
|
if ($nextObj = $workflowitems->next()) {
|
|
|
|
$userSequences = new WorkflowUserSequences;
|
|
|
|
$idworkflowitem = $nextObj->get("idworkflowitem");
|
|
|
|
$userSequences->select("idworkflowitem = '$idworkflowitem'");
|
|
|
|
|
|
|
|
if ($nextSeqObj = $userSequences->next()) {
|
|
|
|
$obj->set("lastusersequence", $obj->get("idusersequence"));
|
|
|
|
$obj->set("idusersequence", $nextSeqObj->get("idusersequence"));
|
|
|
|
$obj->set("laststatus", "confirm");
|
|
|
|
$obj->store();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case "reject":
|
|
|
|
$artAllocations = new WorkflowArtAllocations;
|
|
|
|
$artAllocations->select("idartlang = '$idartlang'");
|
|
|
|
|
|
|
|
if ($obj = $artAllocations->next()) {
|
|
|
|
$usersequence = new WorkflowUserSequence;
|
|
|
|
$usersequence->loadByPrimaryKey($obj->get("idusersequence"));
|
|
|
|
|
|
|
|
$workflowitem = $usersequence->getWorkflowItem();
|
|
|
|
|
|
|
|
$idworkflow = $workflowitem->get("idworkflow");
|
|
|
|
$newpos = 1;
|
|
|
|
|
|
|
|
$workflowitems = new WorkflowItems;
|
|
|
|
$workflowitems->select("idworkflow = '$idworkflow' AND position = '" . Contenido_Security::escapeDB($newpos, NULL) . "'");
|
|
|
|
|
|
|
|
if ($nextObj = $workflowitems->next()) {
|
|
|
|
$userSequences = new WorkflowUserSequences;
|
|
|
|
$idworkflowitem = $nextObj->get("idworkflowitem");
|
|
|
|
$userSequences->select("idworkflowitem = '$idworkflowitem'");
|
|
|
|
|
|
|
|
if ($nextSeqObj = $userSequences->next()) {
|
|
|
|
$obj->set("lastusersequence", $obj->get("idusersequence"));
|
|
|
|
$obj->set("idusersequence", $nextSeqObj->get("idusersequence"));
|
|
|
|
$obj->set("laststatus", "reject");
|
|
|
|
$obj->store();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case "revise":
|
|
|
|
$db = new DB_ConLite;
|
|
|
|
$sql = "SELECT idart, idlang FROM " . $cfg["tab"]["art_lang"] . " WHERE idartlang = '" . Contenido_Security::escapeDB($idartlang, $db) . "'";
|
|
|
|
$db->query($sql);
|
|
|
|
$db->next_record();
|
|
|
|
$idart = $db->f("idart");
|
|
|
|
$idlang = $db->f("idlang");
|
|
|
|
|
|
|
|
$newidart = conCopyArticle($idart, $idcat, "foo");
|
|
|
|
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
}
|
2019-11-04 15:22:11 +00:00
|
|
|
}
|
|
|
|
|
2020-08-20 16:30:16 +00:00
|
|
|
function getWorkflowForUserSequence($usersequence) {
|
|
|
|
$usersequences = new WorkflowUserSequences;
|
|
|
|
$workflowitems = new WorkflowItems;
|
|
|
|
$usersequences->select("idusersequence = '$usersequence'");
|
|
|
|
|
|
|
|
if ($obj = $usersequences->next()) {
|
|
|
|
$idworkflowitem = $obj->get("idworkflowitem");
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
$workflowitems->select("idworkflowitem = '$idworkflowitem'");
|
|
|
|
if ($obj = $workflowitems->next()) {
|
|
|
|
return $obj->get("idworkflow");
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
2019-11-04 15:22:11 +00:00
|
|
|
}
|
|
|
|
|
2020-08-20 16:30:16 +00:00
|
|
|
function workflowSelect($listid, $default, $idcat) {
|
|
|
|
global $idclient, $cfg, $frame, $area, $workflowworkflows, $client, $lang, $wfcache, $workflowSelectBox;
|
|
|
|
|
2019-11-04 15:22:11 +00:00
|
|
|
$oSelectBox = new cHTMLSelectElement('workflow');
|
|
|
|
$oSelectBox = $workflowSelectBox;
|
2020-08-20 16:30:16 +00:00
|
|
|
|
2019-11-04 15:22:11 +00:00
|
|
|
$default = (int) $default;
|
2020-08-20 16:30:16 +00:00
|
|
|
$workflowSelectBox->updateAttributes(array("id" => "wfselect" . $idcat));
|
|
|
|
$workflowSelectBox->updateAttributes(array("name" => "wfselect" . $idcat));
|
2019-11-04 15:22:11 +00:00
|
|
|
$workflowSelectBox->setDefault($default);
|
2020-08-20 16:30:16 +00:00
|
|
|
|
|
|
|
$sButton = '<a href="javascript:setWorkflow(' . $idcat . ', \'' . "wfselect" . $idcat . '\')"><img src="' . $cfg["path"]["images"] . 'submit.gif" class="spaced"></a>';
|
|
|
|
|
|
|
|
return $workflowSelectBox->render() . $sButton;
|
2019-11-04 15:22:11 +00:00
|
|
|
}
|
|
|
|
|
2020-08-20 16:30:16 +00:00
|
|
|
function workflowInherit($idcat) {
|
|
|
|
global $idclient, $cfg, $frame, $area, $workflowworkflows, $sess;
|
|
|
|
$sUrl = $sess->url("main.php?area=$area&frame=$frame&modidcat=$idcat&action=workflow_inherit_down");
|
|
|
|
$sButton = '<a href="' . $sUrl . '"><img src="' . $cfg["path"]["images"] . 'pfeil_runter.gif" class="spaced"></a>';
|
2019-11-04 15:22:11 +00:00
|
|
|
return $sButton;
|
|
|
|
}
|
|
|
|
|
2020-08-20 16:30:16 +00:00
|
|
|
/* Helper functions */
|
|
|
|
|
|
|
|
function getWorkflowForCat($idcat) {
|
|
|
|
global $lang, $cfg;
|
|
|
|
|
|
|
|
$idcatlang = getCatLang($idcat, $lang);
|
|
|
|
$workflows = new WorkflowAllocations;
|
|
|
|
$workflows->select("idcatlang = '$idcatlang'");
|
|
|
|
if ($obj = $workflows->next()) {
|
|
|
|
/* Sanity: Check if the workflow still exists */
|
|
|
|
$workflow = new Workflow;
|
|
|
|
|
|
|
|
$res = $workflow->loadByPrimaryKey($obj->get("idworkflow"));
|
|
|
|
|
|
|
|
if ($res == false) {
|
|
|
|
return 0;
|
|
|
|
} else {
|
|
|
|
return $obj->get("idworkflow");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function getCatLang($idcat, $idlang) {
|
|
|
|
global $lang, $cfg;
|
|
|
|
$db = new DB_ConLite;
|
|
|
|
|
|
|
|
/* Get the idcatlang */
|
|
|
|
$sql = "SELECT idcatlang FROM "
|
|
|
|
. $cfg["tab"]["cat_lang"] .
|
|
|
|
" WHERE idlang = '" . Contenido_Security::escapeDB($idlang, $db) . "' AND
|
|
|
|
idcat = '" . Contenido_Security::escapeDB($idcat, $db) . "'";
|
|
|
|
|
|
|
|
$db->query($sql);
|
|
|
|
|
|
|
|
if ($db->next_record()) {
|
|
|
|
return ($db->f("idcatlang"));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function prepareWorkflowItems() {
|
|
|
|
|
|
|
|
global $action, $lang, $modidcat, $workflowSelectBox, $workflowworkflows, $client, $tpl, $cfg;
|
|
|
|
|
|
|
|
$workflowworkflows = new Workflows;
|
|
|
|
|
|
|
|
if ($action === 'workflow_inherit_down') {
|
|
|
|
$tmp = strDeeperCategoriesArray($modidcat);
|
|
|
|
$asworkflow = getWorkflowForCat($modidcat);
|
|
|
|
|
|
|
|
$wfa = new WorkflowAllocations;
|
|
|
|
|
|
|
|
foreach ($tmp as $tmp_cat) {
|
|
|
|
$idcatlang = getCatLang($tmp_cat, $lang);
|
|
|
|
|
|
|
|
if ($asworkflow == 0) {
|
|
|
|
$wfa->select("idcatlang = '$idcatlang'");
|
|
|
|
|
|
|
|
if ($item = $wfa->next()) {
|
|
|
|
$wfa->delete($item->get("idallocation"));
|
|
|
|
# delete user sequences for listing in tasklist for each included article
|
|
|
|
$oArticles = new ArticleCollection(array('idcat' => $idcatlang, 'start' => true, 'offline' => true));
|
|
|
|
while ($oArticle = $oArticles->nextArticle()) {
|
|
|
|
setUserSequence($oArticle->getField('idartlang'), -1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
$wfa->select("idcatlang = '$idcatlang'");
|
|
|
|
|
|
|
|
if ($item = $wfa->next()) {
|
|
|
|
$item->setWorkflow($asworkflow);
|
|
|
|
$item->store();
|
|
|
|
} else {
|
|
|
|
$wfa->create($asworkflow, $idcatlang);
|
|
|
|
# generate user sequences for listing in tasklist for each included article
|
|
|
|
$oArticles = new ArticleCollection(array('idcat' => $tmp_cat, 'start' => true, 'offline' => true));
|
|
|
|
while ($oArticle = $oArticles->nextArticle()) {
|
|
|
|
setUserSequence($oArticle->getField('idartlang'), $asworkflow);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ($action == "workflow_cat_assign") {
|
|
|
|
$seltpl = "wfselect" . $modidcat;
|
|
|
|
|
|
|
|
$wfa = new WorkflowAllocations;
|
|
|
|
$idcatlang = getCatLang($modidcat, $lang);
|
|
|
|
|
|
|
|
#associate workflow with category
|
|
|
|
if ($GLOBALS[$seltpl] != 0) {
|
|
|
|
$wfa->select("idcatlang = '$idcatlang'");
|
|
|
|
if ($item = $wfa->next()) {
|
|
|
|
$item->setWorkflow($GLOBALS[$seltpl]);
|
|
|
|
$item->store();
|
|
|
|
} else {
|
|
|
|
$wfa->create($GLOBALS[$seltpl], $idcatlang);
|
|
|
|
}
|
|
|
|
|
|
|
|
# generate user sequences for listing in tasklist for each included article
|
|
|
|
$oArticles = new ArticleCollection(array('idcat' => $modidcat, 'start' => true, 'offline' => true));
|
|
|
|
while ($oArticle = $oArticles->nextArticle()) {
|
|
|
|
setUserSequence($oArticle->getField('idartlang'), $GLOBALS[$seltpl]);
|
|
|
|
}
|
|
|
|
#unlink workflow with category
|
|
|
|
} else {
|
|
|
|
$wfa->select("idcatlang = '$idcatlang'");
|
|
|
|
|
|
|
|
if ($item = $wfa->next()) {
|
|
|
|
$alloc = $item->get("idallocation");
|
|
|
|
}
|
|
|
|
$wfa->delete($alloc);
|
|
|
|
|
|
|
|
# delete user sequences for listing in tasklist for each included article
|
|
|
|
$oArticles = new ArticleCollection(array('idcat' => $modidcat, 'start' => true, 'offline' => true));
|
|
|
|
while ($oArticle = $oArticles->nextArticle()) {
|
|
|
|
setUserSequence($oArticle->getField('idartlang'), -1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$workflowSelectBox = new cHTMLSelectElement("foo");
|
|
|
|
$workflowSelectBox->setClass("text_medium");
|
|
|
|
$workflowworkflows->select("idclient = '$client' AND idlang = '" . Contenido_Security::escapeDB($lang, null) . "'");
|
|
|
|
|
|
|
|
$workflowOption = new cHTMLOptionElement("--- " . i18n("None", "workflow") . " ---", 0);
|
|
|
|
$workflowSelectBox->addOptionElement(0, $workflowOption);
|
|
|
|
|
|
|
|
while ($workflow = $workflowworkflows->next()) {
|
|
|
|
$workflowOption = new cHTMLOptionElement($workflow->get("name"), $workflow->get("idworkflow"));
|
|
|
|
$workflowSelectBox->addOptionElement($workflow->get("idworkflow"), $workflowOption);
|
|
|
|
}
|
|
|
|
|
|
|
|
$workflowSelectBox->updateAttributes(array("id" => "wfselect{IDCAT}"));
|
|
|
|
$workflowSelectBox->updateAttributes(array("name" => "wfselect{IDCAT}"));
|
|
|
|
|
|
|
|
$tpl->set('s', 'PLUGIN_WORKFLOW', $workflowSelectBox->render() . '<a href="javascript:setWorkflow({IDCAT}, \\\'wfselect{IDCAT}\\\')"><img src="' . $cfg["path"]["images"] . 'submit.gif" class="spaced"></a>');
|
|
|
|
$tpl->set('s', 'PLUGIN_WORKFLOW_TRANSLATION', i18n("Inherit workflow down", "workflow"));
|
|
|
|
}
|
|
|
|
|
|
|
|
function piworkflowCategoryRenderColumn($idcat, $type) {
|
|
|
|
|
|
|
|
switch ($type) {
|
|
|
|
case "workflow":
|
|
|
|
$value = workflowInherit($idcat) . '<script type="text/javascript" id="wf' . $idcat . '">printWorkflowSelect(' . $idcat . ', ' . (int) getWorkflowForCat($idcat) . ');</script>';
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return ($value);
|
|
|
|
}
|
|
|
|
|
|
|
|
function piworkflowCategoryColumns($array) {
|
|
|
|
prepareWorkflowItems();
|
|
|
|
$myarray = array("workflow" => i18n("Workflow", "workflow"));
|
|
|
|
|
|
|
|
return ($myarray);
|
|
|
|
}
|
|
|
|
|
|
|
|
function piworkflowProcessActions($array) {
|
|
|
|
global $idcat;
|
|
|
|
$defaultidworkflow = getWorkflowForCat($idcat);
|
|
|
|
|
|
|
|
if ($defaultidworkflow != 0) {
|
|
|
|
$narray = array("todo",
|
|
|
|
"wfartconf",
|
|
|
|
"wftplconf",
|
|
|
|
"wfonline",
|
|
|
|
"wflocked",
|
|
|
|
"duplicate",
|
|
|
|
"delete",
|
|
|
|
"usetime");
|
|
|
|
} else {
|
|
|
|
$narray = $array;
|
|
|
|
}
|
|
|
|
|
|
|
|
return ($narray);
|
|
|
|
}
|
|
|
|
|
|
|
|
function piworkflowRenderAction($idcat, $idart, $idartlang, $type) {
|
|
|
|
global $area, $frame, $idtpl, $cfg, $alttitle, $tmp_articletitle;
|
|
|
|
global $tmp_artconf, $onlinelink, $lockedlink, $tplconf_link;
|
|
|
|
|
|
|
|
$defaultidworkflow = getWorkflowForCat($idcat);
|
|
|
|
|
|
|
|
$idusersequence = getCurrentUserSequence($idartlang, $defaultidworkflow);
|
|
|
|
$associatedUserSequence = new WorkflowUserSequence;
|
|
|
|
$associatedUserSequence->loadByPrimaryKey($idusersequence);
|
|
|
|
|
|
|
|
$currentEditor = $associatedUserSequence->get("iduser");
|
|
|
|
$workflowItem = $associatedUserSequence->getWorkflowItem();
|
|
|
|
|
|
|
|
if (isCurrentEditor($associatedUserSequence->get("iduser"))) {
|
|
|
|
/* Query rights for this user */
|
|
|
|
$wfRights = $workflowItem->getStepRights();
|
|
|
|
$mayEdit = true;
|
|
|
|
} else {
|
|
|
|
$wfRights = "";
|
|
|
|
$mayEdit = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch ($type) {
|
|
|
|
case "wfartconf":
|
|
|
|
if ($wfRights["propertyedit"] == true) {
|
|
|
|
return $tmp_artconf;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case "wfonline":
|
|
|
|
if ($wfRights["publish"] == true) {
|
|
|
|
return $onlinelink;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case "wflocked":
|
|
|
|
if ($wfRights["lock"] == true) {
|
|
|
|
return $lockedlink;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case "wftplconf":
|
|
|
|
if ($wfRights["templateedit"] == true) {
|
|
|
|
return $tplconf_link;
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return "";
|
|
|
|
}
|
|
|
|
|
|
|
|
function piworkflowProcessArticleColumns($array) {
|
|
|
|
global $idcat, $action, $modidartlang;
|
|
|
|
|
|
|
|
if ($action == "workflow_do_action") {
|
|
|
|
$selectedAction = "wfselect" . $modidartlang;
|
|
|
|
doWorkflowAction($modidartlang, $GLOBALS[$selectedAction]);
|
|
|
|
}
|
|
|
|
|
|
|
|
$defaultidworkflow = getWorkflowForCat($idcat);
|
|
|
|
|
|
|
|
if ($defaultidworkflow != 0) {
|
|
|
|
$narray = array();
|
|
|
|
$bInserted = false;
|
|
|
|
foreach ($array as $sKey => $sValue) {
|
|
|
|
$narray[$sKey] = $sValue;
|
|
|
|
if ($sKey == 'title' && !$bInserted) {
|
|
|
|
$narray["wftitle"] = $array["title"];
|
|
|
|
$narray["wfstep"] = i18n("Workflow Step", "cl-workflow");
|
|
|
|
$narray["wfaction"] = i18n("Workflow Action", "cl-workflow");
|
|
|
|
$narray["wfeditor"] = i18n("Workflow Editor", "cl-workflow");
|
|
|
|
$narray["wflaststatus"] = i18n("Last status", "cl-workflow");
|
|
|
|
$bInserted = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
unset($narray['title']);
|
|
|
|
unset($narray['changeddate']);
|
|
|
|
unset($narray['publisheddate']);
|
|
|
|
unset($narray['sortorder']);
|
|
|
|
} else {
|
|
|
|
$narray = $array;
|
|
|
|
}
|
|
|
|
|
|
|
|
return ($narray);
|
|
|
|
}
|
|
|
|
|
|
|
|
function piworkflowAllowArticleEdit($idlang, $idcat, $idart, $user) {
|
|
|
|
$defaultidworkflow = getWorkflowForCat($idcat);
|
|
|
|
|
|
|
|
if ($defaultidworkflow == 0) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
$idartlang = getArtLang($idart, $idlang);
|
|
|
|
$idusersequence = getCurrentUserSequence($idartlang, $defaultidworkflow);
|
|
|
|
$associatedUserSequence = new WorkflowUserSequence;
|
|
|
|
$associatedUserSequence->loadByPrimaryKey($idusersequence);
|
|
|
|
|
|
|
|
$currentEditor = $associatedUserSequence->get("iduser");
|
|
|
|
|
|
|
|
$workflowItem = $associatedUserSequence->getWorkflowItem();
|
|
|
|
|
|
|
|
if (isCurrentEditor($associatedUserSequence->get("iduser"))) {
|
|
|
|
$wfRights = $workflowItem->getStepRights();
|
|
|
|
$mayEdit = true;
|
|
|
|
} else {
|
|
|
|
$wfRights = "";
|
|
|
|
$mayEdit = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($wfRights["articleedit"] == true) {
|
|
|
|
return true;
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function piworkflowRenderColumn($idcat, $idart, $idartlang, $column) {
|
|
|
|
global $area, $frame, $idtpl, $cfg, $alttitle, $tmp_articletitle;
|
|
|
|
$defaultidworkflow = getWorkflowForCat($idcat);
|
|
|
|
|
|
|
|
$idusersequence = getCurrentUserSequence($idartlang, $defaultidworkflow);
|
|
|
|
$associatedUserSequence = new WorkflowUserSequence;
|
|
|
|
$associatedUserSequence->loadByPrimaryKey($idusersequence);
|
|
|
|
|
|
|
|
$currentEditor = $associatedUserSequence->get("iduser");
|
|
|
|
|
|
|
|
$workflowItem = $associatedUserSequence->getWorkflowItem();
|
|
|
|
|
|
|
|
if (isCurrentEditor($associatedUserSequence->get("iduser"))) {
|
|
|
|
$wfRights = $workflowItem->getStepRights();
|
|
|
|
$mayEdit = true;
|
|
|
|
} else {
|
|
|
|
$wfRights = "";
|
|
|
|
$mayEdit = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch ($column) {
|
|
|
|
case "wftitle":
|
|
|
|
if ($wfRights["articleedit"] == true) {
|
|
|
|
$mtitle = $tmp_articletitle;
|
|
|
|
} else {
|
|
|
|
$mtitle = strip_tags($tmp_articletitle);
|
|
|
|
}
|
|
|
|
return ($mtitle);
|
|
|
|
case "wfstep":
|
|
|
|
if ($workflowItem === false) {
|
|
|
|
return "nobody";
|
|
|
|
}
|
|
|
|
|
|
|
|
return ($workflowItem->get("position") . ".) " . $workflowItem->get("name"));
|
|
|
|
case "wfeditor":
|
|
|
|
$sEditor = getGroupOrUserName($currentEditor);
|
|
|
|
if (!$sEditor) {
|
|
|
|
$sEditor = "nobody";
|
|
|
|
}
|
|
|
|
return $sEditor;
|
|
|
|
case "wfaction":
|
|
|
|
$defaultidworkflow = getWorkflowForCat($idcat);
|
|
|
|
$idusersequence = getCurrentUserSequence($idartlang, $defaultidworkflow);
|
|
|
|
|
|
|
|
$sActionSelect = getActionSelect($idartlang, $idusersequence);
|
|
|
|
if (!$sActionSelect) {
|
|
|
|
$mayEdit = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
$form = new UI_Form("wfaction" . $idartlang, "main.php", "get");
|
|
|
|
$form->setVar("area", $area);
|
|
|
|
$form->setVar("action", "workflow_do_action");
|
|
|
|
$form->setVar("frame", $frame);
|
|
|
|
$form->setVar("idcat", $idcat);
|
|
|
|
$form->setVar("modidartlang", $idartlang);
|
|
|
|
$form->setVar("idtpl", $idtpl);
|
|
|
|
$form->add("select", '<table cellspacing="0" border="0"><tr><td>' . $sActionSelect . '</td><td>');
|
|
|
|
$form->add("button", '<input type="image" src="' . $cfg["path"]["htmlpath"] . $cfg["path"]["images"] . "submit.gif" . '"></tr></table>');
|
|
|
|
|
|
|
|
if ($mayEdit == true) {
|
|
|
|
return ($form->render(true));
|
|
|
|
} else {
|
|
|
|
return '--- ' . i18n("None") . ' ---';
|
|
|
|
}
|
|
|
|
|
|
|
|
case "wflaststatus":
|
|
|
|
$sStatus = getLastWorkflowStatus($idartlang);
|
|
|
|
if (!$sStatus) {
|
|
|
|
$sStatus = '--- ' . i18n("None") . ' ---';
|
|
|
|
}
|
|
|
|
return $sStatus;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function piworkflowCreateTasksFolder() {
|
|
|
|
global $sess, $cfg;
|
|
|
|
|
|
|
|
$item = array();
|
|
|
|
/* Create workflow tasks folder */
|
|
|
|
$tmp_mstr = '<a href="javascript://" onclick="javascript:conMultiLink(\'%s\', \'%s\', \'%s\', \'%s\')">%s</a>';
|
|
|
|
|
|
|
|
$mstr = sprintf($tmp_mstr, 'right_bottom',
|
|
|
|
$sess->url("main.php?area=con_workflow&frame=4"),
|
|
|
|
'right_top',
|
|
|
|
$sess->url("main.php?area=con_workflow&frame=3"),
|
|
|
|
'Workflow / Todo');
|
|
|
|
|
|
|
|
$item["image"] = '<img src="' . $cfg["path"]["contenido_fullhtml"] . $cfg["path"]["plugins"] . 'workflow/images/workflow_erstellen.gif">';
|
|
|
|
$item["title"] = $mstr;
|
|
|
|
|
|
|
|
|
|
|
|
return ($item);
|
|
|
|
}
|