Merge branch 'master' into next
[GitHub/WoltLab/WCF.git] / wcfsetup / install / files / lib / system / package / PackageInstallationFormManager.class.php
1 <?php
2 declare(strict_types=1);
3 namespace wcf\system\package;
4 use wcf\data\package\installation\queue\PackageInstallationQueue;
5 use wcf\system\form\FormDocument;
6 use wcf\system\WCF;
7 use wcf\util\StringUtil;
8
9 /**
10 * Handles form documents associated with a queue.
11 *
12 * @author Alexander Ebert
13 * @copyright 2001-2018 WoltLab GmbH
14 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
15 * @package WoltLabSuite\Core\System\Package\Form
16 */
17 abstract class PackageInstallationFormManager {
18 /**
19 * Handles a POST or GET request.
20 *
21 * @param PackageInstallationQueue $queue
22 */
23 public static function handleRequest(PackageInstallationQueue $queue) {
24 $formName = isset($_REQUEST['formName']) ? StringUtil::trim($_REQUEST['formName']) : '';
25
26 // ignore request
27 if (empty($formName) || !self::findForm($queue, $formName)) return;
28
29 // get document
30 $document = self::getForm($queue, $formName);
31 $document->handleRequest();
32
33 self::updateForm($queue, $document);
34 }
35
36 /**
37 * Registers a form document.
38 *
39 * @param PackageInstallationQueue $queue
40 * @param FormDocument $document
41 */
42 public static function registerForm(PackageInstallationQueue $queue, FormDocument $document) {
43 if (self::findForm($queue, $document->getName())) {
44 self::updateForm($queue, $document);
45 }
46 else {
47 self::insertForm($queue, $document);
48 }
49 }
50
51 /**
52 * Searches for an existing form document associated with given queue.
53 *
54 * @param PackageInstallationQueue $queue
55 * @param string $formName
56 * @return boolean
57 */
58 public static function findForm(PackageInstallationQueue $queue, $formName) {
59 $sql = "SELECT COUNT(*)
60 FROM wcf".WCF_N."_package_installation_form
61 WHERE queueID = ?
62 AND formName = ?";
63 $statement = WCF::getDB()->prepareStatement($sql);
64 $statement->execute([
65 $queue->queueID,
66 $formName
67 ]);
68
69 return $statement->fetchSingleColumn() > 0;
70 }
71
72 /**
73 * Inserts a form document into database.
74 *
75 * @param PackageInstallationQueue $queue
76 * @param FormDocument $document
77 */
78 private static function insertForm(PackageInstallationQueue $queue, FormDocument $document) {
79 $sql = "INSERT INTO wcf".WCF_N."_package_installation_form
80 (queueID, formName, document)
81 VALUES (?, ?, ?)";
82 $statement = WCF::getDB()->prepareStatement($sql);
83 $statement->execute([
84 $queue->queueID,
85 $document->getName(),
86 base64_encode(serialize($document))
87 ]);
88 }
89
90 /**
91 * Updates a form document database entry.
92 *
93 * @param PackageInstallationQueue $queue
94 * @param FormDocument $document
95 */
96 private static function updateForm(PackageInstallationQueue $queue, FormDocument $document) {
97 $sql = "UPDATE wcf".WCF_N."_package_installation_form
98 SET document = ?
99 WHERE queueID = ?
100 AND formName = ?";
101 $statement = WCF::getDB()->prepareStatement($sql);
102 $statement->execute([
103 base64_encode(serialize($document)),
104 $queue->queueID,
105 $document->getName()
106 ]);
107 }
108
109 /**
110 * Deletes form documents associated with given queue.
111 *
112 * @param PackageInstallationQueue $queue
113 */
114 public static function deleteForms(PackageInstallationQueue $queue) {
115 $sql = "DELETE FROM wcf".WCF_N."_package_installation_form
116 WHERE queueID = ?";
117 $statement = WCF::getDB()->prepareStatement($sql);
118 $statement->execute([$queue->queueID]);
119 }
120
121 /**
122 * Returns a form document from database.
123 *
124 * @param PackageInstallationQueue $queue
125 * @param string $formName
126 * @return FormDocument
127 */
128 public static function getForm(PackageInstallationQueue $queue, $formName) {
129 $sql = "SELECT document
130 FROM wcf".WCF_N."_package_installation_form
131 WHERE queueID = ?
132 AND formName = ?";
133 $statement = WCF::getDB()->prepareStatement($sql);
134 $statement->execute([
135 $queue->queueID,
136 $formName
137 ]);
138 $row = $statement->fetchArray();
139
140 if ($row) {
141 return unserialize(base64_decode($row['document']));
142 }
143
144 return null;
145 }
146 }