1 <?php
2 
3 namespace dokuwiki\Action;
4 
5 use dokuwiki\Action\Exception\ActionException;
6 use dokuwiki\Action\Exception\FatalException;
7 
8 /**
9  * Class AbstractAction
10  *
11  * Base class for all actions
12  *
13  * @package dokuwiki\Action
14  */
15 abstract class AbstractAction
16 {
17     /** @var string holds the name of the action (lowercase class name, no namespace) */
18     protected $actionname;
19 
20     /**
21      * AbstractAction constructor.
22      *
23      * @param string $actionname the name of this action (see getActionName() for caveats)
24      */
25     public function __construct($actionname = '')
26     {
27         if ($actionname !== '') {
28             $this->actionname = $actionname;
29         } else {
30             // As of PHP 8 this seems to be the fastest way to get the name:
31             $this->actionname = strtolower((new \ReflectionClass($this))->getShortName());
32         }
33     }
34 
35     /**
36      * Return the minimum permission needed
37      *
38      * This needs to return one of the AUTH_* constants. It will be checked against
39      * the current user and page after checkPermissions() ran through. If it fails,
40      * the user will be shown the Denied action.
41      *
42      * @return int
43      */
44     abstract public function minimumPermission();
45 
46     /**
47      * Check conditions are met to run this action
48      *
49      * @throws ActionException
50      * @return void
51      */
52     public function checkPreconditions()
53     {
54     }
55 
56     /**
57      * Process data
58      *
59      * This runs before any output is sent to the browser.
60      *
61      * Throw an Exception if a different action should be run after this step.
62      *
63      * @throws ActionException
64      * @return void
65      */
66     public function preProcess()
67     {
68     }
69 
70     /**
71      * Output whatever content is wanted within tpl_content();
72      *
73      * @fixme we may want to return a Ui class here
74      * @throws FatalException
75      */
76     public function tplContent()
77     {
78         throw new FatalException('No content for Action ' . $this->actionname);
79     }
80 
81     /**
82      * Returns the name of this action
83      *
84      * This is usually the lowercased class name, but may differ for some actions.
85      * eg. the export_ modes or for the Plugin action.
86      *
87      * @return string
88      */
89     public function getActionName()
90     {
91         return $this->actionname;
92     }
93 }
94