source: sandbox/workflow/branches/993/inc/class.run_activity.inc.php @ 2492

Revision 2492, 34.1 KB checked in by pedroerp, 14 years ago (diff)

Ticket #993 - Trocando acessos à GLOBALS por acessos à Settings.

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