304 Zeilen
9,4 KiB
PHP
304 Zeilen
9,4 KiB
PHP
|
<?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;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
?>
|