1
0
Fork 0
Dieser Commit ist enthalten in:
Ortwin Pinke 2019-11-04 16:22:11 +01:00 committet von GitHub
Ursprung 935ba6e5d9
Commit b75948a709
Es konnte kein GPG-Schlüssel zu dieser Signatur gefunden werden
GPG-Schlüssel-ID: 4AEE18F83AFDEB23
37 geänderte Dateien mit 4890 neuen und 0 gelöschten Zeilen

180
classes/class.workflow.php Normale Datei
Datei anzeigen

@ -0,0 +1,180 @@
<?php
/**
* Project:
* Contenido Content Management System
*
* Description:
* Workflow management class
*
* Requirements:
* @con_php_req 5.0
*
*
* @package Contenido Backend classes
* @version 1.6
* @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
*
* {@internal
* created 2003-07-18
*
* $Id: class.workflow.php 128 2019-07-03 11:58:28Z oldperl $
* }}
*
*/
if (!defined('CON_FRAMEWORK')) {
die('Illegal call');
}
$cfg["tab"]["workflow"] = $cfg['sql']['sqlprefix'] . "_piwf_workflow";
$cfg["tab"]["workflow_allocation"] = $cfg['sql']['sqlprefix'] . "_piwf_allocation";
$cfg["tab"]["workflow_art_allocation"] = $cfg['sql']['sqlprefix'] . "_piwf_art_allocation";
$cfg["tab"]["workflow_items"] = $cfg['sql']['sqlprefix'] . "_piwf_items";
$cfg["tab"]["workflow_user_sequences"] = $cfg['sql']['sqlprefix'] . "_piwf_user_sequences";
$cfg["tab"]["workflow_actions"] = $cfg['sql']['sqlprefix'] . "_piwf_actions";
plugin_include('workflow', 'classes/class.workflowactions.php');
plugin_include('workflow', 'classes/class.workflowallocation.php');
plugin_include('workflow', 'classes/class.workflowartallocation.php');
plugin_include('workflow', 'classes/class.workflowitems.php');
plugin_include('workflow', 'classes/class.workflowusersequence.php');
/**
* Class Workflows
* Class for workflow management
* @author Timo A. Hummel <Timo.Hummel@4fb.de>
* @version 0.2
* @copyright four for business 2003
*/
class Workflows extends ItemCollection {
/**
* Constructor Function
* @param none
*/
function __construct() {
global $cfg;
parent::__construct($cfg["tab"]["workflow"], "idworkflow");
$this->_setItemClass("Workflow");
}
function create() {
global $auth, $client, $lang;
$newitem = parent::createNewItem();
$newitem->setField("created", date("Y-m-d H-i-s"));
$newitem->setField("idauthor", $auth->auth["uid"]);
$newitem->setField("idclient", $client);
$newitem->setField("idlang", $lang);
$newitem->store();
return ($newitem);
}
/**
* Deletes all corresponding informations to this workflow and delegate call to parent
* @param integer $idWorkflow - id of workflow to delete
*/
function delete($idWorkflow) {
global $cfg;
$oDb = new DB_ConLite();
$aItemIdsDelete = array();
$sSql = 'SELECT idworkflowitem FROM ' . $cfg["tab"]["workflow_items"] . ' WHERE idworkflow = ' . Contenido_Security::toInteger($idWorkflow) . ';';
$oDb->query($sSql);
while ($oDb->next_record()) {
array_push($aItemIdsDelete, Contenido_Security::escapeDB($oDb->f('idworkflowitem'), $oDb));
}
$aUserSequencesDelete = array();
$sSql = 'SELECT idusersequence FROM ' . $cfg["tab"]["workflow_user_sequences"] . ' WHERE idworkflowitem in (' . implode(',', $aItemIdsDelete) . ');';
$oDb->query($sSql);
while ($oDb->next_record()) {
array_push($aUserSequencesDelete, Contenido_Security::escapeDB($oDb->f('idusersequence'), $oDb));
}
$sSql = 'DELETE FROM ' . $cfg["tab"]["workflow_user_sequences"] . ' WHERE idworkflowitem in (' . implode(',', $aItemIdsDelete) . ');';
$oDb->query($sSql);
$sSql = 'DELETE FROM ' . $cfg["tab"]["workflow_actions"] . ' WHERE idworkflowitem in (' . implode(',', $aItemIdsDelete) . ');';
$oDb->query($sSql);
$sSql = 'DELETE FROM ' . $cfg["tab"]["workflow_items"] . ' WHERE idworkflow = ' . Contenido_Security::toInteger($idWorkflow) . ';';
$oDb->query($sSql);
$sSql = 'DELETE FROM ' . $cfg["tab"]["workflow_allocation"] . ' WHERE idworkflow = ' . Contenido_Security::toInteger($idWorkflow) . ';';
$oDb->query($sSql);
$sSql = 'DELETE FROM ' . $cfg["tab"]["workflow_art_allocation"] . ' WHERE idusersequence in (' . implode(',', $aUserSequencesDelete) . ');';
$oDb->query($sSql);
parent::delete($idWorkflow);
}
}
/**
* Class Workflow
* Class for a single workflow item
* @author Timo A. Hummel <Timo.Hummel@4fb.de>
* @version 0.1
* @copyright four for business 2003
*/
class Workflow extends Item {
/**
* Constructor
*
* @global array $cfg
*/
function __construct() {
global $cfg;
parent::__construct($cfg["tab"]["workflow"], "idworkflow");
}
}
/* 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"));
}
}
?>

Datei anzeigen

@ -0,0 +1,132 @@
<?php
/**
* Project:
* Contenido Content Management System
*
* Description:
* Management of per-workflowitem actions
*
* Requirements:
* @con_php_req 5.0
*
*
* @package Contenido Backend classes
* @version 1.3
* @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
*
* {@internal
* created 2003-07-18
*
* $Id: class.workflowactions.php 128 2019-07-03 11:58:28Z oldperl $
* }}
*
*/
if(!defined('CON_FRAMEWORK')) {
die('Illegal call');
}
/**
* Class WorkflowActions
* Class for workflow action collections
* @author Timo A. Hummel <Timo.Hummel@4fb.de>
* @version 0.2
* @copyright four for business 2003
*/
class WorkflowActions extends ItemCollection {
/**
* Constructor Function
* @param string $table The table to use as information source
*/
function __construct()
{
global $cfg;
parent::__construct($cfg["tab"]["workflow_actions"], "idworkflowaction");
$this->_setItemClass("WorkflowAction");
}
/**
*
* @param type $idworkflowitem
* @param type $action
* @return boolean
*/
function get($idworkflowitem, $action)
{
$this->select("idworkflowitem = '".Contenido_Security::escapeDB($idworkflowitem, NULL)."' AND action = '".Contenido_Security::escapeDB($action, NULL)."'");
if ($this->next())
{
return true;
} else {
return false;
}
}
function getAvailableWorkflowActions ()
{
$availableWorkflowActions = array (
"publish" => i18n("Publish article", "workflow"),
"lock" => i18n("Lock article", "workflow"),
"last" => i18n("Move back to last editor", "workflow"),
"reject" => i18n("Reject article", "workflow"),
"articleedit" => i18n("Edit article content", "workflow"),
"propertyedit" => i18n("Edit article properties", "workflow"),
"templateedit" => i18n("Edit template", "workflow"),
"revise" => i18n("Revise article", "workflow"));
return($availableWorkflowActions);
}
function set ($idworkflowitem, $action)
{
$this->select("idworkflowitem = '".Contenido_Security::escapeDB($idworkflowitem, NULL)."' AND action = '".Contenido_Security::escapeDB($action, NULL)."'");
if (!$this->next())
{
$newitem = parent::createNewItem();
$newitem->setField("idworkflowitem",$idworkflowitem);
$newitem->setField("action",$action);
$newitem->store();
}
}
function remove ($idworkflowitem, $action)
{
$this->select("idworkflowitem = '$idworkflowitem' AND action = '$action'");
if ($item = $this->next())
{
$this->delete($item->getField("idworkflowaction"));
}
}
function select ($where = "", $group_by = "", $order_by = "", $limit = "")
{
global $client;
return parent::select($where, $group_by, $order_by, $limit);
}
}
/**
* Class WorkflowAction
* Class for a single workflow action
* @author Timo A. Hummel <Timo.Hummel@4fb.de>
* @version 0.1
* @copyright four for business 2003
*/
class WorkflowAction extends Item {
/**
* Constructor
* @global type $cfg
*/
function __construct() {
global $cfg;
parent::__construct($cfg["tab"]["workflow_actions"], "idworkflowaction");
}
}
?>

Datei anzeigen

@ -0,0 +1,242 @@
<?php
/**
* Project:
* Contenido Content Management System
*
* Description:
* Workflow allocation class
*
* Requirements:
* @con_php_req 5.0
*
*
* @package Contenido Backend classes
* @version 1.5
* @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
*
* {@internal
* created 2003-07-18
*
* $Id: class.workflowallocation.php 128 2019-07-03 11:58:28Z oldperl $
* }}
*
*/
if(!defined('CON_FRAMEWORK')) {
die('Illegal call');
}
/**
* Class WorkflowAllocations
* Class for workflow allocation management
* @author Timo A. Hummel <Timo.Hummel@4fb.de>
* @version 0.2
* @copyright four for business 2003
*/
class WorkflowAllocations extends ItemCollection {
/**
* Constructor Function
* @param string $table The table to use as information source
*/
function __construct()
{
global $cfg;
parent::__construct($cfg["tab"]["workflow_allocation"], "idallocation");
$this->_setItemClass("WorkflowAllocation");
}
/** @deprecated [2011-03-15] Old constructor function for downwards compatibility */
function WorkflowAllocations()
{
cWarning(__FILE__, __LINE__, "Deprecated method call, use __construct()");
$this->__construct();
}
function delete ($idallocation)
{
global $cfg, $lang;
$obj = new WorkflowAllocation;
$obj->loadByPrimaryKey($idallocation);
$idcatlang = $obj->get("idcatlang");
$db = new DB_ConLite;
$sql = "SELECT idcat FROM ".$cfg["tab"]["cat_lang"]." WHERE idcatlang = '".Contenido_Security::toInteger($idcatlang)."'";
$db->query($sql);
$db->next_record();
$idcat = $db->f("idcat");
$sql = "SELECT idart FROM ".$cfg["tab"]["cat_art"]." WHERE idcat = '".Contenido_Security::toInteger($idcat)."'";
$db->query($sql);
while ($db->next_record())
{
$idarts[] = $db->f("idart");
}
$idartlangs = array();
if (is_array($idarts))
{
foreach ($idarts as $idart)
{
$sql = "SELECT idartlang FROM ".$cfg["tab"]["art_lang"]." WHERE idart = '".Contenido_Security::toInteger($idart)."' and idlang = '".Contenido_Security::toInteger($lang)."'";
$db->query($sql);
if ($db->next_record())
{
$idartlangs[] = $db->f("idartlang");
}
}
}
$workflowArtAllocation = new WorkflowArtAllocation;
$workflowArtAllocations = new WorkflowArtAllocations;
foreach ($idartlangs as $idartlang)
{
$workflowArtAllocation->loadBy("idartlang", $idartlang);
$workflowArtAllocations->delete($workflowArtAllocation->get("idartallocation"));
}
parent::delete($idallocation);
}
function create ($idworkflow, $idcatlang)
{
$this->select("idcatlang = '$idcatlang'");
if ($this->next() !== false)
{
$this->lasterror = i18n("Category already has a workflow assigned", "workflow");
return false;
}
$workflows = new Workflows;
$workflows->select("idworkflow = '$idworkflow'");
if ($workflows->next() === false)
{
$this->lasterror = i18n("Workflow doesn't exist", "workflow");
return false;
}
$newitem = parent::createNewItem();
if (!$newitem->setWorkflow($idworkflow))
{
$this->lasterror = $newitem->lasterror;
$workflows->delete($newitem->getField("idallocation"));
return false;
}
if (!$newitem->setCatLang($idcatlang))
{
$this->lasterror = $newitem->lasterror;
$workflows->delete($newitem->getField("idallocation"));
return false;
}
$newitem->store();
return ($newitem);
}
}
/**
* Class WorkflowAllocation
* Class for a single workflow allocation item
* @author Timo A. Hummel <Timo.Hummel@4fb.de>
* @version 0.1
* @copyright four for business 2003
*/
class WorkflowAllocation extends Item {
/**
* Constructor Function
* @param string $table The table to use as information source
*/
function __construct()
{
global $cfg;
parent::__construct($cfg["tab"]["workflow_allocation"], "idallocation");
}
/** @deprecated [2011-03-15] Old constructor function for downwards compatibility */
function WorkflowAllocation()
{
cWarning(__FILE__, __LINE__, "Deprecated method call, use __construct()");
$this->__construct();
}
/**
* Overridden setField function. Users should only use setWorkflow.
* @param string $field Void field since we override the usual setField function
* @param string $value Void field since we override the usual setField function
*/
function setField($field, $value, $bSafe = true)
{
die("Don't use setField for WorkflowAllocation items! Use setWorkflow instead!");
}
/**
* setWorkflow sets the workflow for the current item.
* @param int $idworkflow Workflow-ID to set the item to
*/
function setWorkflow ($idworkflow)
{
$workflows = new Workflows;
$workflows->select("idworkflow = '$idworkflow'");
if ($workflows->next() === false)
{
$this->lasterror = i18n("Workflow doesn't exist", "workflow");
return false;
}
parent::setField("idworkflow", $idworkflow);
parent::store();
return true;
}
/**
* setCatLang sets the idcatlang for the current item. Should
* only be called by the create function.
* @param int $idcatlang idcatlang to set.
*/
function setCatLang ($idcatlang)
{
global $cfg;
$allocations = new WorkflowAllocations;
$allocations->select("idcatlang = '$idcatlang'");
if ($allocations->next() !== false)
{
$this->lasterror = i18n("Category already has a workflow assigned", "workflow");
return false;
}
$db = new DB_ConLite;
$sql = "SELECT idcatlang FROM ".$cfg["tab"]["cat_lang"]." WHERE idcatlang = '".Contenido_Security::toInteger($idcatlang)."'";
$db->query($sql);
if (!$db->next_record())
{
$this->lasterror = i18n("Category doesn't exist, assignment failed", "workflow");
return false;
}
parent::setField("idcatlang", $idcatlang);
parent::store();
return true;
}
}
?>

Datei anzeigen

@ -0,0 +1,361 @@
<?php
/**
* Project:
* Contenido Content Management System
*
* Description:
* Workflow allocation class
*
* Requirements:
* @con_php_req 5.0
*
*
* @package Contenido Backend classes
* @version 1.4
* @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
*
* {@internal
* created 2003-07-18
* modified : 2008-06-25 - use php mailer class instead of mail()
*
* $Id: class.workflowartallocation.php 128 2019-07-03 11:58:28Z oldperl $:
* }}
*
*/
if(!defined('CON_FRAMEWORK')) {
die('Illegal call');
}
/**
* Class WorkflowArtAllocations
* Class for workflow art allocation management
* @author Timo A. Hummel <Timo.Hummel@4fb.de>
* @version 0.2
* @copyright four for business 2003
*/
class WorkflowArtAllocations extends ItemCollection {
/**
* Constructor Function
* @param string $table The table to use as information source
*/
function __construct()
{
global $cfg;
parent::__construct($cfg["tab"]["workflow_art_allocation"], "idartallocation");
$this->_setItemClass("WorkflowArtAllocation");
}
/** @deprecated [2011-03-15] Old constructor function for downwards compatibility */
function WorkflowArtAllocations()
{
cWarning(__FILE__, __LINE__, "Deprecated method call, use __construct()");
$this->__construct();
}
function create ($idartlang)
{
global $cfg;
$sql = "SELECT idartlang FROM " .$cfg["tab"]["art_lang"].
" WHERE idartlang = '".Contenido_Security::escapeDB($idartlang, $this->db)."'";
$this->db->query($sql);
if (!$this->db->next_record())
{
$this->lasterror = i18n("Article doesn't exist", "workflow");
return false;
}
$this->select("idartlang = '$idartlang'");
if ($this->next() !== false)
{
$this->lasterror = i18n("Article is already assigned to a usersequence step.", "workflow");
return false;
}
$newitem = parent::createNewItem();
$newitem->setField("idartlang",$idartlang);
$newitem->store();
return ($newitem);
}
}
/**
* Class WorkflowArtAllocation
* Class for a single workflow allocation item
* @author Timo A. Hummel <Timo.Hummel@4fb.de>
* @version 0.1
* @copyright four for business 2003
*/
class WorkflowArtAllocation extends Item {
/**
* Constructor Function
* @param string $table The table to use as information source
*/
function __construct()
{
global $cfg;
parent::__construct($cfg["tab"]["workflow_art_allocation"], "idartallocation");
}
/** @deprecated [2011-03-15] Old constructor function for downwards compatibility */
function WorkflowArtAllocation()
{
cWarning(__FILE__, __LINE__, "Deprecated method call, use __construct()");
$this->__construct();
}
function getWorkflowItem ()
{
$userSequence = new WorkflowUserSequence;
$userSequence->loadByPrimaryKey($this->values["idusersequence"]);
return ($userSequence->getWorkflowItem());
}
/**
* Returns the current item position
* @param string $field Void field since we override the usual setField function
* @param string $value Void field since we override the usual setField function
*/
function currentItemPosition()
{
$idworkflowitem = $this->get("idworkflowitem");
$workflowItems = new WorkflowItems;
$workflowItems->select("idworkflowitem = '$idworkflowitem'");
if ($item = $workflowItems->next())
{
return ($item->get("position"));
}
}
/**
* Returns the current user position
* @param string $field Void field since we override the usual setField function
* @param string $value Void field since we override the usual setField function
*/
function currentUserPosition()
{
return ($this->get("position"));
}
/**
* Overriden store function to send mails
* @param none
*/
function store()
{
global $cfg;
$sMailhost = getSystemProperty('system', 'mail_host');
if ($sMailhost == '') {
$sMailhost = 'localhost';
}
//modified : 2008-06-25 - use php mailer class instead of mail()
$oMail = new PHPMailer();
$oMail->Host = $sMailhost;
$oMail->IsHTML(0);
$oMail->WordWrap = 1000;
$oMail->IsMail();
if (array_key_exists("idusersequence",$this->modifiedValues))
{
$usersequence = new WorkflowUserSequence;
$usersequence->loadByPrimaryKey($this->values["idusersequence"]);
$email = $usersequence->get("emailnoti");
$escal = $usersequence->get("escalationnoti");
if ($email == 1 || $escal == 1)
{
/* Grab the required informations */
$curEditor = getGroupOrUserName($usersequence->get("iduser"));
$idartlang = $this->get("idartlang");
$timeunit = $usersequence->get("timeunit");
$timelimit = $usersequence->get("timelimit");
$db = new DB_ConLite;
$sql = "SELECT author, title, idart FROM ".$cfg["tab"]["art_lang"]." WHERE idartlang = '".Contenido_Security::escapeDB($idartlang, $db)."'";
$db->query($sql);
if ($db->next_record())
{
$idart = $db->f("idart");
$title = $db->f("title");
$author = $db->f("author");
}
/* Extract category */
$sql = "SELECT idcat FROM ".$cfg["tab"]["cat_art"]." WHERE idart = '".Contenido_Security::escapeDB($idart, $db)."'";
$db->query($sql);
if ($db->next_record())
{
$idcat = $db->f("idcat");
}
$sql = "SELECT name FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat = '".Contenido_Security::escapeDB($idcat, $db)."'";
$db->query($sql);
if ($db->next_record())
{
$catname = $db->f("name");
}
$starttime = $this->get("starttime");
$starttime = strtotime (substr_replace (substr (substr ($starttime,0,2).chunk_split (substr ($starttime,2,6),2,"-").chunk_split (substr ($starttime,8),2,":"),0,19)," ",10,1));
switch ($timeunit)
{
case "Seconds":
$maxtime = $starttime + $timelimit;
break;
case "Minutes":
$maxtime = $starttime + ($timelimit * 60);
break;
case "Hours":
$maxtime = $starttime + ($timelimit * 3600);
break;
case "Days":
$maxtime = $starttime + ($timelimit * 86400);
break;
case "Weeks":
$maxtime = $starttime + ($timelimit * 604800);
break;
case "Months":
$maxtime = $starttime + ($timelimit * 2678400);
break;
case "Years":
$maxtime = $starttime + ($timelimit * 31536000);
break;
default:
$maxtime = $starttime + $timelimit;
}
if ($email == 1)
{
$email = "Hello %s,\n\n".
"you are assigned as the next editor for the Article %s.\n\n".
"More informations:\n".
"Article: %s\n".
"Category: %s\n".
"Editor: %s\n".
"Author: %s\n".
"Editable from: %s\n".
"Editable to: %s\n";
$filledMail = sprintf( $email,
$curEditor,
$title,
$title,
$catname,
$curEditor,
$author,
date("Y-m-d H:i:s", $starttime),
date("Y-m-d H:i:s", $maxtime));
$user = new User;
if (isGroup($usersequence->get("iduser")))
{
$sql = "select idgroupuser, user_id FROM ". $cfg["tab"]["groupmembers"] ." WHERE
group_id = '".Contenido_Security::escapeDB($usersequence->get("iduser"), $db)."'";
$db->query($sql);
while ($db->next_record())
{
$user->loadUserByUserID($db->f("user_id"));
//modified : 2008-06-25 - use php mailer class instead of mail()
$oMail->AddAddress($user->getField("email"), "");
$oMail->Subject = stripslashes (i18n('Workflow notification'));
$oMail->Body = $filledMail;
$oMail->Send();
}
} else {
$user->loadUserByUserID($usersequence->get("iduser"));
//modified : 2008-06-25 - use php mailer class instead of mail()
$oMail->AddAddress($user->getField("email"), "");
$oMail->Subject = stripslashes (i18n('Workflow notification'));
$oMail->Body = $filledMail;
$oMail->Send();
}
} else {
$email = "Hello %s,\n\n".
"you are assigned as the escalator for the Article %s.\n\n".
"More informations:\n".
"Article: %s\n".
"Category: %s\n".
"Editor: %s\n".
"Author: %s\n".
"Editable from: %s\n".
"Editable to: %s\n";
$filledMail = sprintf( $email,
$curEditor,
$title,
$title,
$catname,
$curEditor,
$author,
date("Y-m-d H:i:s", $starttime),
date("Y-m-d H:i:s", $maxtime));
$user = new User;
if (isGroup($usersequence->get("iduser")))
{
$sql = "select idgroupuser, user_id FROM ". $cfg["tab"]["groupmembers"] ." WHERE
group_id = '".Contenido_Security::escapeDB($usersequence->get("iduser"), $db)."'";
$db->query($sql);
while ($db->next_record())
{
$user->loadUserByUserID($db->f("user_id"));
echo "mail to ".$user->getField("email")."<br>";
//modified : 2008-06-25 - use php mailer class instead of mail()
$oMail->AddAddress($user->getField("email"), "");
$oMail->Subject = stripslashes (i18n('Workflow escalation'));
$oMail->Body = $filledMail;
$oMail->Send();
}
} else {
$user->loadUserByUserID($usersequence->get("iduser"));
echo "mail to ".$user->getField("email")."<br>";
//modified : 2008-06-25 - use php mailer class instead of mail()
$oMail->AddAddress($user->getField("email"), "");
$oMail->Subject = stripslashes (i18n('Workflow escalation'));
$oMail->Body = $filledMail;
$oMail->Send();
}
}
}
}
return parent::store();
}
}
?>

Datei anzeigen

@ -0,0 +1,304 @@
<?php
/**
* Project:
* Contenido Content Management System
*
* Description:
* Workflow items
*
* Requirements:
* @con_php_req 5.0
*
*
* @package Contenido Backend classes
* @version 1.3
* @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
*
* {@internal
* created 2003-07-18
*
* $Id: class.workflowitems.php 128 2019-07-03 11:58:28Z oldperl $
* }}
*
*/
if (!defined('CON_FRAMEWORK')) {
die('Illegal call');
}
/**
* Class WorkflowItems
* Class for workflow item management
* @author Timo A. Hummel <Timo.Hummel@4fb.de>
* @version 0.2
* @copyright four for business 2003
*/
class WorkflowItems extends ItemCollection {
/**
* Constructor Function
* @param string $table The table to use as information source
*/
function __construct() {
global $cfg;
parent::__construct($cfg["tab"]["workflow_items"], "idworkflowitem");
$this->_setItemClass("WorkflowItem");
}
/** @deprecated [2011-03-15] Old constructor function for downwards compatibility */
function WorkflowItems() {
cWarning(__FILE__, __LINE__, "Deprecated method call, use __construct()");
$this->__construct();
}
function delete($id) {
global $cfg;
$item = new WorkflowItem;
$item->loadByPrimaryKey($id);
$pos = $item->get("position");
$idworkflow = $item->get("idworkflow");
$oDb = new DB_ConLite();
$this->select("position > $pos AND idworkflow = '" . Contenido_Security::escapeDB($idworkflow, $oDb) . "'");
while ($obj = $this->next()) {
$obj->setPosition($obj->get("position") - 1);
$obj->store();
}
$aUserSequencesDelete = array();
$sSql = 'SELECT idusersequence FROM ' . $cfg["tab"]["workflow_user_sequences"] . ' WHERE idworkflowitem = ' . $id . ';';
$oDb->query($sSql);
while ($oDb->next_record()) {
array_push($aUserSequencesDelete, Contenido_Security::escapeDB($oDb->f('idusersequence'), $oDb));
}
$sSql = 'DELETE FROM ' . $cfg["tab"]["workflow_actions"] . ' WHERE idworkflowitem = ' . Contenido_Security::escapeDB($id, $oDb) . ';';
$oDb->query($sSql);
$this->updateArtAllocation($id, 1);
if (count($aUserSequencesDelete) > 0) {
$sSql = 'DELETE FROM ' . $cfg["tab"]["workflow_user_sequences"] . ' WHERE idusersequence in (' . implode(',', $aUserSequencesDelete) . ');';
$oDb->query($sSql);
}
}
function updateArtAllocation($idworkflowitem, $delete = false) {
global $idworkflow, $cfg;
$oDb = new DB_ConLite();
$aUserSequences = array();
$sSql = 'SELECT idusersequence FROM ' . $cfg["tab"]["workflow_user_sequences"] . ' WHERE idworkflowitem = ' . Contenido_Security::escapeDB($idworkflowitem, $oDb) . ';';
$oDb->query($sSql);
while ($oDb->next_record()) {
array_push($aUserSequences, Contenido_Security::escapeDB($oDb->f('idusersequence'), $oDb));
}
$aIdArtLang = array();
if (count($aUserSequences) > 0) {
$sSql = 'SELECT idartlang FROM ' . $cfg["tab"]["workflow_art_allocation"] . ' WHERE idusersequence in (' . implode(',', $aUserSequences) . ');';
$oDb->query($sSql);
while ($oDb->next_record()) {
array_push($aIdArtLang, $oDb->f('idartlang'));
}
$sSql = 'DELETE FROM ' . $cfg["tab"]["workflow_art_allocation"] . ' WHERE idusersequence in (' . implode(',', $aUserSequences) . ');';
$oDb->query($sSql);
}
if ($delete) {
parent::delete($idworkflowitem);
}
foreach ($aIdArtLang as $iIdArtLang) {
setUserSequence($iIdArtLang, $idworkflow);
}
}
function swap($idworkflow, $pos1, $pos2) {
$this->select("idworkflow = '$idworkflow' AND position = '$pos1'");
if (($item = $this->next()) === false) {
$this->lasterror = i18n("Swapping items failed: Item doesn't exist", "workflow");
return false;
}
$pos1ID = $item->getField("idworkflowitem");
$this->select("idworkflow = '$idworkflow' AND position = '$pos2'");
if (($item = $this->next()) === false) {
$this->lasterror = i18n("Swapping items failed: Item doesn't exist", "workflow");
return false;
}
$pos2ID = $item->getField("idworkflowitem");
$item = new WorkflowItem();
$item->loadByPrimaryKey($pos1ID);
$item->setPosition($pos2);
$item->store();
$item->loadByPrimaryKey($pos2ID);
$item->setPosition($pos1);
$item->store();
$this->updateArtAllocation($pos1ID);
$this->updateArtAllocation($pos2ID);
return (true);
}
function create($idworkflow) {
$workflows = new Workflows;
$workflows->select("idworkflow = '$idworkflow'");
if ($workflows->next() === false) {
$this->lasterror = i18n("Can't add item to workflow: Workflow doesn't exist", "workflow");
return false;
}
$this->select("idworkflow = '$idworkflow'", "", "position DESC", "1");
$item = $this->next();
if ($item === false) {
$lastPos = 1;
} else {
$lastPos = $item->getField("position") + 1;
}
$newItem = parent::createNewItem();
if ($newItem->init($idworkflow, $lastPos) === false) {
$this->delete($newItem->getField("idworkflowitem"));
$this->lasterror = $newItem->lasterror;
return false;
}
if ($item === false) {
$this->updateArtAllocation(0);
}
return ($newItem);
}
}
/**
* Class WorkflowItem
* Class for a single workflow item
* @author Timo A. Hummel <Timo.Hummel@4fb.de>
* @version 0.1
* @copyright four for business 2003
*/
class WorkflowItem extends Item {
/**
* Constructor Function
* @param string $table The table to use as information source
*/
function __construct() {
global $cfg;
parent::__construct($cfg["tab"]["workflow_items"], "idworkflowitem");
}
/** @deprecated [2011-03-15] Old constructor function for downwards compatibility */
function WorkflowItem() {
cWarning(__FILE__, __LINE__, "Deprecated method call, use __construct()");
$this->__construct();
}
function getStepRights() {
$idwfi = $this->values["idworkflowitem"];
$workflowActions = new WorkflowActions;
$actions = WorkflowActions::getAvailableWorkflowActions();
foreach ($actions as $key => $value) {
$rights[$key] = $workflowActions->get($idwfi, $key);
}
return $rights;
}
/**
* Overridden setField function.
* @param string $field Void field since we override the usual setField function
* @param string $value Void field since we override the usual setField function
*/
function setField($field, $value, $bSafe = TRUE) {
if ($this->virgin == true) {
$this->lasterror = i18n("No item loaded", "workflow");
return false;
}
if ($field == "idsequence") {
die("You can't set the idsequence field using this method. Use 'create' in the WorkflowItems class.");
}
if ($field == "idworkflow") {
die("You can't set the workflow ID using this method. Use 'create' in the WorkflowItems class!");
}
if ($field == "position") {
die("You can't set the position ID using this method. Use 'create' or 'swap' to create or move items!");
}
if ($field == "idtask" && $value != 0) {
$taskCollection = new WorkflowTasks;
$taskCollection->select("idtask = '$value'");
if ($taskCollection->next() === false) {
$this->lasterror = i18n("Requested task doesn't exist, can't assign", "workflow");
return false;
}
}
parent::setField($field, $value, $bSafe);
}
/**
* init initializes a new wf_items entry. Should
* only be called by the create function.
* @param int $idworkflow The workflow to set the item to
*/
function init($idworkflow, $idposition) {
global $cfg;
$workflows = new Workflows;
$workflows->select("idworkflow = '$idworkflow'");
if ($workflows->next() === false) {
$this->lasterror = i18n("Workflow doesn't exist", "workflow");
return false;
}
$workflowItems = new WorkflowItems;
$workflowItems->select("position = '$idposition' AND idworkflow = '$idworkflow'");
if ($workflowItems->next()) {
$this->lasterror = i18n("Position in this workflow already exists.", "workflow");
return false;
}
parent::setField("idworkflow", $idworkflow);
parent::setField("position", $idposition);
parent::store();
return true;
}
/**
* setPosition Sets the position for an item. Should only be
* called by the "swap" function
* @param int $idposition The new position ID
*/
function setPosition($idposition) {
parent::setField("position", $idposition);
parent::store();
return true;
}
}
?>

Datei anzeigen

@ -0,0 +1,106 @@
<?php
/**
* Project:
* Contenido Content Management System
*
* Description:
* Simple wrapper for workflow tasks
*
* Requirements:
* @con_php_req 5.0
*
*
* @package Contenido Backend classes
* @version 1.2
* @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
*
* {@internal
* created 2003-07-18
*
* $Id: class.workflowtasks.php 128 2019-07-03 11:58:28Z oldperl $
* }}
*
*/
if(!defined('CON_FRAMEWORK')) {
die('Illegal call');
}
/**
* Class WorkflowTasks
* Class for workflow task collections
* @author Timo A. Hummel <Timo.Hummel@4fb.de>
* @version 0.2
* @copyright four for business 2003
*/
class WorkflowTasks extends ItemCollection {
/**
* Constructor Function
* @param string $table The table to use as information source
*/
function __construct()
{
global $cfg;
parent::__construct($cfg["tab"]["tasks"], "idtask");
$this->_setItemClass("WorkflowTask");
}
/** @deprecated [2011-03-15] Old constructor function for downwards compatibility */
function WorkflowTasks()
{
cWarning(__FILE__, __LINE__, "Deprecated method call, use __construct()");
$this->__construct();
}
function create ()
{
$newitem = parent::createNewItem();
return ($newitem);
}
function select ($where = "", $group_by = "", $order_by = "", $limit = "")
{
global $client;
if ($where != "")
{
$where = $where . " AND idclient = '".Contenido_Security::escapeDB($client, NULL)."'";
}
return parent::select($where, $group_by, $order_by, $limit);
}
}
/**
* Class WorkflowTask
* Class for a single workflow task item
* @author Timo A. Hummel <Timo.Hummel@4fb.de>
* @version 0.1
* @copyright four for business 2003
*/
class WorkflowTask extends Item {
/**
* Constructor Function
* @param string $table The table to use as information source
*/
function __construct()
{
global $cfg;
parent::__construct($cfg["tab"]["tasks"], "idtask");
}
/** @deprecated [2011-03-15] Old constructor function for downwards compatibility */
function WorkflowTask()
{
cWarning(__FILE__, __LINE__, "Deprecated method call, use __construct()");
$this->__construct();
}
}
?>

Datei anzeigen

@ -0,0 +1,278 @@
<?php
/**
* Project:
* Contenido Content Management System
*
* Description:
* Workflow management class
*
* Requirements:
* @con_php_req 5.0
*
*
* @package Contenido Backend classes
* @version 1.3
* @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
*
* {@internal
* created 2003-07-18
*
* $Id: class.workflowusersequence.php 128 2019-07-03 11:58:28Z oldperl $
* }}
*
*/
if(!defined('CON_FRAMEWORK')) {
die('Illegal call');
}
/**
* Class WorkflowUserSequences
* Class for workflow user sequence management
* @author Timo A. Hummel <Timo.Hummel@4fb.de>
* @version 0.2
* @copyright four for business 2003
*/
class WorkflowUserSequences extends ItemCollection {
/**
* Constructor Function
* @param string $table The table to use as information source
*/
function __construct()
{
global $cfg;
parent::__construct($cfg["tab"]["workflow_user_sequences"], "idusersequence");
$this->_setItemClass("WorkflowUserSequence");
}
/** @deprecated [2011-03-15] Old constructor function for downwards compatibility */
function WorkflowUserSequences()
{
cWarning(__FILE__, __LINE__, "Deprecated method call, use __construct()");
$this->__construct();
}
function delete ($id)
{
global $cfg, $idworkflow;
$item = new WorkflowUserSequence;
$item->loadByPrimaryKey($id);
$pos = $item->get("position");
$idworkflowitem = $item->get("idworkflowitem");
$this->select("position > $pos AND idworkflowitem = '".Contenido_Security::escapeDB($idworkflowitem, NULL)."'");
while ($obj = $this->next())
{
$pos = $obj->get("position") -1;
$obj->setPosition($pos);
$obj->store();
}
parent::delete($id);
$this->updateArtAllocation($id);
}
function updateArtAllocation ($idusersequence) {
global $idworkflow, $cfg;
$oDb = new DB_ConLite();
$aIdArtLang = array();
$sSql = 'SELECT idartlang FROM '.$cfg["tab"]["workflow_art_allocation"].' WHERE idusersequence = '.Contenido_Security::escapeDB($idusersequence, $oDb).';';
$oDb->query($sSql);
while ($oDb->next_record()) {
array_push($aIdArtLang, $oDb->f('idartlang'));
}
$sSql = 'DELETE FROM '.$cfg["tab"]["workflow_art_allocation"].' WHERE idusersequence = '.Contenido_Security::escapeDB($idusersequence, $oDb).';';
$oDb->query($sSql);
foreach ($aIdArtLang as $iIdArtLang) {
setUserSequence($iIdArtLang, $idworkflow);
}
}
function create ($idworkflowitem)
{
global $auth, $client, $idworkflow;
$newitem = parent::createNewItem();
$workflowitems = new WorkflowItems;
if (!$workflowitems->exists($idworkflowitem))
{
$this->delete($newitem->getField("idusersequence"));
$this->lasterror = i18n("Workflow item doesn't exist. Can't create entry.", "workflow");
return false;
}
$this->select("idworkflowitem = '".Contenido_Security::escapeDB($idworkflowitem, NULL)."'","","position DESC","1");
$item = $this->next();
if ($item === false)
{
$lastPos = 1;
} else {
$lastPos = $item->getField("position") + 1;
}
$newitem->setWorkflowItem($idworkflowitem);
$newitem->setPosition($lastPos);
$newitem->store();
return ($newitem);
}
function swap ($idworkflowitem, $pos1, $pos2)
{
$this->select("idworkflowitem = '$idworkflowitem' AND position = '".Contenido_Security::escapeDB($pos1, NULL)."'");
if (($item = $this->next()) === false)
{
$this->lasterror = i18n("Swapping items failed: Item doesn't exist", "workflow");
return false;
}
$pos1ID = $item->getField("idusersequence");
$this->select("idworkflowitem = '$idworkflowitem' AND position = '".Contenido_Security::escapeDB($pos2, NULL)."'");
if (($item = $this->next()) === false)
{
$this->lasterror(i18n("Swapping items failed: Item doesn't exist", "workflow"));
return false;
}
$pos2ID = $item->getField("idusersequence");
$item = new WorkflowUserSequence();
$item->loadByPrimaryKey($pos1ID);
$item->setPosition($pos2);
$item->store();
$item->loadByPrimaryKey($pos2ID);
$item->setPosition($pos1);
$item->store();
$this->updateArtAllocation($pos2ID);
$this->updateArtAllocation($pos1ID);
return (true);
}
}
/**
* Class WorkflowUserSequence
* Class for a single workflow item
* @author Timo A. Hummel <Timo.Hummel@4fb.de>
* @version 0.1
* @copyright four for business 2003
*/
class WorkflowUserSequence extends Item {
/**
* Constructor Function
* @param string $table The table to use as information source
*/
function __construct()
{
global $cfg;
parent::__construct($cfg["tab"]["workflow_user_sequences"], "idusersequence");
}
/** @deprecated [2011-03-15] Old constructor function for downwards compatibility */
function WorkflowUserSequence()
{
cWarning(__FILE__, __LINE__, "Deprecated method call, use __construct()");
$this->__construct();
}
/**
* Override setField Function to prevent that somebody modifies
* idsequence.
* @param string $field Field to set
* @param string $valie Value to set
*/
function setField($field, $value, $bSafe = true)
{
global $cfg;
switch ($field)
{
case "idworkflowitem":
die("Please use create to modify idsequence. Direct modifications are not allowed");
case "idusersequence":
die("Please use create to modify idsequence. Direct modifications are not allowed");
case "position":
die("Please use create and swap to set the position. Direct modifications are not allowed");
case "iduser":
if ($value != 0)
{
$db = new DB_ConLite;
$sql = "SELECT user_id FROM " . $cfg["tab"]["phplib_auth_user_md5"] .
" WHERE user_id = '".Contenido_Security::escapeDB($value, $db)."'";
$db->query($sql);
if (!$db->next_record())
{
$sql = "SELECT group_id FROM " . $cfg["tab"]["groups"] .
" WHERE group_id = '".Contenido_Security::escapeDB($value, $db)."'";
$db->query($sql);
if (!$db->next_record())
{
$this->lasterror = i18n("Can't set user_id: User or group doesn't exist", "workflow");
return false;
}
}
$idusersquence = parent::getField('idusersequence');
}
}
parent::setField($field, $value, $bSafe);
if ($idusersquence) {
WorkflowUserSequences::updateArtAllocation(0);
}
}
/**
* Returns the associated workflowItem for this user sequence
* @param none
*/
function getWorkflowItem ()
{
if (!$this->virgin)
{
$workflowItem = new WorkflowItem;
$workflowItem->loadByPrimaryKey($this->values["idworkflowitem"]);
return ($workflowItem);
} else {
return false;
}
}
/**
* Interface to set idworkflowitem. Should only be called by "create".
* @param string $value The value to set
*/
function setWorkflowItem($value)
{
parent::setField("idworkflowitem", $value);
}
/**
* Interface to set idworkflowitem. Should only be called by "create".
* @param string $value The value to set
*/
function setPosition($value)
{
parent::setField("position", $value);
}
}
?>

114
cronjobs/advance_workflow.php Normale Datei
Datei anzeigen

@ -0,0 +1,114 @@
<?php
/**
* Project:
* Contenido Content Management System
*
* Description:
* Advances to the next step if the time limit is "over"
*
* Requirements:
* @con_php_req 5.0
*
*
* @package Contenido Backend classes
* @version 1.5.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
*
* {@internal
* created 2003-05-26
* modified 2010-05-20, Murat Purc, removed request check during processing ticket [#CON-307]
*
* $Id: advance_workflow.php 128 2019-07-03 11:58:28Z oldperl $
* }}
*
*/
define('CON_FRAMEWORK', true);
// Contenido startup process
include_once ('../../../includes/startup.php');
cInclude("includes", "cfg_language_de.inc.php");
cInclude("includes", "functions.con.php");
plugin_include('workflow', 'classes/class.workflow.php');
plugin_include('workflow', 'includes/functions.workflow.php');
$workflowartallocations = new WorkflowArtAllocations;
$workflowusersequences = new WorkflowUserSequences;
$workflowartallocations->select();
while ($obj = $workflowartallocations->next())
{
$starttime = $obj->get("starttime");
$idartlang = $obj->get("idartlang");
$lastidusersequence = $obj->get("lastusersequence");
$usersequence = getCurrentUserSequence($idartlang,0);
if ($usersequence != $lastidusersequence)
{
$workflowusersequences->select("idusersequence = '$usersequence'");
if ($wfobj = $workflowusersequences->next())
{
$wfitem = $wfobj->get("idworkflowitem");
$pos = $wfobj->get("position");
$timeunit = $wfobj->get("timeunit");
$timelimit = $wfobj->get("timelimit");
}
$starttime = strtotime (substr_replace (substr (substr ($starttime,0,2).chunk_split (substr ($starttime,2,6),2,"-").chunk_split (substr ($starttime,8),2,":"),0,19)," ",10,1));
switch ($timeunit)
{
case "Seconds":
$maxtime = $starttime + $timelimit;
break;
case "Minutes":
$maxtime = $starttime + ($timelimit * 60);
break;
case "Hours":
$maxtime = $starttime + ($timelimit * 3600);
break;
case "Days":
$maxtime = $starttime + ($timelimit * 86400);
break;
case "Weeks":
$maxtime = $starttime + ($timelimit * 604800);
break;
case "Months":
$maxtime = $starttime + ($timelimit * 2678400);
break;
case "Years":
$maxtime = $starttime + ($timelimit * 31536000);
break;
default:
$maxtime = $starttime + $timelimit;
}
if ($maxtime < time())
{
$pos = $pos + 1;
$workflowusersequences->select("idworkflowitem = '$wfitem' AND position = '".Contenido_Security::escapeDB($pos, NULL)."'");
if ($wfobj = $workflowusersequences->next())
{
$obj->set("idusersequence", $wfobj->get("idusersequence"));
$obj->store();
}
}
}
}
?>

BIN
images/no_verschieben.gif Normale Datei

Binäre Datei nicht angezeigt.

Nachher

Breite:  |  Höhe:  |  Größe: 121 B

BIN
images/nu_verschieben.gif Normale Datei

Binäre Datei nicht angezeigt.

Nachher

Breite:  |  Höhe:  |  Größe: 121 B

BIN
images/workflow.gif Normale Datei

Binäre Datei nicht angezeigt.

Nachher

Breite:  |  Höhe:  |  Größe: 96 B

BIN
images/workflow_alt.gif Normale Datei

Binäre Datei nicht angezeigt.

Nachher

Breite:  |  Höhe:  |  Größe: 96 B

BIN
images/workflow_email_noti.gif Normale Datei

Binäre Datei nicht angezeigt.

Nachher

Breite:  |  Höhe:  |  Größe: 90 B

BIN
images/workflow_erstellen.gif Normale Datei

Binäre Datei nicht angezeigt.

Nachher

Breite:  |  Höhe:  |  Größe: 74 B

BIN
images/workflow_escal_noti.gif Normale Datei

Binäre Datei nicht angezeigt.

Nachher

Breite:  |  Höhe:  |  Größe: 84 B

BIN
images/workflow_step.gif Normale Datei

Binäre Datei nicht angezeigt.

Nachher

Breite:  |  Höhe:  |  Größe: 61 B

Binäre Datei nicht angezeigt.

Nachher

Breite:  |  Höhe:  |  Größe: 195 B

Binäre Datei nicht angezeigt.

Nachher

Breite:  |  Höhe:  |  Größe: 61 B

BIN
images/workflow_step_new.gif Normale Datei

Binäre Datei nicht angezeigt.

Nachher

Breite:  |  Höhe:  |  Größe: 74 B

BIN
images/workflow_user.gif Normale Datei

Binäre Datei nicht angezeigt.

Nachher

Breite:  |  Höhe:  |  Größe: 113 B

453
includes/config.plugin.php Normale Datei
Datei anzeigen

@ -0,0 +1,453 @@
<?php
/**
* Project:
* Contenido Content Management System
*
* Description:
* Workflow allocation class
*
* Requirements:
* @con_php_req 5.0
*
*
* @package Contenido Backend classes
* @version 1.5
* @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
*
* @todo move functions to own file and add autoloader (Ortwin)
*
* $Id: config.plugin.php 128 2019-07-03 11:58:28Z oldperl $
*/
if(!defined('CON_FRAMEWORK')) {
die('Illegal call');
}
plugin_include('workflow', 'classes/class.workflow.php');
plugin_include('workflow', 'includes/functions.workflow.php');
global $lngAct, $modidartlang;
$lngAct["workflow"]["workflow_delete"] = i18n("Delete workflow", "workflow");
$lngAct["con_workflow"]["workflow_task_user_select"] = i18n("Select workflow task", "workflow");
$lngAct["workflow_common"]["workflow_show"] = i18n("Show workflow", "workflow");
$lngAct["workflow_common"]["workflow_create"] = i18n("Create workflow", "workflow");
$lngAct["workflow_common"]["workflow_save"] = i18n("Edit workflow", "workflow");
$lngAct["con"]["workflow_do_action"] = i18n("Process workflow step", "workflow");
$lngAct["str"]["workflow_inherit_down"] = i18n("Inherit workflow down", "workflow");
$lngAct["str"]["workflow_inherit_down"] = i18n("Inherit workflow down", "workflow");
$lngAct["workflow_steps"]["workflow_step_edit"] = i18n("Edit workflow step", "workflow");
$lngAct["workflow_steps"]["workflow_step_up"] = i18n("Move workflowstep up", "workflow");
$lngAct["workflow_steps"]["workflow_step_down"] = i18n("Move workflowstep down", "workflow");
$lngAct["workflow_steps"]["workflow_save_step"] = i18n("Save Workflowstep", "workflow");
$lngAct["workflow_steps"]["workflow_create_step"] = i18n("Create workflowstep", "workflow");
$lngAct["workflow_steps"]["workflow_step_delete"] = i18n("Delete workflowstep", "workflow");
$lngAct["workflow_steps"]["workflow_user_up"] = i18n("Move workflowstepuser up", "workflow");
$lngAct["workflow_steps"]["workflow_user_down"] = i18n("Move workflowstepuser down", "workflow");
$lngAct["workflow_steps"]["workflow_create_user"] = i18n("Create Workflowstepuser", "workflow");
$lngAct["workflow_steps"]["workflow_user_delete"] = i18n("Delete Workflowstepuser", "workflow");
$lngAct["str"]["workflow_cat_assign"] = i18n("Associate workflow with category", "workflow");
$_cecRegistry->addChainFunction("Contenido.ArticleCategoryList.ListItems", "piworkflowCreateTasksFolder");
$_cecRegistry->addChainFunction("Contenido.ArticleList.Columns", "piworkflowProcessArticleColumns");
$_cecRegistry->addChainFunction("Contenido.ArticleList.Actions", "piworkflowProcessActions");
$_cecRegistry->addChainFunction("Contenido.ArticleList.RenderColumn", "piworkflowRenderColumn");
$_cecRegistry->addChainFunction("Contenido.ArticleList.RenderAction", "piworkflowRenderAction");
$_cecRegistry->addChainFunction("Contenido.CategoryList.Columns", "piworkflowCategoryColumns");
$_cecRegistry->addChainFunction("Contenido.CategoryList.RenderColumn", "piworkflowCategoryRenderColumn");
$_cecRegistry->addChainFunction("Contenido.Frontend.AllowEdit", "piworkflowAllowArticleEdit");
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", "workflow");
$narray["wfaction"] = i18n("Workflow Action", "workflow");
$narray["wfeditor"] = i18n("Workflow Editor", "workflow");
$narray["wflaststatus"] = i18n("Last status", "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);
}
?>

Datei anzeigen

@ -0,0 +1,552 @@
<?php
/**
* 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
*
* {@internal
* created 2003-07-28
* modified 2009-11-06, Murat Purc, replaced deprecated functions (PHP 5.3 ready)
*
* $Id: functions.workflow.php 128 2019-07-03 11:58:28Z oldperl $
* }}
*
*/
if(!defined('CON_FRAMEWORK')) {
die('Illegal call');
}
cInclude("includes", "functions.con.php");
plugin_include('workflow', 'classes/class.workflowitems.php');
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);
$tpl2->set('s', 'CLASS', 'text_small');
$tpl2->set('s', 'OPTIONS', 'size=1');
$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', '');
}
$tpl2->next();
}
}
$tpl2->set('d', 'VALUE', '0');
$tpl2->set('d', 'CAPTION', '------------------------------------');
$tpl2->set('d', 'SELECTED', 'disabled');
$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', '');
}
$tpl2->next();
}
}
return $tpl2->generate($cfg['path']['templates'].$cfg['templates']['generic_select'], true);
}
function isCurrentEditor ($uid)
{
global $auth, $cfg;
/* Check if the UID is a group. If yes, check if we are in it */
$user = new User;
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)."'";
$db2->query($sql);
while ($db2->next_record())
{
if ($db2->f("user_id") == $auth->auth["uid"])
{
return true;
}
}
} else {
if ($uid == $auth->auth["uid"])
{
return true;
}
}
return false;
}
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);
$workflowItem = $userSequence->getWorkflowItem();
if ($workflowItem === false)
{
return;
}
$wfRights = $workflowItem->getStepRights();
$artAllocation = new WorkflowArtAllocations;
$artAllocation->select("idartlang = '$idartlang'");
if ($obj = $artAllocation->next())
{
$laststep = $obj->get("lastusersequence");
}
$bExistOption = false;
if ($laststep != $idusersequence)
{
$wfSelect->set('d', 'VALUE', 'next');
$wfSelect->set('d', 'CAPTION', i18n("Confirm", "workflow"));
$wfSelect->set('d', 'SELECTED', 'SELECTED');
$wfSelect->next();
$bExistOption = true;
}
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();
$bExistOption = true;
}
if ($wfRights["reject"] == true)
{
$wfSelect->set('d', 'VALUE', 'reject');
$wfSelect->set('d', 'CAPTION', i18n("Reject article", "workflow"));
$wfSelect->set('d', 'SELECTED', '');
$wfSelect->next();
$bExistOption = true;
}
if ($wfRights["revise"] == true)
{
$wfSelect->set('d', 'VALUE', 'revise');
$wfSelect->set('d', 'CAPTION', i18n("Revise article", "workflow"));
$wfSelect->set('d', 'SELECTED', '');
$wfSelect->next();
$bExistOption = true;
}
if ($bExistOption)
return ($wfSelect->generate($cfg['path']['templates'].$cfg['templates']['generic_select'], true));
else {
return false;
}
}
#function for inserting todos in wokflow_art_allocation used, when a workflow is associated with a category in content->category
function setUserSequence ($idartlang, $defaultidworkflow) {
$wfaa = new WorkflowArtAllocations;
$wfaa->select("idartlang = '$idartlang'");
$idusersequence = 0;
if ($associatedUserSequence = $wfaa->next())
{
$idartallocation = $associatedUserSequence->get("idartallocation");
$wfaa->delete($idartallocation);
}
if ($defaultidworkflow != -1) {
$newObj = $wfaa->create($idartlang);
if (!$newObj)
{
/* Try to load */
$newObj = new WorkflowArtAllocation;
echo $wfaa->lasterror;
return false;
}
/* 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");
}
$workflowUserSequences = new WorkflowUserSequences;
$workflowUserSequences->select("idworkflowitem = '$firstitem' AND position = '1'");
if ($obj = $workflowUserSequences->next())
{
$firstIDUserSequence = $obj->get("idusersequence");
}
$newObj->set("idusersequence", $firstIDUserSequence);
$newObj->store();
$idusersequence = $newObj->get("idusersequence");
$associatedUserSequence = $newObj;
}
}
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;
}
}
/* 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");
}
$workflowUserSequences = new WorkflowUserSequences;
$workflowUserSequences->select("idworkflowitem = '$firstitem' AND position = '1'");
if ($obj = $workflowUserSequences->next())
{
$firstIDUserSequence = $obj->get("idusersequence");
}
$newObj->set("idusersequence", $firstIDUserSequence);
$newObj->store();
$idusersequence = $newObj->get("idusersequence");
$associatedUserSequence = $newObj;
}
return ($idusersequence);
}
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:
}
}
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;
}
}
function workflowSelect ($listid, $default, $idcat)
{
global $idclient, $cfg, $frame, $area, $workflowworkflows, $client, $lang, $wfcache, $workflowSelectBox;
$oSelectBox = new cHTMLSelectElement('workflow');
$oSelectBox = $workflowSelectBox;
$default = (int) $default;
$workflowSelectBox->updateAttributes(array("id" => "wfselect" . $idcat));
$workflowSelectBox->updateAttributes(array("name" => "wfselect" . $idcat));
$workflowSelectBox->setDefault($default);
$sButton ='<a href="javascript:setWorkflow('.$idcat.', \''."wfselect".$idcat.'\')"><img src="'.$cfg["path"]["images"].'submit.gif" class="spaced"></a>';
return $workflowSelectBox->render().$sButton;
}
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>';
return $sButton;
}
?>

Datei anzeigen

@ -0,0 +1,109 @@
<?php
/**
* Project:
* Contenido Content Management System
*
* Description:
* Contains workflow editing functions
*
* Requirements:
* @con_php_req 5.0
*
*
* @package Contenido Backend classes
* @version 1.3
* @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
*
* {@internal
* created 2003-05-20
*
* $Id: include.workflow_edit.php 128 2019-07-03 11:58:28Z oldperl $
* }}
*
*/
if(!defined('CON_FRAMEWORK')) {
die('Illegal call');
}
plugin_include('workflow', 'classes/class.workflow.php');
$form = new UI_Table_Form("workflow_edit");
$userclass = new User;
$workflows = new Workflows;
$workflow = $workflows->loadItem($idworkflow);
if ($action == "workflow_save")
{
if ($idworkflow == "-1")
{
$workflow = $workflows->create();
}
$workflow->set("name",clHtmlSpecialChars($wfname));
$workflow->set("description",clHtmlSpecialChars($wfdescription));
$idworkflow = $workflow->get("idworkflow");
$workflow->store();
}
if ((int) $idworkflow == 0) {
$idworkflow = $_GET['idworkflow'];
}
if ($idworkflow) {
$sReloadScript = "<script type=\"text/javascript\">
var left_bottom = top.content.frames['left'].frames['left_bottom'];
var right_top = top.content.frames['right'].frames['right_top'];
if (left_bottom) {
var href = left_bottom.location.href;
href = href.replace(/&action=workflow_delete/, '');
left_bottom.location.href = href+'&idworkflow='+".$idworkflow.";
}
if (right_top) {
right_top.location.href = right_top.location.href+'&idworkflow='+".$idworkflow.";
}
</script>";
} else {
$sReloadScript = '';
}
//function formGenerateField ($type, $name, $initvalue, $width, $maxlen)
$form->setVar("area",$area);
$form->setVar("action","workflow_save");
$form->setVar("idworkflow", $idworkflow);
$form->setVar("frame", $frame);
if ($workflow->virgin)
{
$name = i18n("New Workflow", "workflow");
$header = i18n("Create new workflow", "workflow");
} else {
$header = i18n("Edit workflow", "workflow");
$description = $workflow->get("description");
$name = $workflow->get("name");
$created = $workflow->get("created");
$author = $userclass->getRealname($workflow->get("idauthor"));
}
$form->addHeader($header);
$form->add(i18n("Workflow name", "workflow"),formGenerateField("text","wfname",$name,40,255));
$form->add(i18n("Description", "workflow"),formGenerateField("textbox","wfdescription",$description,50,10));
$form->add(i18n("Author", "workflow"),$author);
$form->add(i18n("Created", "workflow"),$created);
$page = new UI_Page;
$page->setContent($form->render(true));
$page->addScript('reload', $sReloadScript);
$page->render();
?>

Datei anzeigen

@ -0,0 +1,48 @@
<?php
/**
* Project:
* Contenido Content Management System
*
* Description:
* Workflow allocation class
*
* Requirements:
* @con_php_req 5.0
*
*
* @package Contenido Backend classes
* @version 1.5
* @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
*
* {@internal
* created 2003-07-18
*
* $Id: include.workflow_left_top.php 128 2019-07-03 11:58:28Z oldperl $
* }}
*
*/
if(!defined('CON_FRAMEWORK')) {
die('Illegal call');
}
$create = new Link;
$create->setMultiLink("workflow","","workflow_common","workflow_create");
//$create->setCLink("workflow_common",4,"workflow_create");
$create->setContent(i18n("Create workflow", "workflow"));
$create->setCustom("idworkflow","-1");
$aAttributes = array();
$aAttributes['class'] = "addfunction";
$create->updateAttributes($aAttributes);
$ui = new UI_Left_Top;
$ui->setLink($create);
$ui->render();
?>

Datei anzeigen

@ -0,0 +1,129 @@
<?php
/**
* Project:
* Contenido Content Management System
*
* Description:
* Workflow list
*
* Requirements:
* @con_php_req 5.0
*
*
* @package Contenido Backend classes
* @version 1.5
* @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
*
* {@internal
* created 2006-01-13
*
* $Id: include.workflow_list.php 128 2019-07-03 11:58:28Z oldperl $
* }}
*
*/
if(!defined('CON_FRAMEWORK')) {
die('Illegal call');
}
$iIdMarked = (int) $_GET['idworkflow'];
plugin_include('workflow', 'classes/class.workflow.php');
$workflows = new Workflows;
$sScript = '';
if ($action == "workflow_delete")
{
$workflows->delete($idworkflow);
$sScript = '<script type="text/javascript">
var right_top = top.content.frames["right"].frames["right_top"];
var right_bottom = top.content.frames["right"].frames["right_bottom"];
if (right_top) {
right_top.location.href = "'.$sess->url('main.php?area=workflow&frame=3').'";
}
if (right_bottom) {
right_bottom.location.href = "'.$sess->url('main.php?area=workflow&frame=4').'";
}
</script>';
}
$ui = new UI_Menu;
$workflows->select("idclient = '$client' AND idlang = '$lang'");
while ($workflow = $workflows->next())
{
$wfid = $workflow->getField("idworkflow");
$wfname = $workflow->getField("name");
$wfdescription = $workflow->getField("description");
/* Create the link to show/edit the workflow */
$link = new Link;
$link->setMultiLink("workflow","","workflow_common","workflow_show");
$link->setAlt($wfdescription);
$link->setCustom("idworkflow",$wfid);
$delTitle = i18n("Delete workflow", "workflow");
$delDescr = sprintf(i18n("Do you really want to delete the following workflow:<br><br>%s<br>", "workflow"),$wfname);
$delete = '<a title="'.$delTitle.'" href="javascript://" onclick="box.confirm(\''.$delTitle.'\', \''.$delDescr.'\', \'deleteWorkflow(\\\''.$wfid.'\\\')\')"><img src="'.$cfg['path']['images'].'delete.gif" border="0" title="'.$delTitle.'" alt="'.$delTitle.'"></a>';
$ui->setTitle($wfid, $wfname);
$ui->setLink($wfid, $link);
$ui->setActions($wfid, 'delete', $delete);
if ($wfid == $iIdMarked) {
$ui->setExtra ($wfid, 'id="marked" ');
}
}
$content = $ui->render(false);
$delScript = '
<script type="text/javascript">
function foo(){return true;}
/* Session-ID */
var sid = "'.$sess->id.'";
/* Create messageBox
instance */
box = new messageBox("", "", "", 0, 0);
/* Function for deleting
modules */
function deleteWorkflow(idworkflow) {
url = "main.php?area=workflow";
url += "&action=workflow_delete";
url += "&frame=2";
url += "&idworkflow=" + idworkflow;
url += "&contenido=" + sid;
parent.left_bottom.location.href = url;
}
</script>';
$sInitRowMark = "<script type=\"text/javascript\">
if (document.getElementById('marked')) {
row.markedRow = document.getElementById('marked');
}
</script>";
$msgboxInclude = ' <script type="text/javascript" src="scripts/messageBox.js.php?contenido='.$sess->id.'"></script>';
$page = new UI_Page;
$page->addScript('include', $msgboxInclude);
$page->addScript('del',$delScript);
$page->addScript('refresh', $sScript);
$page->setMargin(0);
$page->setContent($content.$sInitRowMark);
$page->render();
?>

Datei anzeigen

@ -0,0 +1,405 @@
<?php
/**
* Project:
* Contenido Content Management System
*
* Description:
* Class for workflow allocation management
*
* Requirements:
* @con_php_req 5.0
*
*
* @package Contenido Backend classes
* @version 1.0
* @author Unknwon
* @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
*
* @modified 2008-12-05 Andreas Lindner, make select box values for time unit selection language independent
* {@internal
* created
*
* $Id: include.workflow_steps.php 128 2019-07-03 11:58:28Z oldperl $:
* }}
*
*/
if(!defined('CON_FRAMEWORK')) {
die('Illegal call');
}
plugin_include('workflow', 'classes/class.workflow.php');
plugin_include('workflow', 'includes/functions.workflow.php');
cInclude("includes", "functions.encoding.php");
$iIdMarked = (int) $_GET['idworkflowitem'];
$availableWorkflowActions= WorkflowActions :: getAvailableWorkflowActions();
$sCurrentEncoding = getEncodingByLanguage ($db, $lang, $cfg);
if (clHtmlEntities($adduser, ENT_COMPAT, $sCurrentEncoding) == i18n("Add User", "workflow")) {
$action= "workflow_create_user";
}
/* Function: Move step up */
if ($action == "workflow_step_up") {
$workflowitems= new WorkflowItems;
$workflowitems->swap($idworkflow, $position, $position -1);
}
/* Function: Move step down */
if ($action == "workflow_step_down") {
$workflowitems= new WorkflowItems;
$workflowitems->swap($idworkflow, $position, $position +1);
}
/* Function: Move user up */
if ($action == "workflow_user_up") {
$workflowitems= new WorkflowUserSequences;
$workflowitems->swap($idworkflowitem, $position, $position -1);
}
/* Function: Move step down */
if ($action == "workflow_user_down") {
$workflowitems= new WorkflowUserSequences;
$workflowitems->swap($idworkflowitem, $position, $position +1);
}
/* Function: Create new step */
if ($action == "workflow_create_step") {
$workflowitems= new WorkflowItems;
$item= $workflowitems->create($idworkflow);
$item->set("name", i18n("New Workflow Step", "workflow"));
$item->store();
$idworkflowitem= $item->get("idworkflowitem");
}
/* Function: Delete step */
if ($action == "workflow_step_delete") {
$workflowitems= new WorkflowItems;
$workflowitems->delete($idworkflowitem);
}
/* Function: Add user */
if ($action == "workflow_create_user") {
$workflowusers= new WorkflowUserSequences;
$new= $workflowusers->create($idworkflowitem);
}
/* Function: Remove user */
if ($action == "workflow_user_delete") {
$workflowusers= new WorkflowUserSequences;
$workflowusers->delete($idusersequence);
}
/* Function: Save step */
if ($action == "workflow_save_step" || $action == "workflow_create_user") {
$workflowactions= new WorkflowActions;
foreach ($availableWorkflowActions as $key => $value) {
if ($wfactions[$key] == 1) {
$workflowactions->set($idworkflowitem, $key);
} else {
$workflowactions->remove($idworkflowitem, $key);
}
}
$workflowitem= new WorkflowItem;
$workflowitem->loadByPrimaryKey($idworkflowitem);
$workflowitem->setField('idtask', $wftaskselect);
$workflowitem->setField('name', $wfstepname);
$workflowitem->setField('description', $wfstepdescription);
$workflowitem->store();
$usersequences= new WorkflowUserSequences;
$usersequences->select("idworkflowitem = '$idworkflowitem'");
while ($usersequence= $usersequences->next()) {
$wftime= "time" . $usersequence->get("idusersequence");
$wfuser= "user" . $usersequence->get("idusersequence");
$wftimelimit= "wftimelimit" . $usersequence->get("idusersequence");
$usersequence->set("timeunit", $$wftime);
$usersequence->set("iduser", $$wfuser);
$usersequence->set("timelimit", $$wftimelimit);
$usersequence->set("emailnoti", $wfemailnoti[$usersequence->get("idusersequence")]);
$usersequence->set("escalationnoti", $wfescalnoti[$usersequence->get("idusersequence")]);
$usersequence->store();
}
}
function getTimeUnitSelector($listid, $default) {
global $idclient, $cfg, $auth;
$timeunits = array ();
$timeunits['Seconds'] = i18n("Seconds", "workflow");
$timeunits['Minutes'] = i18n("Minutes", "workflow");
$timeunits['Hours'] = i18n("Hours", "workflow");
$timeunits['Days'] = i18n("Days", "workflow");
$timeunits['Weeks'] = i18n("Weeks", "workflow");
$timeunits['Months'] = i18n("Months", "workflow");
$timeunits['Years'] = i18n("Years", "workflow");
$tpl2= new Template;
$tpl2->set('s', 'NAME', 'time' . $listid);
$tpl2->set('s', 'CLASS', 'text_small');
$tpl2->set('s', 'OPTIONS', 'size=1');
foreach ($timeunits as $key => $value) {
$tpl2->set('d', 'VALUE', $key);
$tpl2->set('d', 'CAPTION', $value);
if ($default == $key) {
$tpl2->set('d', 'SELECTED', 'SELECTED');
} else {
$tpl2->set('d', 'SELECTED', '');
}
$tpl2->next();
}
return $tpl2->generate($cfg['path']['templates'] . $cfg['templates']['generic_select'], true);
}
function getWorkflowList() {
global $idworkflow, $cfg;
$ui= new UI_Menu;
$workflowitems= new WorkflowItems;
$workflowitems->select("idworkflow = '$idworkflow'", "", "position ASC");
while ($workflowitem= $workflowitems->next()) {
$pos= $workflowitem->get("position");
$name= $workflowitem->get("name");
$id= $workflowitem->get("idworkflowitem");
$edititem= new Link;
$edititem->setCLink("workflow_steps", 4, "workflow_step_edit");
$edititem->setCustom("idworkflowitem", $id);
$edititem->setCustom("idworkflow", $idworkflow);
$moveup= new Link;
$moveup->setCLink("workflow_steps", 4, "workflow_step_up");
$moveup->setCustom("idworkflowitem", $id);
$moveup->setCustom("idworkflow", $idworkflow);
$moveup->setCustom("position", $pos);
$moveup->setAlt(i18n("Move step up", "workflow"));
$moveup->setContent('<img style="padding-left: 2px" border="0" src="' . $cfg["path"]["contenido_fullhtml"] . $cfg["path"]["plugins"] . "workflow/images/no_verschieben.gif" . '">');
$movedown= new Link;
$movedown->setCLink("workflow_steps", 4, "workflow_step_down");
$movedown->setCustom("idworkflowitem", $id);
$movedown->setCustom("idworkflow", $idworkflow);
$movedown->setCustom("position", $pos);
$movedown->setAlt(i18n("Move step down", "workflow"));
$movedown->setContent('<img style="padding-left: 2px" border="0" src="' . $cfg["path"]["contenido_fullhtml"] . $cfg["path"]["plugins"] . "workflow/images/nu_verschieben.gif" . '">');
$deletestep= new Link;
$deletestep->setCLink("workflow_steps", 4, "workflow_step_delete");
$deletestep->setCustom("idworkflowitem", $id);
$deletestep->setCustom("idworkflow", $idworkflow);
$deletestep->setCustom("position", $pos);
$deletestep->setAlt(i18n("Delete step", "workflow"));
$deletestep->setContent('<img style="padding-left: 2px" border="0" src="' . $cfg["path"]["contenido_fullhtml"] . $cfg["path"]["plugins"] . "workflow/images/workflow_step_delete.gif" . '">');
$ui->setTitle($id, "$pos. $name");
$ui->setLink($id, $edititem);
if ($pos > 1) {
$ui->setActions($id, "moveup", $moveup->render());
} else {
$ui->setActions($id, "moveup", '<img style="padding-left: 2px" src="images/spacer.gif" width="15" height="1">');
}
if ($pos < $workflowitems->count()) {
$ui->setActions($id, "movedown", $movedown->render());
} else {
$ui->setActions($id, "movedown", '<img style="padding-left: 2px" src="images/spacer.gif" width="15" height="1">');
}
$ui->setActions($id, "delete", $deletestep->render());
if ($_GET['idworkflowitem'] == $id) {
$ui->setExtra ($id, 'id="marked" ');
}
}
$content= $ui->render(false);
return ($content);
}
function createNewWorkflow() {
global $idworkflow, $cfg;
$content= "";
$ui= new UI_Menu;
$rowmark = false;
$createstep= new Link;
$createstep->setCLink("workflow_steps", 4, "workflow_create_step");
$createstep->setCustom("idworkflow", $idworkflow);
#$ui->setLink("spacer", NULL);
$ui->setTitle("create", i18n("Create new step", "workflow"));
$ui->setImage("create", $cfg["path"]["contenido_fullhtml"] . $cfg["path"]["plugins"] . "workflow/images/workflow_step_new.gif");
$ui->setLink("create", $createstep);
$ui->setRowmark ($rowmark);
$ui->setBgColor("create", $cfg['color']['table_header']);
$content= $ui->render(false);
return $content;
}
function editWorkflowStep($idworkflowitem) {
global $area, $idworkflow, $idworkflowitem, $frame, $availableWorkflowActions;
global $notification;
$workflowitem= new WorkflowItem;
if ($workflowitem->loadByPrimaryKey($idworkflowitem) == false) {
return "&nbsp;";
}
$workflowactions= new WorkflowActions;
$stepname= $workflowitem->get("name");
$stepdescription= $workflowitem->get("description");
$id= $workflowitem->get("idworkflowitem");
$task= $workflowitem->get("idtask");
$form= new UI_Table_Form("workflow_edit");
$form->setVar("area", $area);
$form->setVar("action", "workflow_save_step");
$form->setVar("idworkflow", $idworkflow);
$form->setVar("idworkflowitem", $idworkflowitem);
$form->setVar("frame", $frame);
$form->addHeader(i18n("Edit workflow step", "workflow"));
$form->add(i18n("Step name", "workflow"), formGenerateField("text", "wfstepname", $stepname, 40, 255));
$form->add(i18n("Step description", "workflow"), formGenerateField("textbox", "wfstepdescription", $stepdescription, 60, 10));
foreach ($availableWorkflowActions as $key => $value) {
$actions .= formGenerateCheckbox("wfactions[" . $key . "]", "1", $workflowactions->get($id, $key)) . '<label for="wfactions[' . $key . ']1">' . $value . '</label>' . "<br>";
}
$form->add(i18n("Actions", "workflow"), $actions);
$form->add(i18n("Assigned users", "workflow"), getWorkflowUsers($idworkflowitem));
return $form->render(true);
}
function getWorkflowUsers($idworkflowitem) {
global $idworkflow, $cfg;
$ui= new UI_Menu;
$workflowusers= new WorkflowUserSequences;
$workflowusers->select("idworkflowitem = '$idworkflowitem'", "", "position ASC");
while ($workflowitem= $workflowusers->next()) {
$pos= $workflowitem->get("position");
$iduser= $workflowitem->get("iduser");
$timelimit= $workflowitem->get("timelimit");
$timeunit= $workflowitem->get("timeunit");
$email= $workflowitem->get("emailnoti");
$escalation= $workflowitem->get("escalationnoti");
$timeunit= $workflowitem->get("timeunit");
$id= $workflowitem->get("idusersequence");
$moveup= new Link;
$moveup->setCLink("workflow_steps", 4, "workflow_user_up");
$moveup->setCustom("idworkflowitem", $idworkflowitem);
$moveup->setCustom("idworkflow", $idworkflow);
$moveup->setCustom("position", $pos);
$moveup->setAlt(i18n("Move user up", "workflow"));
#$moveup->setContent('<img border="0" style="padding-left: 2px" src="images/pfeil_hoch.gif">');
$moveup->setContent('<img style="padding-left: 2px" border="0" src="' . $cfg["path"]["contenido_fullhtml"] . $cfg["path"]["plugins"] . "workflow/images/no_verschieben.gif" . '">');
$movedown= new Link;
$movedown->setCLink("workflow_steps", 4, "workflow_user_down");
$movedown->setCustom("idworkflowitem", $idworkflowitem);
$movedown->setCustom("idworkflow", $idworkflow);
$movedown->setCustom("position", $pos);
$movedown->setAlt(i18n("Move user down", "workflow"));
$movedown->setContent('<img style="padding-left: 2px" border="0" src="' . $cfg["path"]["contenido_fullhtml"] . $cfg["path"]["plugins"] . "workflow/images/nu_verschieben.gif" . '">');
$deletestep= new Link;
$deletestep->setCLink("workflow_steps", 4, "workflow_user_delete");
$deletestep->setCustom("idworkflowitem", $idworkflowitem);
$deletestep->setCustom("idworkflow", $idworkflow);
$deletestep->setCustom("position", $pos);
$deletestep->setCustom("idusersequence", $id);
$deletestep->setAlt(i18n("Delete user", "workflow"));
$deletestep->setContent('<img style="padding-left: 2px" border="0" src="' . $cfg["path"]["contenido_fullhtml"] . $cfg["path"]["plugins"] . "workflow/images/workflow_step_delete.gif" . '">');
$title= "$pos. " . getUsers($id, $iduser);
$title .= formGenerateField("text", "wftimelimit" . $id, $timelimit, 3, 6);
$title .= getTimeUnitSelector($id, $timeunit);
$altmail= i18n("Notify this user via E-Mail", "workflow");
$altnoti= i18n("Escalate to this user via E-Mail", "workflow");
$title .= formGenerateCheckbox("wfemailnoti[" . $id . "]", "1", $email) . '<label for="wfemailnoti[' . $id . ']1"><img alt="' . $altmail . '" title="' . $altmail . '" style="padding-left: 2px" border="0" src="' . $cfg["path"]["contenido_fullhtml"] . $cfg["path"]["plugins"] . "workflow/images/workflow_email_noti.gif" . '"></label>';
$title .= formGenerateCheckbox("wfescalnoti[" . $id . "]", "1", $escalation) . '<label for="wfescalnoti[' . $id . ']1"><img alt="' . $altnoti . '" title="' . $altnoti . '" style="padding-left: 2px" border="0" src="' . $cfg["path"]["contenido_fullhtml"] . $cfg["path"]["plugins"] . "workflow/images/workflow_escal_noti.gif" . '"></label>';
$ui->setTitle($id, $title);
$ui->setLink($id, NULL);
if ($pos > 1) {
$ui->setActions($id, "moveup", $moveup->render());
} else {
$ui->setActions($id, "moveup", '<img style="padding-left: 2px" src="images/spacer.gif" width="15" height="1">');
}
if ($pos < $workflowusers->count()) {
$ui->setActions($id, "movedown", $movedown->render());
} else {
$ui->setActions($id, "movedown", '<img style="padding-left: 2px" src="images/spacer.gif" width="15" height="1">');
}
$ui->setActions($id, "delete", $deletestep->render());
$ui->setImage($id, $cfg["path"]["contenido_fullhtml"] . $cfg["path"]["plugins"] . "workflow/images/workflow_user.gif");
}
$createstep= new Link;
$createstep->setCLink("workflow_steps", 4, "workflow_create_user");
$createstep->setCustom("idworkflow", $idworkflow);
$createstep->setCustom("idworkflowitem", $idworkflowitem);
$ui->setLink("spacer", NULL);
$ui->setTitle("create", '<input class="text_medium" type="submit" name="adduser" value="' . i18n("Add User", "workflow") . '">');
$ui->setLink("create", NULL);
$content= $ui->render(false);
return ($content);
}
$tpl= new Template;
$tpl->set('s', 'NEW', createNewWorkflow());
$tpl->set('s', 'STEPS', getWorkflowList());
$tpl->set('s', 'EDITSTEP', editWorkflowStep($idworkflowitem));
$tpl->set('s', 'BORDERCOLOR', $cfg["color"]["table_border"]);
$frame= $tpl->generate($cfg["path"]["contenido"] . $cfg["path"]["plugins"] . "workflow/templates/template.workflow_steps.html", true);
$page= new UI_Page;
$page->setContent($frame);
$page->render();
?>

Datei anzeigen

@ -0,0 +1,113 @@
<?php
/**
* Project:
* Contenido Content Management System
*
* Description:
* Builds the third navigation layer
*
* Requirements:
* @con_php_req 5.0
*
*
* @package Contenido Backend classes
* @version 1.1.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
*
* {@internal
* created 2003-05-20
* modified 2010-05-20, Murat Purc, removed request check during processing ticket [#CON-307]
*
* $Id: include.workflow_subnav.php 128 2019-07-03 11:58:28Z oldperl $
* }}
*
*/
if (!defined('CON_FRAMEWORK')) {
die('Illegal call');
}
$nav = new Contenido_Navigation;
$parentarea = getParentAreaID($area);
$sql = "SELECT
idarea
FROM
".$cfg["tab"]["area"]." AS a
WHERE
a.name = '".Contenido_Security::escapeDB($parentarea, $db)."' OR
a.parent_id = '".Contenido_Security::escapeDB($parentarea, $db)."'
ORDER BY
idarea";
$db->query($sql);
$in_str = "";
while ( $db->next_record() ) {
$in_str .= $db->f('idarea') . ',';
}
$len = strlen($in_str)-1;
$in_str = substr($in_str, 0, $len);
$in_str = '('.$in_str.')';
$sql = "SELECT
b.location AS location,
a.name AS name
FROM
".$cfg["tab"]["area"]." AS a,
".$cfg["tab"]["nav_sub"]." AS b
WHERE
b.idarea IN ".Contenido_Security::escapeDB($in_str, $db)." AND
b.idarea = a.idarea AND
b.level = 1
ORDER BY
b.idnavs";
$db->query($sql);
while ( $db->next_record() ) {
# Extract caption from
# the xml language file
$caption = $nav->getName($db->f("location"));
$tmp_area = $db->f("name");
# Set template data
$tpl->set("d", "ID", 'c_'.$tpl->dyn_cnt);
$tpl->set("d", "CLASS", '');
$tpl->set("d", "OPTIONS", '');
$tpl->set("d", "CAPTION", '<a class="white" onclick="sub.clicked(this)" target="right_bottom" href="'.$sess->url("main.php?area=$tmp_area&frame=4&idworkflow=$idworkflow").'">'.$caption.'</a>');
if ($area == $tmp_area)
{
$tpl->set('s', 'DEFAULT', markSubMenuItem($tpl->dyn_cnt,true));
}
$tpl->next();
}
$tpl->set('s', 'COLSPAN', ($tpl->dyn_cnt * 2) + 2);
$tpl->set('s', 'IDCAT', $idcat);
$tpl->set('s', 'SESSID', $sess->id);
$tpl->set('s', 'CLIENT', $client);
$tpl->set('s', 'LANG', $lang);
# Generate the third
# navigation layer
if ($idworkflow <= 0)
{
$tpl->generate($cfg["path"]["templates"].$cfg["templates"]["subnav_blank"]);
} else {
$tpl->generate($cfg["path"]["templates"] . $cfg["templates"]["subnav"]);
}
?>

Datei anzeigen

@ -0,0 +1,274 @@
<?php
/**
* Project:
* Contenido Content Management System
*
* Description:
* Workflow task overview mask
*
* Requirements:
* @con_php_req 5.0
*
*
* @package Contenido Backend classes
* @version 1.4
* @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
*
* {@internal
* created 2003-07-30
*
* $Id: include.workflow_tasks.php 128 2019-07-03 11:58:28Z oldperl $
* }}
*
*/
if(!defined('CON_FRAMEWORK')) {
die('Illegal call');
}
plugin_include('workflow', 'classes/class.workflow.php');
plugin_include('workflow', 'includes/functions.workflow.php');
global $sess;
$sSession = $sess->id;
$wfa = new WorkflowArtAllocations;
$wfu = new WorkflowUserSequences;
$users = new User;
$db2 = new DB_ConLite;
ob_start();
if ($usershow == "")
{
$usershow = $auth->auth["uid"];
}
if (!$perm->have_perm_area_action($area, "workflow_task_user_select"))
{
$usershow = $auth->auth["uid"];
}
if ($action == "workflow_do_action")
{
$selectedAction = "wfselect".$modidartlang;
doWorkflowAction($modidartlang, $GLOBALS[$selectedAction]);
}
$wfa->select();
while ($wfaitem = $wfa->next())
{
$wfaid = $wfaitem->get("idartallocation");
$usersequence[$wfaid] = $wfaitem->get("idusersequence");
$lastusersequence[$wfaid] = $wfaitem->get("lastusersequence");
$article[$wfaid] = $wfaitem->get("idartlang");
}
if (is_array($usersequence))
{
foreach ($usersequence as $key => $value)
{
$wfu->select("idusersequence = '$value'");
if ($obj = $wfu->next())
{
$userids[$key] = $obj->get("iduser");
}
}
}
if (is_array($userids))
{
foreach ($userids as $key=>$value)
{
$isCurrent[$key] = false;
if ($usershow == $value)
{
$isCurrent[$key] = true;
}
if ($users->loadUserByUserID($value) == false)
{
/* Yes, it's a group. Let's try to load the group members! */
$sql = "SELECT user_id FROM "
.$cfg["tab"]["groupmembers"]."
WHERE group_id = '".$value."'";
$db2->query(Contenido_Security::escapeDB($sql, $db2));
while ($db2->next_record())
{
if ($db2->f("user_id") == $usershow)
{
$isCurrent[$key] = true;
}
}
} else {
if ($value == $usershow)
{
$isCurrent[$key] = true;
}
}
if ($lastusersequence[$key] == $usersequence[$key])
{
$isCurrent[$key] = false;
}
}
}
$tpl->reset();
$tpl->setEncoding('iso-8859-1');
$tpl->set('s', 'SESSID', $sSession);
$tpl->set('s', 'SESSNAME', $sess->name);
$iIDCat = 0;
$iIDTpl = 0;
if ($perm->have_perm_area_action($area, "workflow_task_user_select"))
{
$form = new UI_Form("showusers", $sess->url("main.php?area=$area&frame=$frame"));
$form->setVar("area",$area);
$form->setEvent("submit", "setUsershow();");
$form->setVar("frame", $frame);
$form->setVar("action", "workflow_task_user_select");
$form->add("select",i18n("Show users").": ".getUsers("show",$usershow));
$form->add("button", '<input style="vertical-align:middle;" type="image" src="'.$cfg["path"]["htmlpath"].$cfg["path"]["images"]."submit.gif".'">');
$tpl->set('s', 'USERSELECT', $form->render(true));
} else {
$tpl->set('s', 'USERSELECT', '');
}
$pageTitle = i18n('Search results').' - '.i18n('Workflow tasks', 'workflow');
$tpl->set('s', 'PAGE_TITLE', $pageTitle);
$tpl->set('s', 'TH_START', i18n("Article"));
$tpl->set('s', 'TH_TEMPLATE', i18n("Template"));
$tpl->set('s', 'TH_ACTIONS', i18n("Actions"));
$tpl->set('s', 'TH_TITLE', i18n("Title"));
$tpl->set('s', 'TH_CHANGED', i18n("Changed"));
$tpl->set('s', 'TH_PUBLISHED', i18n("Published"));
$tpl->set('s', 'TH_WORKFLOW_STEP', i18n("Workflow Step", 'workflow'));
$tpl->set('s', 'TH_WORKFLOW_ACTION', i18n("Workflow Action", 'workflow'));
$tpl->set('s', 'TH_WORKFLOW_EDITOR', i18n("Workflow Editor"));
$tpl->set('s', 'TH_LAST_STATUS', i18n("Last status", 'workflow'));
$currentUserSequence = new WorkflowUserSequence;
if (is_array($isCurrent))
{
foreach ($isCurrent as $key => $value)
{
if ($value == true)
{
$idartlang = Contenido_Security::toInteger($article[$key]);
$lang = Contenido_Security::toInteger($lang);
$client = Contenido_Security::toInteger($client);
$sql = "SELECT B.idcat AS idcat, A.title AS title, A.created AS created, A.lastmodified AS changed,
A.idart as idart, E.name as tpl_name, A.idartlang as idartlang, F.idcatlang as idcatlang,
B.idcatart as idcatart, A.idlang as art_lang, F.startidartlang as startidartlang
FROM (".$cfg["tab"]["art_lang"]." AS A,
".$cfg["tab"]["cat_art"]." AS B,
".$cfg["tab"]["art"]." AS C)
LEFT JOIN ".$cfg['tab']['tpl_conf']." as D ON A.idtplcfg = D.idtplcfg
LEFT JOIN ".$cfg['tab']['tpl']." as E ON D.idtpl = E.`idtpl`
LEFT JOIN ".$cfg['tab']['cat_lang']." as F ON B.idcat = F.`idcat`
WHERE A.idartlang = '$idartlang' AND
A.idart = B.idart AND
A.idart = C.idart AND
A.idlang = '$lang' AND
C.idclient = '$client';";
$db->query($sql);
if ($db->next_record())
{
global $area;
//$area = "con";
$idcat = $db->f("idcat");
$idart = $db->f("idart");
# create javascript multilink
$tmp_mstr = '<a href="javascript://" onclick="javascript:conMultiLink(\'%s\', \'%s\', \'%s\', \'%s\')" title="idart: '.$db->f('idart').' idcatart: '.$db->f('idcatart').'" alt="idart: '.$db->f('idart').' idcatart: '.$db->f('idcatart').'">%s</a>';
$mstr = sprintf($tmp_mstr, 'right_top',
$sess->url("main.php?area=con&frame=3&idcat=$idcat&idtpl=$idtpl"),
'right_bottom',
$sess->url("main.php?area=con_editart&action=con_edit&frame=4&idcat=$idcat&idtpl=$idtpl&idart=$idart"),
$db->f("title"));
$laststatus = getLastWorkflowStatus($idartlang);
$username = getGroupOrUserName($userids[$key]);
$actionSelect = piworkflowRenderColumn($idcat, $idart, $db->f('idartlang'), 'wfaction');
$currentUserSequence->loadByPrimaryKey($usersequence[$key]);
$workflowItem = $currentUserSequence->getWorkflowItem();
$step = $workflowItem->get("name");
$description = $workflowItem->get("description");
$sRowId = $db->f('idart').'-'.$db->f('idartlang').'-'.$db->f('idcat').'-'.$db->f('idcatlang').'-'.$db->f('idcatart').'-'.$db->f('art_lang');
if( $db->f('startidartlang') == $db->f('idartlang') ) {
$makeStartarticle = "<img src=\"images/isstart1.gif\" border=\"0\" title=\"{$sFlagTitle}\" alt=\"{$sFlagTitle}\">";
} else {
$makeStartarticle = "<img src=\"images/isstart0.gif\" border=\"0\" title=\"{$sFlagTitle}\" alt=\"{$sFlagTitle}\">";
}
$todoListeSubject = i18n("Reminder");
$sReminder = i18n("Set reminder / add to todo list");
$sReminderHtml = "<a id=\"m1\" onclick=\"javascript:window.open('main.php?subject=$todoListeSubject&amp;area=todo&amp;frame=1&amp;itemtype=idart&amp;itemid=$idart&amp;contenido=$sSession', 'todo', 'scrollbars=yes, height=300, width=550');\" alt=\"$sReminder\" title=\"$sReminder\" href=\"#\"><img id=\"m2\" style=\"padding-left: 2px; padding-right: 2px;\" alt=\"$sReminder\" src=\"images/but_setreminder.gif\" border=\"0\"></a>";
$templatename = $db->f('tpl_name');
if (!empty($templatename)) {
$templatename = clHtmlEntities($templatename);
} else {
$templatename = '--- ' . i18n("None") . ' ---';
}
if ($i == 0) {
$iIDCat = $db->f("idcat");
$iIDTpl = $idtpl;
$tpl->set('s', 'FIRST_ROWID', $sRowId);
}
$tpl->set('d', 'START', $makeStartarticle);
$tpl->set('d', 'TITLE', $mstr);
$tpl->set('d', 'LAST_STATUS', $laststatus);
$tpl->set('d', 'WORKFLOW_EDITOR', $username);
$tpl->set('d', 'WORKFLOW_STEP', $step);
$tpl->set('d', 'WORKFLOW_ACTION', $actionSelect);
$tpl->set('d', 'TEMPLATE', $templatename);
$tpl->set('d', 'BGCOLOR', $cfg['color']['table_dark_offline']);
$tpl->set('d', 'ROWID', $sRowId);
$tpl->set('d', 'ACTIONS', $sReminderHtml);
$tpl->next();
$i++;
}
}
}
}
if ($i > 0) {
$tpl->set('s', 'NO_ARTICLES_ROW');
} else {
$sRow = '<tr><td colspan="8" class="bordercell">' . i18n("No article found.") . '</td></tr>';
$tpl->set('s', 'NO_ARTICLES_ROW', $sRow);
}
$sLoadSubnavi = 'parent.parent.frames["right"].frames["right_top"].location.href = \'main.php?area=con&frame=3&idcat=' . $iIDCat . '&idtpl=' . $iIDTpl . '&contenido=' . $sSession . "';";
$tpl->set('s', 'SUBNAVI', $sLoadSubnavi);
$frame = ob_get_contents();
ob_end_clean();
$tpl->generate($cfg["path"]['contenido'] . $cfg["path"]["plugins"] . "workflow/templates/template.workflow_tasks.html");
?>

Binäre Datei nicht angezeigt.

Datei anzeigen

@ -0,0 +1,453 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-05-18 11:03+0200\n"
"PO-Revision-Date: 2011-05-18 11:17+0100\n"
"Last-Translator: Ortwin Pinke <translation@dceonline.de>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Poedit-Basepath: M:\\Projekte_Persoenlich\\timo.hummel\\plugin_sources\\\n"
"X-Poedit-KeywordsList: i18n\n"
"X-Poedit-SearchPath-0: workflow\n"
#: includes/config.plugin.php:40
#: includes/include.workflow_list.php:71
msgid "Delete workflow"
msgstr "Workflow l&ouml;schen"
#: includes/config.plugin.php:41
msgid "Select workflow task"
msgstr "Workflow-Aufgabe auswählen"
#: includes/config.plugin.php:42
msgid "Show workflow"
msgstr "Workflow zeigen"
#: includes/config.plugin.php:43
#: includes/include.workflow_left_top.php:37
msgid "Create workflow"
msgstr "Neuer Workflow"
#: includes/config.plugin.php:44
#: includes/include.workflow_edit.php:89
msgid "Edit workflow"
msgstr "Workflow bearbeiten"
#: includes/config.plugin.php:45
msgid "Process workflow step"
msgstr "Workflow Schritt durchf&uuml;hren"
#: includes/config.plugin.php:46
#: includes/config.plugin.php:47
#: includes/config.plugin.php:178
msgid "Inherit workflow down"
msgstr "Workflow nach unten vererben"
#: includes/config.plugin.php:48
#: includes/include.workflow_steps.php:292
msgid "Edit workflow step"
msgstr "Workflow Schritt bearbeiten"
#: includes/config.plugin.php:49
msgid "Move workflowstep up"
msgstr "Workflowschritt nach oben verschieben"
#: includes/config.plugin.php:50
msgid "Move workflowstep down"
msgstr "Workflowschritt nach unten verschieben"
#: includes/config.plugin.php:51
msgid "Save Workflowstep"
msgstr "Workflowschritt speichen"
#: includes/config.plugin.php:52
msgid "Create workflowstep"
msgstr "Workflowschritt erstellen"
#: includes/config.plugin.php:53
msgid "Delete workflowstep"
msgstr "Workflowschritt l&ouml;schen"
#: includes/config.plugin.php:54
msgid "Move workflowstepuser up"
msgstr "Workflowschrittbenutzer nach oben verschieben"
#: includes/config.plugin.php:55
msgid "Move workflowstepuser down"
msgstr "Workflowschrittbenutzer nach unten verschieben"
#: includes/config.plugin.php:56
msgid "Create Workflowstepuser"
msgstr "Workflowschrittbenutzer erstellen"
#: includes/config.plugin.php:57
msgid "Delete Workflowstepuser"
msgstr "Workflowschrittbenutzer l&ouml;schen"
#: includes/config.plugin.php:58
msgid "Associate workflow with category"
msgstr "Workflow zu Kategorien zuweisen"
#: includes/config.plugin.php:165
#: includes/config.plugin.php:421
#: includes/config.plugin.php:427
#: includes/include.workflow_tasks.php:233
#: includes/functions.workflow.php:54
#: includes/functions.workflow.php:356
msgid "None"
msgstr "Kein"
#: includes/config.plugin.php:197
msgid "Workflow"
msgstr "Workflow"
#: includes/config.plugin.php:300
#: includes/include.workflow_tasks.php:157
msgid "Workflow Step"
msgstr "Workflow Schritt"
#: includes/config.plugin.php:301
#: includes/include.workflow_tasks.php:158
msgid "Workflow Action"
msgstr "Workflow Aktion"
#: includes/config.plugin.php:302
#: includes/include.workflow_tasks.php:159
msgid "Workflow Editor"
msgstr "Workflow Bearbeiter"
#: includes/config.plugin.php:303
#: includes/include.workflow_tasks.php:160
msgid "Last status"
msgstr "Letzter Status"
#: includes/include.workflow_tasks.php:140
msgid "Show users"
msgstr "Zeige Benutzer"
#: includes/include.workflow_tasks.php:148
msgid "Search results"
msgstr "Suchergebnis"
#: includes/include.workflow_tasks.php:148
msgid "Workflow tasks"
msgstr "Workflow Aufgaben"
#: includes/include.workflow_tasks.php:151
msgid "Article"
msgstr "Artikel"
#: includes/include.workflow_tasks.php:152
msgid "Template"
msgstr "Template"
#: includes/include.workflow_tasks.php:153
#: includes/include.workflow_steps.php:300
msgid "Actions"
msgstr "Aktionen"
#: includes/include.workflow_tasks.php:154
msgid "Title"
msgstr "Titel"
#: includes/include.workflow_tasks.php:155
msgid "Changed"
msgstr "Ge&auml;ndert"
#: includes/include.workflow_tasks.php:156
msgid "Published"
msgstr "Ver&ouml;ffentlichen"
#: includes/include.workflow_tasks.php:225
msgid "Reminder"
msgstr "Wiedervorlage"
#: includes/include.workflow_tasks.php:226
msgid "Set reminder / add to todo list"
msgstr "Wiedervorlage / zur Todoliste hinzuf&uegen"
#: includes/include.workflow_tasks.php:262
#, fuzzy
msgid "No article found."
msgstr "Kein Artikel gefunden"
#: includes/include.workflow_edit.php:86
msgid "New Workflow"
msgstr "Neuer Workflow"
#: includes/include.workflow_edit.php:87
msgid "Create new workflow"
msgstr "Neuer Workflow erzeugen"
#: includes/include.workflow_edit.php:97
msgid "Workflow name"
msgstr "Workflow Name"
#: includes/include.workflow_edit.php:98
msgid "Description"
msgstr "Beschreibung"
#: includes/include.workflow_edit.php:99
msgid "Author"
msgstr "Autor"
#: includes/include.workflow_edit.php:100
msgid "Created"
msgstr "Erstellt"
#: includes/include.workflow_list.php:72
#, php-format
msgid "Do you really want to delete the following workflow:<br><br>%s<br>"
msgstr "Wollen Sie wirklich den folgenden Workflow l&ouml;schen:<br><br>%s<br>"
#: includes/include.workflow_steps.php:46
#: includes/include.workflow_steps.php:388
msgid "Add User"
msgstr "Benutzer hinzuf&uuml;gen"
#: includes/include.workflow_steps.php:78
msgid "New Workflow Step"
msgstr "Neuer Workflow Schritt"
#: includes/include.workflow_steps.php:142
msgid "Seconds"
msgstr "Sekunden"
#: includes/include.workflow_steps.php:143
msgid "Minutes"
msgstr "Minuten"
#: includes/include.workflow_steps.php:144
msgid "Hours"
msgstr "Stunden"
#: includes/include.workflow_steps.php:145
msgid "Days"
msgstr "Tage"
#: includes/include.workflow_steps.php:146
msgid "Weeks"
msgstr "Wochen"
#: includes/include.workflow_steps.php:147
msgid "Months"
msgstr "Monate"
#: includes/include.workflow_steps.php:148
msgid "Years"
msgstr "Jahre"
#: includes/include.workflow_steps.php:197
msgid "Move step up"
msgstr "Schritt nach oben bewegen"
#: includes/include.workflow_steps.php:205
msgid "Move step down"
msgstr "Schritt nach unten verschieben"
#: includes/include.workflow_steps.php:215
msgid "Delete step"
msgstr "Schritt l&ouml;schen"
#: includes/include.workflow_steps.php:257
msgid "Create new step"
msgstr "Neuen Schritt erzeugen"
#: includes/include.workflow_steps.php:293
msgid "Step name"
msgstr "Name des Schritts"
#: includes/include.workflow_steps.php:294
msgid "Step description"
msgstr "Beschreibung des Schritts"
#: includes/include.workflow_steps.php:301
msgid "Assigned users"
msgstr "Zugeordnete Benutzer"
#: includes/include.workflow_steps.php:329
msgid "Move user up"
msgstr "Benutzer nach oben verschieben"
#: includes/include.workflow_steps.php:338
msgid "Move user down"
msgstr "Benutzer nach unten verschieben"
#: includes/include.workflow_steps.php:349
msgid "Delete user"
msgstr "Benutzer l&ouml;schen"
#: includes/include.workflow_steps.php:355
msgid "Notify this user via E-Mail"
msgstr "Diesen Benutzer per e-Mail benachrichtigen"
#: includes/include.workflow_steps.php:356
msgid "Escalate to this user via E-Mail"
msgstr "An diesen Benutzer per e-Mail eskalieren"
#: includes/functions.workflow.php:183
msgid "Confirm"
msgstr "Best&auml;tigen"
#: includes/functions.workflow.php:192
msgid "Back to last editor"
msgstr "Zur&uuml;ck zum letzten Bearbeiter"
#: includes/functions.workflow.php:201
#: classes/class.workflowactions.php:77
msgid "Reject article"
msgstr "Artikel ablehnen"
#: includes/functions.workflow.php:210
#: classes/class.workflowactions.php:81
msgid "Revise article"
msgstr "Artikel &uuml;berarbeiten"
#: includes/functions.workflow.php:344
msgid "Rejected"
msgstr "Abgelehnt"
#: includes/functions.workflow.php:347
msgid "Revised"
msgstr "&uuml;berarbeitet"
#: includes/functions.workflow.php:350
msgid "Last"
msgstr "Letzter"
#: includes/functions.workflow.php:353
msgid "Confirmed"
msgstr "Best&auml;tigt"
#: classes/class.workflowartallocation.php:72
msgid "Article doesn't exist"
msgstr "Artikel existiert nicht."
#: classes/class.workflowartallocation.php:80
msgid "Article is already assigned to a usersequence step."
msgstr "Artikel ist bereits Benutzerschritt zugeordnet."
#: classes/class.workflowartallocation.php:286
#: classes/class.workflowartallocation.php:295
msgid "Workflow notification"
msgstr "Workflow Notifikation"
#: classes/class.workflowartallocation.php:336
#: classes/class.workflowartallocation.php:346
msgid "Workflow escalation"
msgstr "Workflow Steigerung"
#: classes/class.workflowallocation.php:117
#: classes/class.workflowallocation.php:223
msgid "Category already has a workflow assigned"
msgstr "Kategorie ist bereits Workflow zugeordnet"
#: classes/class.workflowallocation.php:126
#: classes/class.workflowallocation.php:199
#: classes/class.workflowitems.php:299
msgid "Workflow doesn't exist"
msgstr "Workflow existiert nicht"
#: classes/class.workflowallocation.php:233
msgid "Category doesn't exist, assignment failed"
msgstr "Kategorie existiert nicht, Zuordnung fehlgeschlagen"
#: classes/class.workflowitems.php:133
#: classes/class.workflowitems.php:142
#: classes/class.workflowusersequence.php:139
#: classes/class.workflowusersequence.php:148
msgid "Swapping items failed: Item doesn't exist"
msgstr "Tausch der Eintr&auml;ge fehlgeschlagen: Eintrag nicht vorhanden"
#: classes/class.workflowitems.php:169
msgid "Can't add item to workflow: Workflow doesn't exist"
msgstr "Zuordnung des Eintrags zum Workflow nicht m&ouml;glich: Workflow existiert nicht"
#: classes/class.workflowitems.php:251
msgid "No item loaded"
msgstr "Kein Eintrag geladen"
#: classes/class.workflowitems.php:276
msgid "Requested task doesn't exist, can't assign"
msgstr "Gew&uuml;nschte Aufgabe existiert nicht, Zuordnung nicht m&ouml;glich"
#: classes/class.workflowitems.php:307
msgid "Position in this workflow already exists."
msgstr "Position existiert bereits in diesem Workflow."
#: classes/class.workflowactions.php:74
msgid "Publish article"
msgstr "Artikel ver&ouml;ffentlichen"
#: classes/class.workflowactions.php:75
msgid "Lock article"
msgstr "Artikel sperren"
#: classes/class.workflowactions.php:76
msgid "Move back to last editor"
msgstr "Zur&uuml;ck zum letzten Bearbeiter"
#: classes/class.workflowactions.php:78
msgid "Edit article content"
msgstr "Artikelinhalt bearbeiten"
#: classes/class.workflowactions.php:79
msgid "Edit article properties"
msgstr "Artikeleigenschaften bearbeiten"
#: classes/class.workflowactions.php:80
msgid "Edit template"
msgstr "Template bearbeiten"
#: classes/class.workflowusersequence.php:112
msgid "Workflow item doesn't exist. Can't create entry."
msgstr "Workflow existiert nicht. Eintrag kann nicht erstellt werden."
#: classes/class.workflowusersequence.php:229
msgid "Can't set user_id: User or group doesn't exist"
msgstr "Kann Benutzer-Id nicht zuweisen: Benutzer oder Gruppe nicht vorhanden"
#~ msgid "Recently edited articles"
#~ msgstr "Zuletzt bearbeitete Artikel"
#~ msgid "Change client"
#~ msgstr "Mandanten wechseln"
#~ msgid "Welcome"
#~ msgstr "Willkommen"
#~ msgid "You are logged in as"
#~ msgstr "Sie sind angemeldet als"
#~ msgid "Last login"
#~ msgstr "Letzter Login"
#~ msgid "Article is online"
#~ msgstr "Artikel ist online"
#~ msgid "Article is offline"
#~ msgstr "Artikel ist offline"
#~ msgid "Current workflow tasks"
#~ msgstr "Aktuelle Workflow Aufgaben"
#~ msgid "Client"
#~ msgstr "Mandant"
#~ msgid "Language"
#~ msgstr "Sprache"
#~ msgid "No tasks found"
#~ msgstr "Keine Aufgabe gefunden"
#~ msgid "Status"
#~ msgstr "Status"
#~ msgid "Step"
#~ msgstr "Schritt"
#~ msgid "Assign workflow to category"
#~ msgstr "Workflow einer Kategorie zuordnen"

18
locale/potfiles.txt Normale Datei
Datei anzeigen

@ -0,0 +1,18 @@
./includes/include.workflow_subnav.php
./includes/config.plugin.php
./includes/include.workflow_tasks.php
./includes/include.workflow_edit.php
./includes/include.workflow_left_top.php
./includes/include.workflow_list.php
./includes/include.workflow_steps.php
./includes/functions.workflow.php
./cronjobs/advance_workflow.php
./templates/template.workflow_steps.html
./templates/template.workflow_tasks.html
./classes/class.workflowartallocation.php
./classes/class.workflowallocation.php
./classes/class.workflowitems.php
./classes/class.workflowactions.php
./classes/class.workflowtasks.php
./classes/class.workflowusersequence.php
./classes/class.workflow.php

398
locale/workflow.pot Normale Datei
Datei anzeigen

@ -0,0 +1,398 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-05-18 11:03+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: includes/config.plugin.php:40 includes/include.workflow_list.php:71
msgid "Delete workflow"
msgstr ""
#: includes/config.plugin.php:41
msgid "Select workflow task"
msgstr ""
#: includes/config.plugin.php:42
msgid "Show workflow"
msgstr ""
#: includes/config.plugin.php:43 includes/include.workflow_left_top.php:37
msgid "Create workflow"
msgstr ""
#: includes/config.plugin.php:44 includes/include.workflow_edit.php:89
msgid "Edit workflow"
msgstr ""
#: includes/config.plugin.php:45
msgid "Process workflow step"
msgstr ""
#: includes/config.plugin.php:46 includes/config.plugin.php:47
#: includes/config.plugin.php:178
msgid "Inherit workflow down"
msgstr ""
#: includes/config.plugin.php:48 includes/include.workflow_steps.php:292
msgid "Edit workflow step"
msgstr ""
#: includes/config.plugin.php:49
msgid "Move workflowstep up"
msgstr ""
#: includes/config.plugin.php:50
msgid "Move workflowstep down"
msgstr ""
#: includes/config.plugin.php:51
msgid "Save Workflowstep"
msgstr ""
#: includes/config.plugin.php:52
msgid "Create workflowstep"
msgstr ""
#: includes/config.plugin.php:53
msgid "Delete workflowstep"
msgstr ""
#: includes/config.plugin.php:54
msgid "Move workflowstepuser up"
msgstr ""
#: includes/config.plugin.php:55
msgid "Move workflowstepuser down"
msgstr ""
#: includes/config.plugin.php:56
msgid "Create Workflowstepuser"
msgstr ""
#: includes/config.plugin.php:57
msgid "Delete Workflowstepuser"
msgstr ""
#: includes/config.plugin.php:58
msgid "Associate workflow with category"
msgstr ""
#: includes/config.plugin.php:165 includes/config.plugin.php:421
#: includes/config.plugin.php:427 includes/include.workflow_tasks.php:233
#: includes/functions.workflow.php:54 includes/functions.workflow.php:356
msgid "None"
msgstr ""
#: includes/config.plugin.php:197
msgid "Workflow"
msgstr ""
#: includes/config.plugin.php:300 includes/include.workflow_tasks.php:157
msgid "Workflow Step"
msgstr ""
#: includes/config.plugin.php:301 includes/include.workflow_tasks.php:158
msgid "Workflow Action"
msgstr ""
#: includes/config.plugin.php:302 includes/include.workflow_tasks.php:159
msgid "Workflow Editor"
msgstr ""
#: includes/config.plugin.php:303 includes/include.workflow_tasks.php:160
msgid "Last status"
msgstr ""
#: includes/include.workflow_tasks.php:140
msgid "Show users"
msgstr ""
#: includes/include.workflow_tasks.php:148
msgid "Search results"
msgstr ""
#: includes/include.workflow_tasks.php:148
msgid "Workflow tasks"
msgstr ""
#: includes/include.workflow_tasks.php:151
msgid "Article"
msgstr ""
#: includes/include.workflow_tasks.php:152
msgid "Template"
msgstr ""
#: includes/include.workflow_tasks.php:153
#: includes/include.workflow_steps.php:300
msgid "Actions"
msgstr ""
#: includes/include.workflow_tasks.php:154
msgid "Title"
msgstr ""
#: includes/include.workflow_tasks.php:155
msgid "Changed"
msgstr ""
#: includes/include.workflow_tasks.php:156
msgid "Published"
msgstr ""
#: includes/include.workflow_tasks.php:225
msgid "Reminder"
msgstr ""
#: includes/include.workflow_tasks.php:226
msgid "Set reminder / add to todo list"
msgstr ""
#: includes/include.workflow_tasks.php:262
msgid "No article found."
msgstr ""
#: includes/include.workflow_edit.php:86
msgid "New Workflow"
msgstr ""
#: includes/include.workflow_edit.php:87
msgid "Create new workflow"
msgstr ""
#: includes/include.workflow_edit.php:97
msgid "Workflow name"
msgstr ""
#: includes/include.workflow_edit.php:98
msgid "Description"
msgstr ""
#: includes/include.workflow_edit.php:99
msgid "Author"
msgstr ""
#: includes/include.workflow_edit.php:100
msgid "Created"
msgstr ""
#: includes/include.workflow_list.php:72
#, php-format
msgid "Do you really want to delete the following workflow:<br><br>%s<br>"
msgstr ""
#: includes/include.workflow_steps.php:46
#: includes/include.workflow_steps.php:388
msgid "Add User"
msgstr ""
#: includes/include.workflow_steps.php:78
msgid "New Workflow Step"
msgstr ""
#: includes/include.workflow_steps.php:142
msgid "Seconds"
msgstr ""
#: includes/include.workflow_steps.php:143
msgid "Minutes"
msgstr ""
#: includes/include.workflow_steps.php:144
msgid "Hours"
msgstr ""
#: includes/include.workflow_steps.php:145
msgid "Days"
msgstr ""
#: includes/include.workflow_steps.php:146
msgid "Weeks"
msgstr ""
#: includes/include.workflow_steps.php:147
msgid "Months"
msgstr ""
#: includes/include.workflow_steps.php:148
msgid "Years"
msgstr ""
#: includes/include.workflow_steps.php:197
msgid "Move step up"
msgstr ""
#: includes/include.workflow_steps.php:205
msgid "Move step down"
msgstr ""
#: includes/include.workflow_steps.php:215
msgid "Delete step"
msgstr ""
#: includes/include.workflow_steps.php:257
msgid "Create new step"
msgstr ""
#: includes/include.workflow_steps.php:293
msgid "Step name"
msgstr ""
#: includes/include.workflow_steps.php:294
msgid "Step description"
msgstr ""
#: includes/include.workflow_steps.php:301
msgid "Assigned users"
msgstr ""
#: includes/include.workflow_steps.php:329
msgid "Move user up"
msgstr ""
#: includes/include.workflow_steps.php:338
msgid "Move user down"
msgstr ""
#: includes/include.workflow_steps.php:349
msgid "Delete user"
msgstr ""
#: includes/include.workflow_steps.php:355
msgid "Notify this user via E-Mail"
msgstr ""
#: includes/include.workflow_steps.php:356
msgid "Escalate to this user via E-Mail"
msgstr ""
#: includes/functions.workflow.php:183
msgid "Confirm"
msgstr ""
#: includes/functions.workflow.php:192
msgid "Back to last editor"
msgstr ""
#: includes/functions.workflow.php:201 classes/class.workflowactions.php:77
msgid "Reject article"
msgstr ""
#: includes/functions.workflow.php:210 classes/class.workflowactions.php:81
msgid "Revise article"
msgstr ""
#: includes/functions.workflow.php:344
msgid "Rejected"
msgstr ""
#: includes/functions.workflow.php:347
msgid "Revised"
msgstr ""
#: includes/functions.workflow.php:350
msgid "Last"
msgstr ""
#: includes/functions.workflow.php:353
msgid "Confirmed"
msgstr ""
#: classes/class.workflowartallocation.php:72
msgid "Article doesn't exist"
msgstr ""
#: classes/class.workflowartallocation.php:80
msgid "Article is already assigned to a usersequence step."
msgstr ""
#: classes/class.workflowartallocation.php:286
#: classes/class.workflowartallocation.php:295
msgid "Workflow notification"
msgstr ""
#: classes/class.workflowartallocation.php:336
#: classes/class.workflowartallocation.php:346
msgid "Workflow escalation"
msgstr ""
#: classes/class.workflowallocation.php:117
#: classes/class.workflowallocation.php:223
msgid "Category already has a workflow assigned"
msgstr ""
#: classes/class.workflowallocation.php:126
#: classes/class.workflowallocation.php:199
#: classes/class.workflowitems.php:299
msgid "Workflow doesn't exist"
msgstr ""
#: classes/class.workflowallocation.php:233
msgid "Category doesn't exist, assignment failed"
msgstr ""
#: classes/class.workflowitems.php:133 classes/class.workflowitems.php:142
#: classes/class.workflowusersequence.php:139
#: classes/class.workflowusersequence.php:148
msgid "Swapping items failed: Item doesn't exist"
msgstr ""
#: classes/class.workflowitems.php:169
msgid "Can't add item to workflow: Workflow doesn't exist"
msgstr ""
#: classes/class.workflowitems.php:251
msgid "No item loaded"
msgstr ""
#: classes/class.workflowitems.php:276
msgid "Requested task doesn't exist, can't assign"
msgstr ""
#: classes/class.workflowitems.php:307
msgid "Position in this workflow already exists."
msgstr ""
#: classes/class.workflowactions.php:74
msgid "Publish article"
msgstr ""
#: classes/class.workflowactions.php:75
msgid "Lock article"
msgstr ""
#: classes/class.workflowactions.php:76
msgid "Move back to last editor"
msgstr ""
#: classes/class.workflowactions.php:78
msgid "Edit article content"
msgstr ""
#: classes/class.workflowactions.php:79
msgid "Edit article properties"
msgstr ""
#: classes/class.workflowactions.php:80
msgid "Edit template"
msgstr ""
#: classes/class.workflowusersequence.php:112
msgid "Workflow item doesn't exist. Can't create entry."
msgstr ""
#: classes/class.workflowusersequence.php:229
msgid "Can't set user_id: User or group doesn't exist"
msgstr ""

Datei anzeigen

@ -0,0 +1,13 @@
<div class="grey">
{NEW}
</div>
<div class="left_list">
{STEPS}
</div>
<div class="right_list">
{EDITSTEP}
</div>
<div class="right_list">
i18n('Warning: Changes will reset active Workflows')
</div>

Datei anzeigen

@ -0,0 +1,157 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>{TITLE}</title>
<meta http-equiv="expires" content="0">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="pragma" content="no-cache">
<link rel="stylesheet" type="text/css" href="styles/contenido.css" />
<script type="text/javascript" src="scripts/rowMark.js"></script>
<script type="text/javascript" src="scripts/general.js"></script>
<script type="text/javascript" src="scripts/messageBox.js.php?{SESSNAME}={SESSID}"></script>
<script type="text/javascript" src="scripts/articleObject.js.php?{SESSNAME}={SESSID}"></script>
<script type="text/javascript">
<!--
/* Contenido Session-ID */
var sid = "{SESSID}";
/* New messageBox instance */
box = new messageBox("", "", "", 0, 0);
/* Function for deleting articles */
function deleteArticle(idart, idcat) {
var url = "main.php?area=con&action=con_deleteart&frame=4&idcat="+idcat+"&idart="+idart+"&{SESSNAME}="+sid;
window.location.href = url;
}
function setUsershow() {
document.forms['showusers'].setAttribute('action', document.forms['showusers'].getAttribute('action')+'&usershow='+document.showusers.usershow.value);
}
//-->
</script>
</head>
<body style="margin: 10px;">
<div style="border: 1px solid #B3B3B3; background: #E2E2E2; margin: 0 0 10px 0; padding: 2px; vertical-ailgn:middle; line-height:20px;">
<div style="float:right; width:400px; text-align:right;">{USERSELECT}</div>
{PAGE_TITLE}
<div style="clear:both;"></div>
</div>
<table width="100%" border="0" cellspacing="0" cellpadding="2" class="bordered" style="display:{DISPLAY}">
<tr>
<td width="1%" class="headerbordercell" nowrap="nowrap">{TH_START}</td>
<td width="100%" class="headerbordercell" nowrap="nowrap">{TH_TITLE}</td>
<td width="100%" class="headerbordercell" nowrap="nowrap">{TH_WORKFLOW_STEP}</td>
<td width="1%" class="headerbordercell" nowrap="nowrap">{TH_WORKFLOW_ACTION}</td>
<td width="1%" class="headerbordercell" nowrap="nowrap">{TH_WORKFLOW_EDITOR}</td>
<td width="1%" class="headerbordercell" nowrap="nowrap">{TH_LAST_STATUS}</td>
<td width="1%" class="headerbordercell" nowrap="nowrap">{TH_TEMPLATE}</td>
<td width="1%" class="headerbordercell" nowrap="nowrap">{TH_ACTIONS}</td>
</tr>
<!-- BEGIN:BLOCK -->
<tr id="{ROWID}" class="text_medium" style="{BGCOLOR}" onmouseover="artRow.over(this)" onmouseout="artRow.out(this)" onclick="artRow.click(this)">
<td nowrap="nowrap" class="bordercell">{START}</td>
<td nowrap="nowrap" class="bordercell">{TITLE}</td>
<td nowrap="nowrap" class="bordercell">{WORKFLOW_STEP}</td>
<td nowrap="nowrap" class="bordercell">{WORKFLOW_ACTION}</td>
<td nowrap="nowrap" class="bordercell">{WORKFLOW_EDITOR}</td>
<td nowrap="nowrap" class="bordercell">{LAST_STATUS}</td>
<td nowrap="nowrap" class="bordercell">{TEMPLATE}</td>
<td nowrap="nowrap" class="bordercell">{ACTIONS}</td>
</tr>
<!-- END:BLOCK -->
{NO_ARTICLES_ROW}
</table>
<script type="text/javascript">
<!--
rcount = 0;
/* Update frame right top for sub navigation */
{SUBNAVI}
/* Create a reference to the Article Object in frame 'right_top' */
artObj = parent.parent.frames["left"].frames["left_top"].artObj;
/* Reset article object
properties. e.g. Some article was edited and we are now back in the
overview mask. There is now no marked article, the articleObject data
should be reset. */
if ( artObj ) {
artObj.reset();
artObj.enable();
artObj.setHrefOverview(document.location.href);
}
/* Timeout to call the function afer 250ms */
window.setTimeout("createReference()", 250);
/* Javascript-Error work-around... try to create the reference after
250ms again... and hope it works.. */
function createReference() {
if( !artObj ) {
artObj=parent.parent.frames["left"].frames["left_top"].artObj;
if( artObj ) {
artObj.reset();
artObj.enable();
artObj.setHrefOverview(document.location.href);
}
}
if( !artObj ) {
return false;
}
}
/* Extract data from the article grid and send
them to the articleObject Instance. The data is stored in the
attribute 'id' of the row object. */
function conArtOverviewExtractData( obj ) {
if( !artObj ) {
var rval=createReference();
if (rval== false) {
return false;
}
}
var datastring=obj.id;
var data=datastring.split( "-" );
if ( data.length== 6 ) {
/* Send data to articleObject instance:
0: idart
1: idartlang
2: idcat
3: idcatlang
5: idcatart */
artObj.setProperties(data[0], data[1], data[2], data[3], data[4], data[5]);
}
return true;
}
/* Mark the first submenu item i.e. 'Overview' */
if( parent.parent.frames['right'].frames['right_top'].document.getElementById('c_0') ) {
menuItem=parent.parent.frames['right'].frames['right_top'].document.getElementById('c_0');
parent.parent.frames['right'].frames['right_top'].sub.click(menuItem);
}
function initTheOne() {
var theOne = document.getElementById("{FIRST_ROWID}");
artRow.reset();
artRow.over( theOne );
artRow.click( theOne )
}
initTheOne();
//-->
</script>
</body>
</html>

17
xml/lang_de_DE.xml Normale Datei
Datei anzeigen

@ -0,0 +1,17 @@
<?xml version="1.0"?>
<language>
<navigation>
<extra>
<workflow>
<main>Workflow</main>
<settings>Workflow-Einstellungen</settings>
<steps>Schritte</steps>
</workflow>
</extra>
</navigation>
</language>

17
xml/lang_en_EN.xml Normale Datei
Datei anzeigen

@ -0,0 +1,17 @@
<?xml version="1.0"?>
<language>
<navigation>
<extra>
<workflow>
<main>Workflow</main>
<settings>Workflow-Properties</settings>
<steps>Steps</steps>
</workflow>
</extra>
</navigation>
</language>

17
xml/lang_en_US.xml Normale Datei
Datei anzeigen

@ -0,0 +1,17 @@
<?xml version="1.0"?>
<language>
<navigation>
<extra>
<workflow>
<main>Workflow</main>
<settings>Workflow-Properties</settings>
<steps>Steps</steps>
</workflow>
</extra>
</navigation>
</language>