3 namespace wcf\acp\action
;
5 use wcf\action\AbstractSecureAction
;
6 use wcf\action\AJAXInvokeAction
;
7 use wcf\system\exception\ImplementationException
;
8 use wcf\system\exception\SystemException
;
10 use wcf\system\worker\IWorker
;
14 * Handles worker actions.
16 * @author Alexander Ebert
17 * @copyright 2001-2019 WoltLab GmbH
18 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
19 * @package WoltLabSuite\Core\Acp\Action
21 class WorkerProxyAction
extends AJAXInvokeAction
26 const DO_NOT_LOG
= true;
32 protected $loopCount = -1;
35 * parameters for worker action
38 protected $parameters = [];
46 public static $allowInvoke = [];
51 public function readParameters()
53 AbstractSecureAction
::readParameters();
55 if (isset($_POST['className'])) {
56 $this->className
= $_POST['className'];
58 if (isset($_POST['loopCount'])) {
59 $this->loopCount
= \
intval($_POST['loopCount']);
61 if (isset($_POST['parameters']) && \
is_array($_POST['parameters'])) {
62 $this->parameters
= $_POST['parameters'];
69 * Validates class name.
71 protected function validate()
73 if (empty($this->className
)) {
74 throw new SystemException("class name cannot be empty.");
77 if (!\
is_subclass_of($this->className
, IWorker
::class)) {
78 throw new ImplementationException($this->className
, IWorker
::class);
85 public function execute()
87 AbstractSecureAction
::execute();
89 if ($this->loopCount
== -1) {
90 $this->sendResponse();
94 $this->worker
= new $this->className($this->parameters
);
95 $this->worker
->setLoopCount($this->loopCount
);
97 // validate worker parameters
98 $this->worker
->validate();
100 // calculate progress, triggers countObjects()
101 $progress = $this->worker
->getProgress();
104 $this->worker
->execute();
106 $this->worker
->finalize();
108 // send current state
109 $this->sendResponse($progress, $this->worker
->getParameters(), $this->worker
->getProceedURL());
113 * Sends a JSON-encoded response.
115 * @param int $progress
116 * @param array $parameters
117 * @param string $proceedURL
119 protected function sendResponse($progress = 0, ?
array $parameters = null, $proceedURL = '')
121 if ($parameters === null) {
122 $parameters = $this->parameters
;
125 // build return values
127 'className' => $this->className
,
128 'loopCount' => $this->loopCount +
1,
129 'parameters' => $parameters,
130 'proceedURL' => $proceedURL,
131 'progress' => $progress,
134 // include template on startup
135 if ($this->loopCount
== -1) {
136 $returnValues['template'] = WCF
::getTPL()->fetch('worker');
139 // send JSON-encoded response
140 \
header('Content-type: application/json; charset=UTF-8');
141 echo JSON
::encode($returnValues);