Commit | Line | Data |
---|---|---|
11ade432 AE |
1 | <?php |
2 | namespace wcf\system\package\plugin; | |
e0497659 MS |
3 | use wcf\data\event\listener\EventListener; |
4 | use wcf\data\event\listener\EventListenerEditor; | |
b401cd0d | 5 | use wcf\system\cache\builder\EventListenerCacheBuilder; |
11ade432 AE |
6 | use wcf\system\WCF; |
7 | ||
8 | /** | |
a17de04e | 9 | * Installs, updates and deletes event listeners. |
11ade432 AE |
10 | * |
11 | * @author Marcel Werk | |
cea1798f | 12 | * @copyright 2001-2017 WoltLab GmbH |
11ade432 | 13 | * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php> |
e71525e4 | 14 | * @package WoltLabSuite\Core\System\Package\Plugin |
11ade432 AE |
15 | */ |
16 | class EventListenerPackageInstallationPlugin extends AbstractXMLPackageInstallationPlugin { | |
17 | /** | |
0fcfe5f6 | 18 | * @inheritDoc |
11ade432 | 19 | */ |
157054c9 | 20 | public $className = EventListenerEditor::class; |
11ade432 | 21 | |
11ade432 | 22 | /** |
0fcfe5f6 | 23 | * @inheritDoc |
9f959ced | 24 | */ |
11ade432 AE |
25 | public $tagName = 'eventlistener'; |
26 | ||
27 | /** | |
0fcfe5f6 | 28 | * @inheritDoc |
11ade432 AE |
29 | */ |
30 | protected function handleDelete(array $items) { | |
31 | $sql = "DELETE FROM wcf".WCF_N."_".$this->tableName." | |
32 | WHERE packageID = ? | |
7e6405f8 | 33 | AND environment = ? |
11ade432 | 34 | AND eventClassName = ? |
5a822fcf | 35 | AND eventName = ? |
11ade432 AE |
36 | AND inherit = ? |
37 | AND listenerClassName = ?"; | |
e0497659 MS |
38 | $legacyStatement = WCF::getDB()->prepareStatement($sql); |
39 | ||
40 | $sql = "DELETE FROM wcf".WCF_N."_".$this->tableName." | |
41 | WHERE packageID = ? | |
42 | AND listenerName = ?"; | |
11ade432 | 43 | $statement = WCF::getDB()->prepareStatement($sql); |
e0497659 | 44 | |
11ade432 | 45 | foreach ($items as $item) { |
e0497659 | 46 | if (!isset($item['attributes']['name'])) { |
058cbd6a | 47 | $legacyStatement->execute([ |
e0497659 | 48 | $this->installation->getPackageID(), |
63b9817b | 49 | isset($item['elements']['environment']) ? $item['elements']['environment'] : 'user', |
e0497659 MS |
50 | $item['elements']['eventclassname'], |
51 | $item['elements']['eventname'], | |
63b9817b | 52 | isset($item['elements']['inherit']) ? $item['elements']['inherit'] : 0, |
e0497659 | 53 | $item['elements']['listenerclassname'] |
058cbd6a | 54 | ]); |
e0497659 MS |
55 | } |
56 | else { | |
058cbd6a | 57 | $statement->execute([ |
e0497659 MS |
58 | $this->installation->getPackageID(), |
59 | $item['attributes']['name'] | |
058cbd6a | 60 | ]); |
e0497659 | 61 | } |
11ade432 AE |
62 | } |
63 | } | |
64 | ||
65 | /** | |
0fcfe5f6 | 66 | * @inheritDoc |
11ade432 AE |
67 | */ |
68 | protected function prepareImport(array $data) { | |
63b9817b | 69 | $nice = isset($data['elements']['nice']) ? intval($data['elements']['nice']) : 0; |
11ade432 AE |
70 | if ($nice < -128) $nice = -128; |
71 | else if ($nice > 127) $nice = 127; | |
72 | ||
058cbd6a | 73 | return [ |
63b9817b | 74 | 'environment' => isset($data['elements']['environment']) ? $data['elements']['environment'] : 'user', |
11ade432 AE |
75 | 'eventClassName' => $data['elements']['eventclassname'], |
76 | 'eventName' => $data['elements']['eventname'], | |
63b9817b | 77 | 'inherit' => isset($data['elements']['inherit']) ? intval($data['elements']['inherit']) : 0, |
11ade432 | 78 | 'listenerClassName' => $data['elements']['listenerclassname'], |
63b9817b | 79 | 'listenerName' => isset($data['attributes']['name']) ? $data['attributes']['name'] : '', |
ffdebe9c | 80 | 'niceValue' => $nice, |
63b9817b MS |
81 | 'options' => isset($data['elements']['options']) ? $data['elements']['options'] : '', |
82 | 'permissions' => isset($data['elements']['permissions']) ? $data['elements']['permissions'] : '' | |
058cbd6a | 83 | ]; |
11ade432 AE |
84 | } |
85 | ||
e0497659 | 86 | /** |
0fcfe5f6 | 87 | * @inheritDoc |
e0497659 MS |
88 | */ |
89 | protected function import(array $row, array $data) { | |
90 | // if an event listener is updated without a name given, keep the | |
91 | // old automatically assigned name | |
92 | if (!empty($row) && !$data['listenerName']) { | |
93 | unset($data['listenerName']); | |
94 | } | |
95 | ||
a13849b8 | 96 | /** @var EventListener $eventListener */ |
e0497659 MS |
97 | $eventListener = parent::import($row, $data); |
98 | ||
99 | // update event listener name | |
100 | if (!$eventListener->listenerName) { | |
101 | $eventListenerEditor = new EventListenerEditor($eventListener); | |
058cbd6a | 102 | $eventListenerEditor->update([ |
e0497659 | 103 | 'listenerName' => EventListener::AUTOMATIC_NAME_PREFIX.$eventListener->listenerID |
058cbd6a | 104 | ]); |
e0497659 MS |
105 | |
106 | $eventListener = new EventListener($eventListener->listenerID); | |
107 | } | |
108 | ||
109 | return $eventListener; | |
110 | } | |
111 | ||
11ade432 | 112 | /** |
0fcfe5f6 | 113 | * @inheritDoc |
11ade432 AE |
114 | */ |
115 | protected function findExistingItem(array $data) { | |
e0497659 MS |
116 | if (!$data['listenerName']) { |
117 | $sql = "SELECT * | |
118 | FROM wcf".WCF_N."_".$this->tableName." | |
119 | WHERE packageID = ? | |
120 | AND environment = ? | |
121 | AND eventClassName = ? | |
122 | AND eventName = ? | |
123 | AND listenerClassName = ?"; | |
058cbd6a | 124 | $parameters = [ |
e0497659 MS |
125 | $this->installation->getPackageID(), |
126 | $data['environment'], | |
127 | $data['eventClassName'], | |
128 | $data['eventName'], | |
129 | $data['listenerClassName'] | |
058cbd6a | 130 | ]; |
e0497659 MS |
131 | } |
132 | else { | |
133 | $sql = "SELECT * | |
134 | FROM wcf".WCF_N."_".$this->tableName." | |
135 | WHERE packageID = ? | |
136 | AND listenerName = ?"; | |
058cbd6a | 137 | $parameters = [ |
e0497659 MS |
138 | $this->installation->getPackageID(), |
139 | $data['listenerName'] | |
058cbd6a | 140 | ]; |
e0497659 | 141 | } |
11ade432 | 142 | |
058cbd6a | 143 | return [ |
11ade432 AE |
144 | 'sql' => $sql, |
145 | 'parameters' => $parameters | |
058cbd6a | 146 | ]; |
11ade432 AE |
147 | } |
148 | ||
149 | /** | |
0fcfe5f6 | 150 | * @inheritDoc |
11ade432 AE |
151 | */ |
152 | public function uninstall() { | |
153 | parent::uninstall(); | |
154 | ||
155 | // clear cache immediately | |
b401cd0d | 156 | EventListenerCacheBuilder::getInstance()->reset(); |
11ade432 AE |
157 | } |
158 | } |