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