1 <?php
 2 
 3 /**
 4  * Cronjob Addon.
 5  *
 6  * @author gharlan[at]web[dot]de Gregor Harlan
 7  *
 8  * @package redaxo\cronjob
 9  */
10 
11 class rex_cronjob_phpcallback extends rex_cronjob
12 {
13     public function execute()
14     {
15         if (preg_match('/^\s*(?:(\w*?)\:\:)?(\w*?)(?:\((.*?)\))?\;?\s*$/', $this->getParam('callback'), $matches)) {
16             $callback = $matches[2];
17             if ($matches[1] != '') {
18                 $callback = [$matches[1], $callback];
19             }
20             if (!is_callable($callback)) {
21                 if (is_array($callback)) {
22                     $callback = $callback[0] . '::' . $callback[1];
23                 }
24                 $this->setMessage($callback . '() not callable');
25                 return false;
26             }
27             $params = [];
28             if (isset($matches[3]) && $matches[3] != '') {
29                 $params = explode(',', $matches[3]);
30                 foreach ($params as $i => $param) {
31                     $param = preg_replace('/^(\\\'|\")?(.*?)\\1$/', '$2', trim($param));
32                     $params[$i] = $param;
33                 }
34             }
35             $return = call_user_func_array($callback, $params);
36             if ($return !== false) {
37                 if (is_string($return)) {
38                     $this->setMessage($return);
39                 }
40                 return true;
41             }
42             $this->setMessage('Error in callback');
43             return false;
44         }
45         $this->setMessage('Syntax error in callback');
46         return false;
47     }
48 
49     public function getTypeName()
50     {
51         return rex_i18n::msg('cronjob_type_phpcallback');
52     }
53 
54     public function getParamFields()
55     {
56         return [
57             [
58                 'label' => rex_i18n::msg('cronjob_type_phpcallback'),
59                 'name' => 'callback',
60                 'type' => 'text',
61                 'notice' => rex_i18n::msg('cronjob_examples') . ': foo(), foo(1, \'string\'), foo::bar()',
62             ],
63         ];
64     }
65 }
66