source: sandbox/workflow/branches/609/inc/class.run_activity.inc.php @ 2264

Revision 2264, 34.7 KB checked in by pedroerp, 14 years ago (diff)

Ticket #609 - Substituindo todas as chamadas à CreateObject? no módulo pela nova factory.

  • Property svn:executable set to *
Line 
1<?php
2        /**************************************************************************\
3        * eGroupWare                                                               *
4        * http://www.egroupware.org                                                *
5        * --------------------------------------------                             *
6        *  This program is free software; you can redistribute it and/or modify it *
7        *  under the terms of the GNU General Public License as published by the   *
8        *  Free Software Foundation; either version 2 of the License, or (at your  *
9        *  option) any later version.                                              *
10        \**************************************************************************/
11
12        require_once(dirname(__FILE__) . SEP . 'common.inc.php');                                /* including common deifinitions */
13        require_once(dirname(__FILE__) . SEP . 'class.WorkflowUtils.inc.php'  ); /* superclass source code       */
14        require_once(dirname(__FILE__) . SEP . 'class.basecontroller.inc.php' ); /* module controller            */
15        require_once(dirname(__FILE__) . SEP . 'class.basemodel.inc.php'      ); /* module logic                 */
16        require_once(dirname(__FILE__) . SEP . 'class.utils.security.php'     ); /* sanitizes input data         */
17
18        /**
19         * @package Workflow
20         * @author Mauricio Luiz Viani - viani@celepar.pr.gov.br
21         * @author Sidnei Augusto Drovetto Jr. - drovetto@gmail.com
22         * @author Carlos Eduardo Nogueira Goncalves - cadu.br@gmail.com
23         * @license GPL
24         * @license http://www.gnu.org/copyleft/gpl.html GPL
25     */
26        class run_activity extends WorkflowUtils
27        {       
28                /**
29                 * @var array  $public_functions func
30                 * @access public
31                 */
32                var $public_functions = array(
33                        'go'    => true,
34                        'goAjax'  => true
35                );
36                /**
37                 * @var object $runtime Runtime Object from the workflow engine
38                 * @access public
39                 */
40                var $runtime;
41                // This is the object we'll be running to obtain the rigth activity
42                //var $base_activity;
43                //This is the right activity object
44                /**
45                 * @var object $activity Activity engine object.
46                 * @access public
47                 */
48                var $activity;
49                /**
50                 * @var object $process Process engine object. Used to retrieve at least paths and configuration values
51                 * @access public
52                 */
53                var $process;   
54                /**
55                 * @var object $GUI  GUI engine object. Act carefully with it.
56                 * @access public
57                 */
58                var $GUI;
59                /**
60                 * @var array $message a message array
61                 * @access public
62                 */
63                var $message = Array();
64                /**
65                 * @var object $categories categorie object for categories
66                 * @access public
67                 */
68                var $categories;
69                /**
70                 * @var array $conf
71                 * @access public
72                 */
73                var $conf = array();   
74                /**
75                 * @var $wf_template local activity template
76                 * @access public
77                 */
78                var $wf_template;
79                /**
80                 * @var object $instance
81                 * @access public
82                 */
83                var $instance;
84                /**
85                 * @var object $activity_type The type of activity
86                 * @access public
87                 */
88                var $activity_type;
89                // then we retain all usefull vars as members, to make them avaible in user's source code
90                // theses are data which can be set before the user code and which are not likely to change because of the user code
91                /**
92                 * @var int $process_id The process id
93                 * @access public
94                 */
95                var $process_id;
96                /**
97                 * @var int $activity_id The activity id
98                 * @access public
99                 */
100                var $activity_id;
101                /**
102                 * @var int $process_name The process name
103                 * @access public
104                 */
105                var $process_name;
106                /**
107                 * @var int $process_version The process_version
108                 * @access public
109                 */
110                var $process_version;
111                /**
112                 * @var int $activity_name The process id
113                 * @access public
114                 */
115                var $activity_name;
116                /**
117                 * @var int $user_name The user name
118                 * @access public
119                 */
120                var $user_name;
121                /**
122                 * @var int $view_activity activity id of the view activity avaible for this process
123                 * @access public
124                 */
125                var $view_activity;
126                // theses 4 vars aren't avaible for the user code, they're set only after this user code was executed           
127                /**
128                 * @var int $instance_id Instance id
129                 * @access public
130                 */
131                var $instance_id=0;
132                /**
133                 * @var string $instance_name Instance name
134                 * @access public
135                 */
136                var $instance_name='';
137                /**
138                 * @var int $instance_owner Instance owner id
139                 * @access public
140                 */
141                var $instance_owner=0;
142                /**
143                 * @var string $owner_name Owner name
144                 * @access public
145                 */
146                var $owner_name='';
147               
148                /**
149                 * @var bool $print_mode print mode
150                 * @access public
151                 */
152                var $print_mode = false;
153                /**
154                 * @var bool $enable_print_mode print mode
155                 * @access public
156                 */
157                var $enable_print_mode = false;
158               
159                /**
160                 * @var array $act_role_names of roles associated with the activity, usefull for lists of users associated with theses roles
161                 * @access public       
162                 */
163                var $act_role_names= Array();
164               
165                /**
166                 * @var array $agents Array of ui_agent objects
167                 * @access public
168                 */
169                var $agents = Array();
170
171                /* CELEPAR */
172                /**
173                 * @var object $smarty holds a Smarty instance
174                 * @access public
175                 */
176                var $smarty;               
177                /**
178                 * @var array $wf holds a global environment vector
179                 * @access public
180                 */
181                var $wf;                   
182                /**
183                 * @var $download_mode activates download mode
184                 * @access public
185                 */
186                var $download_mode;       
187                /**
188                 * @var string $_template_name holds the template's file name
189                 * @access public
190                 */
191                var $_template_name = null;
192                /**
193                 * @var bool Indicates wether the current instance is a child instance or not
194         * @access public
195         */
196                var $isChildInstance = false;
197
198                private $workflowSmarty = null;
199                /* CELEPAR */
200                /**
201                 * Constructor
202                 *
203                 * @access public
204                 */
205                function run_activity()
206                {
207                        parent::WorkflowUtils();
208                        $this->runtime          = Factory::getInstance('workflow_wfruntime');
209                        $this->runtime->setDebug(_DEBUG);
210                        //$this->base_activity  = Factory::getInstance('workflow_baseactivity');
211                        //$this->process                = Factory::getInstance('workflow_process');
212                        $this->GUI              = Factory::getInstance('workflow_gui');
213                        $this->categories       = Factory::getInstance('categories');
214
215                        $this->workflowSmarty = Factory::getInstance('workflow_smarty', false);
216                        // TODO: open a new connection to the database under a different username to allow privilege handling on tables
217                        /* CELEPAR */
218                        unset($this->db);
219                }
220
221                /**
222                  * This function is used to run all activities for specified instances. it could be interactive activities
223                  * or automatic activities. this second case is the reason why we return some values
224                  * @param int $activityId is the activity_id it run
225                  * @param int $iid is the instance id it run for
226                  * @param $auto is true by default
227                  * @return mixed AN ARRAY, or at least true or false. This array can contain :
228                  * a key 'failure' with an error string the engine will retrieve in instance error messages in case of
229                  *     failure (this will mark your execution as Bad),
230                  * a key 'debug' with a debug string the engine will retrieve in instance error messages,
231                  */
232                function go($activity_id=0, $iid=0, $auto=0)
233                {
234                        $result=Array();
235
236                        if ($iid)
237                        {
238                                $_REQUEST['iid'] = $iid;
239                        }
240                        $iid = $_REQUEST['iid'];
241
242                        //$activity_id is set when we are in auto mode. In interactive mode we get if from POST or GET
243                        if (!$activity_id)
244                        {
245                                $activity_id    = (int)get_var('activity_id', array('GET','POST'), 0);
246                        }
247
248                        // load activity and instance
249                        if (!$activity_id)
250                        {
251                                $result['failure'] =  $this->runtime->fail(lang('Cannot run unknown activity'), true, _DEBUG, $auto);
252                                return $result;
253                        }
254
255                        //initalising activity and instance objects inside the WfRuntime object
256                        if (!($this->runtime->loadRuntime($activity_id,$iid)))
257                        {
258                                $result['failure'] = $this->runtime->fail(lang('Cannot run the activity'), true, _DEBUG, $auto);
259                                return $result;
260                        }
261
262                        $activity =& $this->runtime->getActivity($activity_id, true, true);
263                        $this->activity =& $activity;
264                        // the instance is avaible with $instance or $this->instance
265                        // note that for standalone activities this instance can be an empty instance object, but false is a bad value
266                        //$this->instance =& $this->runtime->loadInstance($iid);
267
268                        // HERE IS A BIG POINT: we map the instance to a runtime object
269                        // user code will manipulate a stance, thinking it's an instance, but it is
270                        // in fact a WfRuntime object, mapping all instance functions
271                        $this->instance =& $this->runtime;
272                        $instance =& $this->instance;
273                        $GLOBALS['workflow']['wf_runtime'] =& $this->runtime;
274                        if (!($instance))
275                        {
276                                $result['failure'] = $this->runtime->fail(lang('Cannot run the activity without instance'), true, _DEBUG, $auto);
277                                return $result;
278                        }
279                        $this->instance_id = $instance->getInstanceId();
280
281                        // load process
282                        $this->process =& $this->runtime->getProcess();
283                        if (!($this->process))
284                        {
285                                $result['failure'] = $this->runtime->fail(lang('Cannot run the activity without her process').$instance, true, _DEBUG, $auto);
286                                return $result;
287                        }
288
289                        //set some global variables needed
290                        $GLOBALS['workflow']['__leave_activity']=false;
291                        $GLOBALS['user'] = $GLOBALS['phpgw_info']['user']['account_id'];
292
293                        //load role names, just an information
294                        $this->act_role_names = $activity->getActivityRoleNames();
295
296                        //set some other usefull vars
297                        $this->activity_type    = $activity->getType();
298                        $this->process_id       = $activity->getProcessId();
299                        $this->activity_id      = $activity_id;
300                        $this->process_name     = $this->process->getName();
301                        $this->process_version  = $this->process->getVersion();
302                        $this->activity_name    = $activity->getName();
303                        $this->user_name                = $GLOBALS['phpgw']->accounts->id2name($GLOBALS['user']);
304                        $this->view_activity    = $this->GUI->gui_get_process_view_activity($this->process_id);
305
306                        //we set them in $GLOBALS['workflow'] as well
307                        $GLOBALS['workflow']['wf_activity_type']                        =& $this->activity_type;
308                        $GLOBALS['workflow']['wf_process_id']                           =& $this->process_id;
309                        $GLOBALS['workflow']['wf_activity_id']                          =& $this->activity_id;
310                        $GLOBALS['workflow']['wf_process_name']                         =& $this->process_name;
311                        $GLOBALS['workflow']['wf_normalized_name']                      =  $this->process->getNormalizedName();
312                        $GLOBALS['workflow']['wf_process_version']                      =& $this->process_version;
313                        $GLOBALS['workflow']['wf_activity_name']                        =& $this->activity_name;
314                        $GLOBALS['workflow']['wf_user_name']                            =& $this->user_name;
315                        $GLOBALS['workflow']['wf_user_id']                                      =& $GLOBALS['user'];
316                        $GLOBALS['workflow']['wf_view_activity']                        =& $this->view_activity;
317                        $GLOBALS['workflow']['wf_webserver_url']                        = $GLOBALS['phpgw_info']['server']['webserver_url'];
318                        $GLOBALS['workflow']['wf_workflow_path']                        = $GLOBALS['phpgw_info']['server']['webserver_url'].SEP.'workflow';
319                        $GLOBALS['workflow']['wf_resources_path']                       = $GLOBALS['phpgw_info']['server']['webserver_url'] . SEP . 'workflow/redirect.php?pid=' . $this->process_id . '&file=';
320                        $GLOBALS['workflow']['wf_default_resources_path']       = Factory::getInstance('TemplateServer')->generateLink('processes');
321                        $GLOBALS['workflow']['wf_workflow_resources_path']      = Factory::getInstance('TemplateServer')->generateLink('');
322                        $GLOBALS['workflow']['wf_activity_url']                         = $GLOBALS['phpgw_info']['server']['webserver_url'].SEP.'index.php?menuaction=workflow.'.get_class($this).'.go&activity_id='.$activity_id;
323                        $GLOBALS['workflow']['wf_user_cnname']                          = Factory::getInstance('WorkflowLDAP')->getName($GLOBALS['user']);
324                        $GLOBALS['workflow']['wf_back_link']                            = $GLOBALS['phpgw_info']['server']['webserver_url'].SEP.'workflow'.SEP.'index.php?start_tab=1';
325                        $GLOBALS['workflow']['wf_js_path']                                      = $GLOBALS['phpgw_info']['server']['webserver_url'].SEP.'workflow'.SEP.'js'.SEP.'jscode';
326                        $GLOBALS['workflow']['wf_user_activities']                      = $this->GUI->gui_list_user_activities($GLOBALS['user'], '0', '-1', 'ga.wf_name__ASC', '', '', false, true, true, true, '');
327                        if ($iid)
328                                $GLOBALS['workflow']['wf_instance_url'] = $GLOBALS['phpgw_info']['server']['webserver_url'].SEP.'index.php?menuaction=workflow.'.get_class($this).'.go&activity_id='.$activity_id."&iid=".$iid;
329                        else
330                                unset($GLOBALS['workflow']['wf_instance_url']);
331                        $wf =& $GLOBALS['workflow'];
332
333                        /* CELEPAR */
334                        /* path to the local functions developed by Celepar */
335                        $functions = PHPGW_SERVER_ROOT . SEP . 'workflow' . SEP . 'inc' . SEP . 'local' . SEP . 'functions' . SEP . 'local.functions.php';
336
337                        /* activate local functions */
338                        require_once($functions);
339                        /* CELEPAR */
340
341                        //get configuration options with default values if no init was done before
342                        $myconf = array(
343                                'execute_activities_in_debug_mode'      => 0,
344                                'execute_activities_using_secure_connection' => 0
345                        );
346                        //this will give use asked options and som others used by WfRuntime
347                        $this->conf =& $this->runtime->getConfigValues($myconf);
348                        if ($this->conf['execute_activities_using_secure_connection'])
349                        {
350                                if (($GLOBALS['phpgw_info']['server']['use_https'] > 0) && ($_SERVER['HTTPS'] != 'on') && (!isset($GLOBALS['workflow']['job']['processID'])))
351                                {
352                                        header("Location: https://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}");
353                                        exit;
354                                }
355                        }
356
357                        if ($auto && (!$this->isChildInstance) && $activity->isInteractive())
358                        {
359                                $actualUser = $GLOBALS['user'];
360                                $actualUserGroups = $_SESSION['phpgw_info']['workflow']['user_groups'];
361                                foreach ($instance->instance->activities as $actTmp)
362                                {
363                                        if ($actTmp['wf_activity_id'] == $activity_id)
364                                        {
365                                                $newUser = $actTmp['wf_user'];
366                                                break;
367                                        }
368                                }
369
370                                /* pretend to be the user */
371                                $_SESSION['phpgw_info']['workflow']['user_groups'] = galaxia_retrieve_user_groups($newUser);
372                                $_SESSION['phpgw_info']['workflow']['account_id'] = $newUser;
373                                $GLOBALS['phpgw_info']['user']['account_id'] = $newUser;
374                                $GLOBALS['workflow']['wf_user_id'] = $newUser;
375                                $GLOBALS['user'] = $newUser;
376
377                                /* check some permissions */
378                                if (($newUser == '*') || (!$this->runtime->checkUserRun($newUser)) || (Factory::getInstance('WorkflowLDAP')->getName($newUser) === false))
379                                {
380                                        $_SESSION['phpgw_info']['workflow']['user_groups'] = $actualUserGroups;
381                                        $_SESSION['phpgw_info']['workflow']['account_id'] = $actualUser;
382                                        $GLOBALS['phpgw_info']['user']['account_id'] = $actualUser;
383                                        $GLOBALS['workflow']['wf_user_id'] = $actualUser;
384                                        $GLOBALS['user'] = $actualUser;
385
386                                        return false;
387                                }
388                                $smarty = Factory::getInstance('process_smarty');
389                        }
390
391                        // run the activity
392                        //interactive section
393                        if (!$auto && $activity->isInteractive())
394                        {
395
396                                $this->print_mode = get_var('print_mode', array('POST','GET'), false);
397                                $this->download_mode = get_var('download_mode', array('POST','GET'), false);
398
399                                /* #celepar# smarty code*/
400
401                                $smarty = Factory::getInstance('process_smarty');
402
403                                $smarty->template_dir  = GALAXIA_PROCESSES.SEP.$this->process->getNormalizedName().SEP.'code'.SEP.'templates';
404                                $smarty->compile_dir   = GALAXIA_PROCESSES.SEP.$this->process->getNormalizedName().SEP.'smarty'.SEP.'compiled';
405                                $smarty->config_dir    = GALAXIA_PROCESSES.SEP.$this->process->getNormalizedName().SEP.'code'.SEP.'templates';
406                                $smarty->cache_dir     = GALAXIA_PROCESSES.SEP.$this->process->getNormalizedName().SEP.'smarty'.SEP.'cache';
407                                $smarty->plugins_dir[] = PHPGW_SERVER_ROOT.SEP.'workflow'.SEP.'inc'.SEP.'smarty'.SEP.'wf_plugins';
408
409                                $GLOBALS['phpgw']->template =& $smarty;
410                                $this->wf_template =& $smarty;
411                                $_template_name = null;
412
413                                //set resource path to use in templates
414                                $smarty->assign('wf_resources_path',$GLOBALS['workflow']['wf_resources_path']);
415                                $smarty->assign('wf_default_resources_path', $GLOBALS['workflow']['wf_default_resources_path']);
416                                $smarty->assign('wf_workflow_resources_path', $GLOBALS['workflow']['wf_workflow_resources_path']);
417                                $smarty->assign('wf_workflow_path',$GLOBALS['workflow']['wf_workflow_path']);
418                                $smarty->assign('wf_js_path',$GLOBALS['workflow']['wf_js_path']);
419                                $smarty->assign('wf_back_link',$GLOBALS['workflow']['wf_back_link']);
420                                $smarty->assign('wf_activity_url',$GLOBALS['workflow']['wf_activity_url']);
421                               
422                                /* register the prefilter smarty plugin wf_default_template */
423                                $smarty->load_filter('pre', 'wf_default_template');
424                        }
425
426                        if ($this->conf['execute_activities_in_debug_mode'])
427                        {
428                                ini_set('display_errors',true);
429                                error_reporting(E_ALL & ~E_NOTICE);
430                        }
431
432                        /* BEGIN WORKFLOW MVC SETTINGS */
433                        $env = array( );                                           //create settings vector
434                        $env['view']          =& $smarty;                          //view layer instance
435                        $env['template_file'] =& $_template_name;                  //template file to be shown
436                        $env['dao']           =& wf_create_object('wf_db');        //data access object instance
437                        $env['workflow']      =& $GLOBALS['workflow'];             //workflow environment information
438                        $env['instance']      =& $instance;                        //process manager instance
439                        $env['activity']      =& $activity;                        //activity manager instance
440                        $security             =& new SecurityUtils();              //input sanitizer class
441                        $env['request']       =& $security->process($_REQUEST);    //sanitizes input data from client
442                        //$env['factory']       =& new ProcessFactory();             //instantiation controller class
443                        $env['factory']       =& Factory::getInstance('ProcessWrapperFactory');  //instantiation controller class
444                        $env['natural']           =& wf_create_object('wf_natural');   //data access object instance for mainframe
445                        /* END WORKFLOW MVC SETTINGS */
446
447                        $GLOBALS['workflow_env'] = &$env;
448                        //echo "<br><br><br><br><br>Including $source <br>In request: <pre>";print_r($_REQUEST);echo "</pre>";
449                        //[__leave_activity] is setted if needed in the xxx_pre code or by the user in his code
450                        // HERE the user code is 'executed'. Note that we do not use include_once or require_once because
451                        //it could the same code several times with automatic activities looping in the graph and it still
452                        //need to be executed
453                        $_engineProcessCodeDirectory = GALAXIA_PROCESSES . SEP . $this->process->getNormalizedName(). SEP . 'code';
454                        $_engineCompilerDirectory = GALAXIA_LIBRARY . SEP . 'compiler';
455                        $_engineFiles = array();
456
457                        /* generate the list of needed files */
458                        $_engineFiles[] = "{$_engineProcessCodeDirectory}/shared.php";
459                        $_engineFiles[] = "{$_engineCompilerDirectory}/_shared_pre.php";
460                        $_engineFiles[] = "{$_engineCompilerDirectory}/{$activity->getType()}_pre.php";
461                        if ($activity->getAgents() !== false)
462                                $_engineFiles[] = "{$_engineCompilerDirectory}/agents_pre.php";
463                        $_engineFiles[] = "{$_engineProcessCodeDirectory}/activities/{$activity->getNormalizedName()}.php";
464                        $_engineFiles[] = "{$_engineCompilerDirectory}/{$activity->getType()}_pos.php";
465                        if ($activity->getAgents() !== false)
466                                $_engineFiles[] = "{$_engineCompilerDirectory}/agents_pos.php";
467                        $_engineFiles[] = "{$_engineCompilerDirectory}/_shared_pos.php";
468
469                        /* check if the required files exists */
470                        foreach ($_engineFiles as $_engineFile)
471                                if (!file_exists($_engineFile))
472                                        return array('failure' => $this->runtime->fail(lang('the following file could not be found: %1', $_engineFile), true, _DEBUG));
473
474                        /* activate the security policy */
475                        Factory::getInstance('WorkflowSecurity')->enableSecurityPolicy();
476
477                        /**
478                         * XXX
479                         * here we are going to use our new Security static class.
480                         * From now, the factory frontend (static) will forward
481                         * the messages for the process factory instead of Workflow
482                         * factory.
483                         * XXX
484                        */
485                        Security::enable();
486
487                        /* include the files */
488                        foreach ($_engineFiles as $_engineFile)
489                                require $_engineFile;
490
491                        unset($GLOBALS['workflow_env']);
492
493                        /* check if the developer wants to user the download mode */
494                        if (isset($GLOBALS['workflow']['downloadMode']) && ($GLOBALS['workflow']['downloadMode'] == true))
495                                $this->download_mode = true;
496
497                        if ($auto && (!$this->isChildInstance) && $activity->isInteractive() && (!empty($actualUser)))
498                        {
499                                $_SESSION['phpgw_info']['workflow']['user_groups'] = $actualUserGroups;
500                                $_SESSION['phpgw_info']['workflow']['account_id'] = $actualUser;
501                                $GLOBALS['phpgw_info']['user']['account_id'] = $actualUser;
502                                $GLOBALS['workflow']['wf_user_id'] = $actualUser;
503                                $GLOBALS['user'] = $actualUser;
504                        }
505
506                        //Now that the instance is ready and that user code has maybe change some things
507                        // we can catch some others usefull vars
508                        $this->instance_id      = $instance->getInstanceId();
509                        $this->instance_name    = $instance->getName();
510                        $this->instance_owner   = $instance->getOwner();
511                        $this->owner_name       = $GLOBALS['phpgw']->accounts->id2name($this->instance_owner);
512                        if ($this->owner_name == '')
513                        {
514                                $this->owner_name = lang('Nobody');
515                        }
516                        $GLOBALS['workflow']['wf_instance_id']  =& $this->instance_id;
517                        $GLOBALS['workflow']['wf_instance_name']=& $this->instance_name;
518                        $GLOBALS['workflow']['wf_instance_owner']=& $this->instance_owner;
519                        $GLOBALS['workflow']['wf_owner_name']=& $this->owner_name;
520
521                        //was template changed?
522                        if ($_template_name)
523                        {
524                                $this->_template_name = $_template_name;
525                        }
526                        else
527                        {
528                                $this->_template_name = $this->activity->getNormalizedName().'.tpl';
529                        }
530
531                        // TODO: process instance comments
532
533                        $instructions = $this->runtime->handle_postUserCode(_DEBUG);
534                        switch($instructions['action'])
535                        {
536                                //interactive activity completed
537                                case 'completed':
538                                        // re-retrieve instance data which could have been modified by an automatic activity
539                                        $this->instance_id                = $instance->getInstanceId();
540                                        $this->instance_name              = $instance->getName();
541                                        $this->activityCompleteMessage    = $instance->getActivityCompleteMessage();
542
543                                        if (!$auto)
544                                        {
545                                                $this->assignCommonVariables();
546                                                // and display completed template
547                                                if ($GLOBALS['phpgw_info']['user']['preferences']['workflow']['show_activity_complete_page'] === '0')
548                                                        header('Location: workflow/index.php');
549                                                else
550                                                        $this->showCompletedPage();
551                                        }
552                                        break;
553                                //interactive activity still in interactive mode
554                                case 'loop':
555                                        if (!$auto)
556                                        {
557                                                $this->assignCommonVariables();
558                                                $this->showForm();
559                                        }
560                                        break;
561                                //nothing more
562                                case 'leaving':
563                                        if (!$auto)
564                                        {
565                                                $this->assignCommonVariables();
566                                                $this->showCancelledPage();
567                                        }
568                                        break;
569                                //non-interactive activities, auto-mode
570                                case 'return':
571                                        $result=Array();
572                                        $this->message[] = $this->GUI->get_error(false, _DEBUG);
573                                        $this->message[] = $this->runtime->get_error(false, _DEBUG);
574                                        //$this->message[] = $this->process->get_error(false, _DEBUG);
575                                        $result =& $instructions['engine_info'];
576                                        $this->message[] = $result['debug'];
577                                        $result['debug'] = implode('<br />',array_filter($this->message));
578                                        return $result;
579                                        break;
580                                default:
581                                        return $this->runtime->fail(lang('unknown instruction from the workflow engine: %1', $instructions['action']), true, _DEBUG);
582                                        break;
583                        }
584                }
585
586                /**
587                 * goajax
588                 *
589                 * @param int $activity_id
590                 * @param int $iid
591                 * @param bool $auto
592                 * @return array
593                 */
594                function goAjax($activity_id=0, $iid=0, $auto=0)
595                {
596                        $result=Array();
597
598                        if ($iid)
599                                $_REQUEST['iid'] = $iid;
600                        $iid = $_REQUEST['iid'];
601
602                        //$activity_id is set when we are in auto mode. In interactive mode we get if from POST or GET
603                        if (!$activity_id)
604                                $activity_id    = (int)get_var('activity_id', array('GET','POST'), 0);
605
606                        // load activity and instance
607                        if (!$activity_id)
608                        {
609                                $result['failure'] =  $this->runtime->fail(lang('Cannot run unknown activity'), true, _DEBUG, $auto);
610                                return $result;
611                        }
612
613                        //initalising activity and instance objects inside the WfRuntime object
614                        if (!($this->runtime->loadRuntime($activity_id,$iid)))
615                        {
616                                $result['failure'] = $this->runtime->fail(lang('Cannot run the activity'), true, _DEBUG, $auto);
617                                return $result;
618                        }
619
620                        $activity =& $this->runtime->getActivity($activity_id, true, true);
621                        $this->activity =& $activity;
622                        // the instance is avaible with $instance or $this->instance
623                        // note that for standalone activities this instance can be an empty instance object, but false is a bad value
624                        // HERE IS A BIG POINT: we map the instance to a runtime object
625                        // user code will manipulate a stance, thinking it's an instance, but it is
626                        // in fact a WfRuntime object, mapping all instance functions
627                        $this->instance =& $this->runtime;
628                        $instance =& $this->instance;
629                        $GLOBALS['workflow']['wf_runtime'] =& $this->runtime;
630                        if (!($instance))
631                        {
632                                $result['failure'] = $this->runtime->fail(lang('Cannot run the activity without instance'), true, _DEBUG, $auto);
633                                return $result;
634                        }
635                        $this->instance_id = $instance->getInstanceId();
636
637                        // load process
638                        $this->process =& $this->runtime->getProcess();
639                        if (!($this->process))
640                        {
641                                $result['failure'] = $this->runtime->fail(lang('Cannot run the activity without her process').$instance, true, _DEBUG, $auto);
642                                return $result;
643                        }
644
645                        //set some global variables needed
646                        $GLOBALS['user'] = $GLOBALS['phpgw_info']['user']['account_id'];
647
648                        //load role names, just an information
649                        $this->act_role_names = $activity->getActivityRoleNames();
650
651                        //set some other usefull vars
652                        $this->activity_type    = $activity->getType();
653                        $this->process_id       = $activity->getProcessId();
654                        $this->activity_id      = $activity_id;
655                        $this->process_name     = $this->process->getName();
656                        $this->process_version  = $this->process->getVersion();
657                        $this->activity_name    = $activity->getName();
658                        $this->user_name        = $GLOBALS['phpgw']->accounts->id2name($GLOBALS['user']);
659                        $this->view_activity    = $this->GUI->gui_get_process_view_activity($this->process_id);
660
661                        //we set them in $GLOBALS['workflow'] as well
662                        $GLOBALS['workflow']['wf_activity_type']                        =& $this->activity_type;
663                        $GLOBALS['workflow']['wf_process_id']                           =& $this->process_id;
664                        $GLOBALS['workflow']['wf_activity_id']                          =& $this->activity_id;
665                        $GLOBALS['workflow']['wf_process_name']                         =& $this->process_name;
666                        $GLOBALS['workflow']['wf_normalized_name']                      =  $this->process->getNormalizedName();
667                        $GLOBALS['workflow']['wf_process_version']                      =& $this->process_version;
668                        $GLOBALS['workflow']['wf_activity_name']                        =& $this->activity_name;
669                        $GLOBALS['workflow']['wf_user_name']                            =& $this->user_name;
670                        $GLOBALS['workflow']['wf_user_id']                                      =& $GLOBALS['user'];
671                        $GLOBALS['workflow']['wf_view_activity']                        =& $this->view_activity;
672                        $GLOBALS['workflow']['wf_workflow_path']                        = $GLOBALS['phpgw_info']['server']['webserver_url'].SEP.'workflow';
673                        $GLOBALS['workflow']['wf_resources_path']                       = $GLOBALS['phpgw_info']['server']['webserver_url'] . SEP . 'workflow/redirect.php?pid=' . $this->process_id . '&file=';
674                        $GLOBALS['workflow']['wf_default_resources_path']       = Factory::getInstance('TemplateServer')->generateLink('processes');
675                        $GLOBALS['workflow']['wf_workflow_resources_path']      = Factory::getInstance('TemplateServer')->generateLink('');
676                        $GLOBALS['workflow']['wf_activity_url']                         = $GLOBALS['phpgw_info']['server']['webserver_url'].SEP.'index.php?menuaction=workflow.'.get_class($this).'.go&activity_id='.$activity_id;
677                        $GLOBALS['workflow']['wf_user_cnname']                          = Factory::getInstance('WorkflowLDAP')->getName($GLOBALS['user']);
678                        $GLOBALS['workflow']['wf_back_link']                            = $GLOBALS['phpgw_info']['server']['webserver_url'].SEP.'workflow'.SEP.'index.php?start_tab=1';
679                        $GLOBALS['workflow']['wf_js_path']                                      = $GLOBALS['phpgw_info']['server']['webserver_url'].SEP.'workflow'.SEP.'js'.SEP.'jscode';
680                        $GLOBALS['workflow']['wf_user_activities']                      = $this->GUI->gui_list_user_activities($GLOBALS['user'], '0', '-1', 'ga.wf_name__ASC', '', '', false, true, true, true, '');
681                        if ($iid)
682                                $GLOBALS['workflow']['wf_instance_url'] = $GLOBALS['phpgw_info']['server']['webserver_url'].SEP.'index.php?menuaction=workflow.'.get_class($this).'.go&activity_id='.$activity_id."&iid=".$iid;
683                        else
684                                unset($GLOBALS['workflow']['wf_instance_url']);
685
686                        /* CELEPAR */
687                        /* activate local functions */
688                        require_once(PHPGW_SERVER_ROOT . SEP . 'workflow' . SEP . 'inc' . SEP . 'local' . SEP . 'functions' . SEP . 'local.functions.php');
689                        /* CELEPAR */
690
691                        //get configuration options with default values if no init was done before
692                        $myconf = array(
693                                'execute_activities_in_debug_mode'      => 0,
694                                'execute_activities_using_secure_connection' => 0
695                        );
696                        //this will give use asked options and som others used by WfRuntime
697                        $this->conf =& $this->runtime->getConfigValues($myconf);
698
699                        // run the activity
700                        if ($this->conf['execute_activities_in_debug_mode'])
701                        {
702                                ini_set('display_errors',true);
703                                error_reporting(E_ALL & ~E_NOTICE);
704                        }
705
706                        /* BEGIN WORKFLOW MVC SETTINGS */
707                        $env = array( );                                           //create settings vector
708                        $env['dao']           =& wf_create_object('wf_db');        //data access object instance
709                        $env['workflow']      =& $GLOBALS['workflow'];             //workflow environment information
710                        $env['instance']      =& $instance;                        //process manager instance
711                        $env['activity']      =& $activity;                        //activity manager instance
712                        $security             =& new SecurityUtils();              //input sanitizer class
713                        $env['request']       =& $security->process($_REQUEST); //sanitizes input data from client
714                        //$env['factory']       =& new ProcessFactory();                           //instantiation controller class
715                        $env['factory']       =& Factory::newInstance('ProcessWrapperFactory');  //instantiation controller class
716                        $env['natural']           =& wf_create_object('wf_natural');   //data access object instance for mainframe
717                        /* END WORKFLOW MVC SETTINGS */
718
719                        require_once(dirname(__FILE__) . SEP . 'nano' . SEP . 'JSON.php');
720                        require_once(dirname(__FILE__) . SEP . 'nano' . SEP . 'NanoUtil.class.php');
721                        require_once(dirname(__FILE__) . SEP . 'nano' . SEP . 'NanoJsonConverter.class.php');
722                        require_once(dirname(__FILE__) . SEP . 'nano' . SEP . 'NanoRequest.class.php');
723                        require_once(dirname(__FILE__) . SEP . 'nano' . SEP . 'NanoController.class.php');
724
725                        /* activate the security policy */
726                        Factory::getInstance('WorkflowSecurity')->enableSecurityPolicy();
727
728                        /**
729                         * XXX
730                         * here we are going to use our new Security static class.
731                         * From now, the factory frontend (static) will forward
732                         * the messages for the process factory instead of Workflow
733                         * factory. Note that this is the same comment as the previous
734                         * function... boooring.. =}
735                         * XXX
736                        */
737                        Security::enable();
738
739                        $GLOBALS['workflow_env'] = &$env;
740                        $nc = new NanoController();
741                        $nc->setClassPath(GALAXIA_PROCESSES . SEP . $this->process->getNormalizedName(). SEP . 'code');
742                        $nc->iterateOverVirtualRequests();
743                        $nc->outputResultData();
744                        unset($GLOBALS['workflow_env']);
745
746                        if (!is_null($iid))
747                                $instance->instance->sync();
748                }
749
750                /**
751                 * Create a child instance
752                 *
753                 * @param int $activityID
754                 * @param mixed $properties
755                 * @param string $user
756                 * @param bool $parentLock
757                 * @return int The instance ID of the just created instance
758                 * @access public
759                 */
760                function goChildInstance($activityID, $properties, $user, $parentLock)
761                {
762                        $this->isChildInstance = true;
763                        $this->runtime->instance->isChildInstance = true;
764                        $this->runtime->instance->activityID = $activityID;
765                        $this->runtime->instance->parentLock = $parentLock;
766                        $this->runtime->instance->setProperties($properties);
767                        if ($user != '*')
768                                $this->runtime->setNextUser($user);
769
770                        /* run the selected activity */
771                        ob_start();
772                        $this->go($activityID, 0, true);
773                        ob_end_clean();
774
775                        /* return the just created child instance */
776                        return $this->runtime->instance_id;
777                }
778
779                /**
780                 * Show the page avaible when completing an activity
781                 * @return void
782                 * @access public
783                 */
784                function showCompletedPage()
785                {
786                        $this->workflowSmarty->assign('activityEvent', 'completed');
787                        $this->showAfterRunningPage();
788                }
789
790                /**
791                 * Show the page avaible when leaving an activity
792                 * @return void
793                 * @access public
794                 */
795                function showCancelledPage()
796                {
797                        $this->workflowSmarty->assign('activityEvent', 'cancelled');
798                        $this->showAfterRunningPage();
799                }
800
801                /**
802                 * Common code of pages showed after activity pages
803                 * @return void
804                 * @access public
805                 */
806                function showAfterRunningPage()
807                {
808                        /* get the header/footer */
809                        $this->assignHeader();
810
811                        /* generate the activity list */
812                        $processActivities = array_filter($GLOBALS['workflow']['wf_user_activities']['data'], create_function('$a', 'return ($a["wf_p_id"] == ' . $GLOBALS['workflow']['wf_process_id'] . ');'));
813                        $activityList = array(0 => '-- Selecione uma atividade --');
814                        foreach ($processActivities as $processActivity)
815                                $activityList[$processActivity['wf_activity_id']] = $processActivity['wf_name'];
816
817                        /* assign some variables */
818                        $this->workflowSmarty->assign('processName', $this->process_name);
819                        $this->workflowSmarty->assign('processVersion', $this->process_version);
820                        $this->workflowSmarty->assign('activityName', $this->activity_name);
821                        $this->workflowSmarty->assign('activityCompleteMessage', $this->activityCompleteMessage);
822                        $this->workflowSmarty->assign('activityBaseURL', $GLOBALS['phpgw_info']['server']['webserver_url']);
823                        $this->workflowSmarty->assign('activityList', $activityList);
824
825                        /* display the template */
826                        $this->workflowSmarty->display('after_running.tpl');
827                }
828
829                /**
830                 * Assign common information of interactive forms (e.g., error messages)
831                 * @return void
832                 * @access public
833                 */
834                function assignCommonVariables()
835                {
836                        $this->message[] = $this->GUI->get_error(false, _DEBUG);
837                        $this->message[] = $this->runtime->get_error(false, _DEBUG);
838                        $activityErrors = array_filter(array_merge(explode('<br />', $this->message[0]), explode('<br />', $this->message[1])));
839                        $this->workflowSmarty->assign('activityErrors', $activityErrors);
840                }
841
842                /**
843                 * Show the activity page (workflow template and activity template)
844                 * @return void
845                 * @access public
846                 */
847                function showForm()
848                {
849                        /* define the header */
850                        $this->assignHeader();
851
852                        /* define the variables */
853                        $activityOutput = $this->wf_template->fetch($this->_template_name);
854                        $actionURL = isset($GLOBALS['workflow']['wf_instance_url']) ? $GLOBALS['workflow']['wf_instance_url'] : $GLOBALS['workflow']['wf_activity_url'];
855                        $CSSLink = $this->get_css_link('run_activity', $this->print_mode);
856                        $CSSMedia = $this->print_mode ? 'print' : 'all';
857
858                        /* assign the variables to smarty */
859                        $this->workflowSmarty->assign('activityOutput', $activityOutput);
860                        $this->workflowSmarty->assign('actionURL', $actionURL);
861                        $this->workflowSmarty->assign('CSSLink', $CSSLink);
862                        $this->workflowSmarty->assign('CSSMedia', $CSSMedia);
863
864                        $this->workflowSmarty->display('run_activity.tpl');
865                        unset($smarty);
866                }
867
868                /**
869                 * Define if the header, footer and navigation bar will be shown
870                 * @return void
871                 * @access public
872                 */
873                function assignHeader()
874                {
875                        $headerConfig = 0;
876                        if (!$this->download_mode and !$this->print_mode)
877                        {
878                                $headerConfig |= workflow_smarty::SHOW_HEADER | workflow_smarty::SHOW_FOOTER;
879                                if ($this->runtime->activity->child_name != 'View')
880                                        $headerConfig |= workflow_smarty::SHOW_NAVIGATION_BAR;
881                        }
882
883                        $this->workflowSmarty->setHeader($headerConfig);
884                        $this->workflowSmarty->assign('header', $this->workflowSmarty->expressoHeader);
885                        $this->workflowSmarty->assign('footer', $this->workflowSmarty->expressoFooter);
886                }
887        }
888?>
Note: See TracBrowser for help on using the repository browser.