Overview

Packages

  • Core
    • Authentication
    • Backend
    • Cache
    • CEC
    • Chain
    • ContentType
    • Database
    • Datatype
    • Debug
    • Exception
    • Frontend
      • Search
      • URI
      • Util
    • GenericDB
      • Model
    • GUI
      • HTML
    • I18N
    • LayoutHandler
    • Log
    • Security
    • Session
    • Util
    • Validation
    • Versioning
    • XML
  • Module
    • ContentSitemapHtml
    • ContentSitemapXml
    • ContentUserForum
    • NavigationMain
    • NavigationTop
  • mpAutoloaderClassMap
  • None
  • Plugin
    • ContentAllocation
    • CronjobOverview
    • FormAssistant
    • FrontendLogic
    • FrontendUsers
    • Linkchecker
    • ModRewrite
    • Newsletter
    • Repository
      • FrontendNavigation
      • KeywordDensity
    • SearchSolr
    • SmartyWrapper
    • UrlShortener
    • UserForum
    • Workflow
  • PluginManager
  • Setup
    • Form
    • GUI
    • Helper
      • Environment
      • Filesystem
      • MySQL
      • PHP
    • UpgradeJob

Classes

  • Workflow
  • WorkflowAction
  • WorkflowActions
  • WorkflowAllocation
  • WorkflowAllocations
  • WorkflowArtAllocation
  • WorkflowArtAllocations
  • WorkflowItem
  • WorkflowItems
  • Workflows
  • WorkflowTask
  • WorkflowTasks
  • WorkflowUserSequence
  • WorkflowUserSequences

Functions

  • createNewWorkflow
  • doWorkflowAction
  • editWorkflowStep
  • getActionSelect
  • getCatLang
  • getCurrentUserSequence
  • getLastWorkflowStatus
  • getTimeUnitSelector
  • getUsers
  • getWorkflowForCat
  • getWorkflowForUserSequence
  • getWorkflowList
  • getWorkflowUsers
  • isCurrentEditor
  • piworkflowAllowArticleEdit
  • piworkflowCategoryColumns
  • piworkflowCategoryRenderColumn
  • piworkflowCreateTasksFolder
  • piworkflowProcessActions
  • piworkflowProcessArticleColumns
  • piworkflowRenderAction
  • piworkflowRenderColumn
  • prepareWorkflowItems
  • setUserSequence
  • workflowInherit
  • workflowSelect
  • Overview
  • Package
  • Function
  • Tree
  • Deprecated
  • Todo
  1: <?php
  2: /**
  3:  * This file contains the workflow allocation.
  4:  *
  5:  * @package Plugin
  6:  * @subpackage Workflow
  7:  * @version SVN Revision $Rev:$
  8:  *
  9:  * @author Timo Hummel
 10:  * @copyright four for business AG <www.4fb.de>
 11:  * @license http://www.contenido.org/license/LIZENZ.txt
 12:  * @link http://www.4fb.de
 13:  * @link http://www.contenido.org
 14:  */
 15: 
 16: defined('CON_FRAMEWORK') || die('Illegal call: Missing framework initialization - request aborted.');
 17: 
 18: plugin_include('workflow', 'classes/class.workflow.php');
 19: plugin_include('workflow', 'includes/functions.workflow.php');
 20: 
 21: global $_cecRegistry, $lngAct, $modidartlang;
 22: 
 23: $lngAct['workflow']['workflow_delete'] = i18n('Delete workflow', 'workflow');
 24: $lngAct['con_workflow']['workflow_task_user_select'] = i18n('Select workflow task', 'workflow');
 25: $lngAct['workflow_common']['workflow_show'] = i18n('Show workflow', 'workflow');
 26: $lngAct['workflow_common']['workflow_create'] = i18n('Create workflow', 'workflow');
 27: $lngAct['workflow_common']['workflow_save'] = i18n('Edit workflow', 'workflow');
 28: $lngAct['con']['workflow_do_action'] = i18n('Process workflow step', 'workflow');
 29: $lngAct['con_workflow']['workflow_do_action'] = i18n('Process workflow step', 'workflow');
 30: $lngAct['str']['workflow_inherit_down'] = i18n('Inherit workflow down', 'workflow');
 31: $lngAct['str']['workflow_inherit_down'] = i18n('Inherit workflow down', 'workflow');
 32: $lngAct['workflow_steps']['workflow_step_edit'] = i18n('Edit workflow step', 'workflow');
 33: $lngAct['workflow_steps']['workflow_step_up'] = i18n('Move workflowstep up', 'workflow');
 34: $lngAct['workflow_steps']['workflow_step_down'] = i18n('Move workflowstep down', 'workflow');
 35: $lngAct['workflow_steps']['workflow_save_step'] = i18n('Save Workflowstep', 'workflow');
 36: $lngAct['workflow_steps']['workflow_create_step'] = i18n('Create workflowstep', 'workflow');
 37: $lngAct['workflow_steps']['workflow_step_delete'] = i18n('Delete workflowstep', 'workflow');
 38: $lngAct['workflow_steps']['workflow_user_up'] = i18n('Move workflowstepuser up', 'workflow');
 39: $lngAct['workflow_steps']['workflow_user_down'] = i18n('Move workflowstepuser down', 'workflow');
 40: $lngAct['workflow_steps']['workflow_create_user'] = i18n('Create Workflowstepuser', 'workflow');
 41: $lngAct['workflow_steps']['workflow_user_delete'] = i18n('Delete Workflowstepuser', 'workflow');
 42: $lngAct['str']['workflow_cat_assign'] = i18n('Associate workflow with category', 'workflow');
 43: 
 44: $_cecRegistry->addChainFunction('Contenido.ArticleCategoryList.ListItems', 'piworkflowCreateTasksFolder');
 45: $_cecRegistry->addChainFunction('Contenido.ArticleList.Columns', 'piworkflowProcessArticleColumns');
 46: $_cecRegistry->addChainFunction('Contenido.ArticleList.Actions', 'piworkflowProcessActions');
 47: $_cecRegistry->addChainFunction('Contenido.ArticleList.RenderColumn', 'piworkflowRenderColumn');
 48: $_cecRegistry->addChainFunction('Contenido.ArticleList.RenderAction', 'piworkflowRenderAction');
 49: $_cecRegistry->addChainFunction('Contenido.CategoryList.Columns', 'piworkflowCategoryColumns');
 50: $_cecRegistry->addChainFunction('Contenido.CategoryList.RenderColumn', 'piworkflowCategoryRenderColumn');
 51: $_cecRegistry->addChainFunction('Contenido.Frontend.AllowEdit', 'piworkflowAllowArticleEdit');
 52: 
 53: function prepareWorkflowItems() {
 54:     global $action, $lang, $modidcat, $workflowSelectBox, $workflowworkflows, $client, $tpl, $cfg;
 55: 
 56:     $workflowworkflows = new Workflows();
 57: 
 58:     if ($action === 'workflow_inherit_down') {
 59:         $tmp = strDeeperCategoriesArray($modidcat);
 60:         $asworkflow = getWorkflowForCat($modidcat);
 61: 
 62:         $wfa = new WorkflowAllocations();
 63: 
 64:         foreach ($tmp as $tmp_cat) {
 65:             $idcatlang = getCatLang($tmp_cat, $lang);
 66: 
 67:             if ($asworkflow == 0) {
 68:                 $wfa->select("idcatlang = '$idcatlang'");
 69: 
 70:                 if (($item = $wfa->next()) !== false) {
 71:                     $wfa->delete($item->get("idallocation"));
 72:                     // delete user sequences for listing in tasklist for each
 73:                     // included article
 74:                     $oArticles = new cArticleCollector(array(
 75:                         'idcat' => $idcatlang,
 76:                         'start' => true,
 77:                         'offline' => true
 78:                     ));
 79:                     while (($oArticle = $oArticles->nextArticle()) !== false) {
 80:                         setUserSequence($oArticle->getField('idartlang'), -1);
 81:                     }
 82:                 }
 83:             } else {
 84:                 $wfa->select("idcatlang = '$idcatlang'");
 85: 
 86:                 if (($item = $wfa->next()) !== false) {
 87:                     $item->setWorkflow($asworkflow);
 88:                     $item->store();
 89:                 } else {
 90:                     $wfa->create($asworkflow, $idcatlang);
 91:                     // generate user sequences for listing in tasklist for each
 92:                     // included article
 93:                     $oArticles = new cArticleCollector(array(
 94:                         'idcat' => $tmp_cat,
 95:                         'start' => true,
 96:                         'offline' => true
 97:                     ));
 98:                     while (($oArticle = $oArticles->nextArticle()) !== false) {
 99:                         setUserSequence($oArticle->getField('idartlang'), $asworkflow);
100:                     }
101:                 }
102:             }
103:         }
104:     }
105: 
106:     if ($action == "workflow_cat_assign") {
107:         $seltpl = "wfselect" . $modidcat;
108: 
109:         $wfa = new WorkflowAllocations();
110:         $idcatlang = getCatLang($modidcat, $lang);
111: 
112:         // associate workflow with category
113:         if ($GLOBALS[$seltpl] != 0) {
114:             $wfa->select("idcatlang = '$idcatlang'");
115:             if (($item = $wfa->next()) !== false) {
116:                 $item->setWorkflow($GLOBALS[$seltpl]);
117:                 $item->store();
118:             } else {
119:                 $wfa->create($GLOBALS[$seltpl], $idcatlang);
120:             }
121: 
122:             // generate user sequences for listing in tasklist for each included
123:             // article
124:             $oArticles = new cArticleCollector(array(
125:                 'idcat' => $modidcat,
126:                 'start' => true,
127:                 'offline' => true
128:             ));
129:             while (($oArticle = $oArticles->nextArticle()) !== false) {
130:                 setUserSequence($oArticle->getField('idartlang'), $GLOBALS[$seltpl]);
131:             }
132:         } else {
133:             // unlink workflow with category
134:             $wfa->select("idcatlang = '$idcatlang'");
135: 
136:             if (($item = $wfa->next()) !== false) {
137:                 $alloc = $item->get("idallocation");
138:             }
139:             $wfa->delete($alloc);
140: 
141:             // delete user sequences for listing in tasklist for each included
142:             // article
143:             $oArticles = new cArticleCollector(array(
144:                 'idcat' => $modidcat,
145:                 'start' => true,
146:                 'offline' => true
147:             ));
148:             while (($oArticle = $oArticles->nextArticle()) !== false) {
149:                 setUserSequence($oArticle->getField('idartlang'), -1);
150:             }
151:         }
152:     }
153: 
154:     $workflowSelectBox = new cHTMLSelectElement("foo");
155:     $workflowSelectBox->setClass("text_medium");
156:     $workflowworkflows->select("idclient = '$client' AND idlang = '" . cSecurity::escapeDB($lang, null) . "'");
157: 
158:     $workflowOption = new cHTMLOptionElement("--- " . i18n("None", "workflow") . " ---", 0);
159:     $workflowSelectBox->addOptionElement(0, $workflowOption);
160: 
161:     while (($workflow = $workflowworkflows->next()) !== false) {
162:         $wfa = new WorkflowItems();
163:         $wfa->select("idworkflow = '".$workflow->get("idworkflow")."'");
164: 
165:         if ($wfa->next() !== false) {
166:             $workflowOption = new cHTMLOptionElement($workflow->get("name"), $workflow->get("idworkflow"));
167:             $workflowSelectBox->addOptionElement($workflow->get("idworkflow"), $workflowOption);
168:         }
169:     }
170: 
171:     $workflowSelectBox->updateAttributes(array(
172:         "id" => "wfselect{IDCAT}"
173:     ));
174:     $workflowSelectBox->updateAttributes(array(
175:         "name" => "wfselect{IDCAT}"
176:     ));
177: 
178:     $tpl->set('s', 'PLUGIN_WORKFLOW', $workflowSelectBox->render() . '<a href="javascript:setWorkflow({IDCAT}, \\\'wfselect{IDCAT}\\\')"><img src="' . $cfg["path"]["images"] . 'submit.gif" class="spaced"></a>');
179:     $tpl->set('s', 'PLUGIN_WORKFLOW_TRANSLATION', i18n("Inherit workflow down", "workflow"));
180: }
181: 
182: function piworkflowCategoryRenderColumn($idcat, $type) {
183:     switch ($type) {
184:         case "workflow":
185:             $value = workflowInherit($idcat) . '<script type="text/javascript" id="wf' . $idcat . '">printWorkflowSelect(' . $idcat . ', ' . (int) getWorkflowForCat($idcat) . ');</script>';
186:             break;
187:     }
188: 
189:     return $value;
190: }
191: 
192: function piworkflowCategoryColumns($array) {
193:     prepareWorkflowItems();
194:     $myarray = array(
195:         "workflow" => i18n("Workflow", "workflow")
196:     );
197: 
198:     return ($myarray);
199: }
200: 
201: function piworkflowProcessActions($array) {
202:     global $idcat;
203: 
204:     $defaultidworkflow = getWorkflowForCat($idcat);
205:     if ($defaultidworkflow != 0) {
206:         $narray = array(
207:             "todo",
208:             "wfartconf",
209:             "wftplconf",
210:             "wfonline",
211:             "wflocked",
212:             "duplicate",
213:             "delete",
214:             "usetime"
215:         );
216:     } else {
217:         $narray = $array;
218:     }
219: 
220:     return $narray;
221: }
222: 
223: function piworkflowRenderAction($idcat, $idart, $idartlang, $type) {
224:     global $area, $frame, $idtpl, $cfg, $alttitle, $tmp_articletitle;
225:     global $tmp_artconf, $onlinelink, $lockedlink, $tplconf_link;
226: 
227:     $defaultidworkflow = getWorkflowForCat($idcat);
228: 
229:     $idusersequence = getCurrentUserSequence($idartlang, $defaultidworkflow);
230:     $associatedUserSequence = new WorkflowUserSequence();
231:     $associatedUserSequence->loadByPrimaryKey($idusersequence);
232: 
233:     $currentEditor = $associatedUserSequence->get("iduser");
234:     $workflowItem = $associatedUserSequence->getWorkflowItem();
235: 
236:     if (isCurrentEditor($associatedUserSequence->get("iduser"))) {
237:         /* Query rights for this user */
238:         $wfRights = $workflowItem->getStepRights();
239:         $mayEdit = true;
240:     } else {
241:         $wfRights = "";
242:         $mayEdit = false;
243:     }
244: 
245:     switch ($type) {
246:         case "wfartconf":
247:             if ($wfRights["propertyedit"] == true) {
248:                 return $tmp_artconf;
249:             }
250:             break;
251:         case "wfonline":
252:             if ($wfRights["publish"] == true) {
253:                 return $onlinelink;
254:             }
255:             break;
256:         case "wflocked":
257:             if ($wfRights["lock"] == true) {
258:                 return $lockedlink;
259:             }
260:             break;
261:         case "wftplconf":
262:             if ($wfRights["templateedit"] == true) {
263:                 return $tplconf_link;
264:             }
265:         default:
266:             break;
267:     }
268: 
269:     return "";
270: }
271: 
272: function piworkflowProcessArticleColumns($array) {
273:     global $idcat, $action, $modidartlang;
274: 
275:     if ($action == "workflow_do_action") {
276:         $selectedAction = "wfselect" . $modidartlang;
277:         doWorkflowAction($modidartlang, $GLOBALS[$selectedAction]);
278:     }
279: 
280:     $defaultidworkflow = getWorkflowForCat($idcat);
281: 
282:     if ($defaultidworkflow != 0) {
283:         $narray = array();
284:         $bInserted = false;
285:         foreach ($array as $sKey => $sValue) {
286:             $narray[$sKey] = $sValue;
287:             if ($sKey == 'title' && !$bInserted) {
288:                 $narray["wftitle"] = $array["title"];
289:                 $narray["wfstep"] = i18n("Workflow Step", "workflow");
290:                 $narray["wfaction"] = i18n("Workflow Action", "workflow");
291:                 $narray["wfeditor"] = i18n("Workflow Editor", "workflow");
292:                 $narray["wflaststatus"] = i18n("Last status", "workflow");
293:                 $bInserted = true;
294:             }
295:         }
296:         unset($narray['title']);
297:         unset($narray['changeddate']);
298:         unset($narray['publisheddate']);
299:         unset($narray['sortorder']);
300:     } else {
301:         $narray = $array;
302:     }
303: 
304:     return ($narray);
305: }
306: 
307: function piworkflowAllowArticleEdit($idlang, $idcat, $idart, $user) {
308:     $defaultidworkflow = getWorkflowForCat($idcat);
309: 
310:     if ($defaultidworkflow == 0) {
311:         return true;
312:     }
313: 
314:     $idartlang = getArtLang($idart, $idlang);
315:     $idusersequence = getCurrentUserSequence($idartlang, $defaultidworkflow);
316:     $associatedUserSequence = new WorkflowUserSequence();
317:     $associatedUserSequence->loadByPrimaryKey($idusersequence);
318: 
319:     $currentEditor = $associatedUserSequence->get("iduser");
320: 
321:     $workflowItem = $associatedUserSequence->getWorkflowItem();
322: 
323:     if (isCurrentEditor($associatedUserSequence->get("iduser"))) {
324:         $wfRights = $workflowItem->getStepRights();
325:         $mayEdit = true;
326:     } else {
327:         $wfRights = "";
328:         $mayEdit = false;
329:     }
330: 
331:     if ($wfRights["articleedit"] == true) {
332:         return true;
333:     } else {
334:         return false;
335:     }
336: }
337: 
338: function piworkflowRenderColumn($idcat, $idart, $idartlang, $column) {
339:     global $area, $frame, $idtpl, $cfg, $alttitle, $tmp_articletitle;
340:     $defaultidworkflow = getWorkflowForCat($idcat);
341: 
342:     $idusersequence = getCurrentUserSequence($idartlang, $defaultidworkflow);
343:     $associatedUserSequence = new WorkflowUserSequence();
344:     $associatedUserSequence->loadByPrimaryKey($idusersequence);
345: 
346:     $currentEditor = $associatedUserSequence->get("iduser");
347: 
348:     $workflowItem = $associatedUserSequence->getWorkflowItem();
349: 
350:     if (isCurrentEditor($associatedUserSequence->get("iduser"))) {
351:         $wfRights = $workflowItem->getStepRights();
352:         $mayEdit = true;
353:     } else {
354:         $wfRights = "";
355:         $mayEdit = false;
356:     }
357: 
358:     switch ($column) {
359:         case "wftitle":
360:             if ($wfRights["articleedit"] == true) {
361:                 $mtitle = $tmp_articletitle;
362:             } else {
363:                 $mtitle = strip_tags($tmp_articletitle);
364:             }
365:             return ($mtitle);
366:         case "wfstep":
367:             if ($workflowItem === false) {
368:                 return "nobody";
369:             }
370: 
371:             return ($workflowItem->get("position") . ".) " . $workflowItem->get("name"));
372:         case "wfeditor":
373:             $sEditor = getGroupOrUserName($currentEditor);
374:             if (!$sEditor) {
375:                 $sEditor = "nobody";
376:             }
377:             return $sEditor;
378:         case "wfaction":
379:             $defaultidworkflow = getWorkflowForCat($idcat);
380:             $idusersequence = getCurrentUserSequence($idartlang, $defaultidworkflow);
381: 
382:             $sActionSelect = getActionSelect($idartlang, $idusersequence);
383:             if (!$sActionSelect) {
384:                 $mayEdit = false;
385:             }
386: 
387:             $form = new cHTMLForm("wfaction" . $idartlang, "main.php", "get");
388:             $form->setVar("area", $area);
389:             $form->setVar("action", "workflow_do_action");
390:             $form->setVar("frame", $frame);
391:             $form->setVar("idcat", $idcat);
392:             $form->setVar("modidartlang", $idartlang);
393:             $form->setVar("idtpl", $idtpl);
394:             $form->appendContent('<table cellspacing="0" border="0"><tr><td>' . $sActionSelect . '</td><td>');
395:             $form->appendContent('<input type="image" src="' . $cfg["path"]["htmlpath"] . $cfg["path"]["images"] . "submit.gif" . '"></tr></table>');
396: 
397:             if ($mayEdit == true) {
398:                 return ($form->render(true));
399:             } else {
400:                 return '--- ' . i18n("None") . ' ---';
401:             }
402: 
403:         case "wflaststatus":
404:             $sStatus = getLastWorkflowStatus($idartlang);
405:             if (!$sStatus) {
406:                 $sStatus = '--- ' . i18n("None") . ' ---';
407:             }
408:             return $sStatus;
409:     }
410: }
411: 
412: function piworkflowCreateTasksFolder() {
413:     global $sess, $cfg;
414: 
415:     $item = array();
416: 
417:     // Create workflow tasks folder
418:     $tmp_mstr = '<a href="javascript://" onclick="javascript:conMultiLink(\'%s\', \'%s\', \'%s\', \'%s\')">%s</a>';
419: 
420:     $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');
421: 
422:     $item["image"] = '<img src="' . cRegistry::getBackendUrl() . $cfg["path"]["plugins"] . 'workflow/images/workflow_erstellen.gif">';
423:     $item["title"] = $mstr;
424: 
425:     return ($item);
426: }
427: 
CMS CONTENIDO 4.9.0 API documentation generated by ApiGen 2.8.0