[ Index ] |
PHP Cross Reference of Joomla 4.2.2 documentation |
[Summary view] [Print] [Text view]
1 <?php 2 3 /** 4 * @package Joomla.Plugin 5 * @subpackage Installer.override 6 * 7 * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> 8 * @license GNU General Public License version 2 or later; see LICENSE.txt 9 10 * @phpcs:disable PSR1.Classes.ClassDeclaration.MissingNamespace 11 */ 12 13 use Joomla\CMS\Application\CMSApplicationInterface; 14 use Joomla\CMS\Date\Date; 15 use Joomla\CMS\Language\Text; 16 use Joomla\CMS\Plugin\CMSPlugin; 17 use Joomla\Database\ParameterType; 18 19 // phpcs:disable PSR1.Files.SideEffects 20 \defined('_JEXEC') or die; 21 // phpcs:enable PSR1.Files.SideEffects 22 23 /** 24 * Override Plugin 25 * 26 * @since 4.0.0 27 */ 28 class PlgInstallerOverride extends CMSPlugin 29 { 30 /** 31 * Application object. 32 * 33 * @var CMSApplicationInterface 34 */ 35 protected $app; 36 37 /** 38 * Load the language file on instantiation. 39 * 40 * @var boolean 41 * 42 * @since 4.0.0 43 */ 44 protected $autoloadLanguage = true; 45 46 /** 47 * Database object 48 * 49 * @var \Joomla\Database\DatabaseInterface 50 * @since 4.0.0 51 */ 52 protected $db; 53 54 /** 55 * Method to get com_templates model instance. 56 * 57 * @param string $name The model name. Optional 58 * @param string $prefix The class prefix. Optional 59 * 60 * @return \Joomla\Component\Templates\Administrator\Model\TemplateModel 61 * 62 * @since 4.0.0 63 * 64 * @throws \Exception 65 */ 66 public function getModel($name = 'Template', $prefix = 'Administrator') 67 { 68 /** @var \Joomla\Component\Templates\Administrator\Extension\TemplatesComponent $templateProvider */ 69 $templateProvider = $this->app->bootComponent('com_templates'); 70 71 /** @var \Joomla\Component\Templates\Administrator\Model\TemplateModel $model */ 72 $model = $templateProvider->getMVCFactory()->createModel($name, $prefix); 73 74 return $model; 75 } 76 77 /** 78 * Purges session array. 79 * 80 * @return void 81 * 82 * @since 4.0.0 83 */ 84 public function purge() 85 { 86 // Delete stored session value. 87 $session = $this->app->getSession(); 88 $session->remove('override.beforeEventFiles'); 89 $session->remove('override.afterEventFiles'); 90 } 91 92 /** 93 * Method to store files before event. 94 * 95 * @return void 96 * 97 * @since 4.0.0 98 */ 99 public function storeBeforeEventFiles() 100 { 101 // Delete stored session value. 102 $this->purge(); 103 104 // Get list and store in session. 105 $list = $this->getOverrideCoreList(); 106 $this->app->getSession()->set('override.beforeEventFiles', $list); 107 } 108 109 /** 110 * Method to store files after event. 111 * 112 * @return void 113 * 114 * @since 4.0.0 115 */ 116 public function storeAfterEventFiles() 117 { 118 // Get list and store in session. 119 $list = $this->getOverrideCoreList(); 120 $this->app->getSession()->set('override.afterEventFiles', $list); 121 } 122 123 /** 124 * Method to prepare changed or updated core file. 125 * 126 * @param string $action The name of the action. 127 * 128 * @return array A list of changed files. 129 * 130 * @since 4.0.0 131 */ 132 public function getUpdatedFiles($action) 133 { 134 $session = $this->app->getSession(); 135 136 $after = $session->get('override.afterEventFiles'); 137 $before = $session->get('override.beforeEventFiles'); 138 $result = array(); 139 140 if (!is_array($after) || !is_array($before)) { 141 return $result; 142 } 143 144 $size1 = count($after); 145 $size2 = count($before); 146 147 if ($size1 === $size2) { 148 for ($i = 0; $i < $size1; $i++) { 149 if ($after[$i]->coreFile !== $before[$i]->coreFile) { 150 $after[$i]->action = $action; 151 $result[] = $after[$i]; 152 } 153 } 154 } 155 156 return $result; 157 } 158 159 /** 160 * Method to get core list of override files. 161 * 162 * @return array The list of core files. 163 * 164 * @since 4.0.0 165 */ 166 public function getOverrideCoreList() 167 { 168 try { 169 /** @var \Joomla\Component\Templates\Administrator\Model\TemplateModel $templateModel */ 170 $templateModel = $this->getModel(); 171 } catch (\Exception $e) { 172 return []; 173 } 174 175 return $templateModel->getCoreList(); 176 } 177 178 /** 179 * Last process of this plugin. 180 * 181 * @param array $result Result array. 182 * 183 * @return void 184 * 185 * @since 4.0.0 186 */ 187 public function finalize($result) 188 { 189 $num = count($result); 190 $link = 'index.php?option=com_templates&view=templates'; 191 192 if ($num != 0) { 193 $this->app->enqueueMessage(Text::plural('PLG_INSTALLER_OVERRIDE_N_FILE_UPDATED', $num, $link), 'notice'); 194 $this->saveOverrides($result); 195 } 196 197 // Delete stored session value. 198 $this->purge(); 199 } 200 201 /** 202 * Event before extension update. 203 * 204 * @return void 205 * 206 * @since 4.0.0 207 */ 208 public function onExtensionBeforeUpdate() 209 { 210 $this->storeBeforeEventFiles(); 211 } 212 213 /** 214 * Event after extension update. 215 * 216 * @return void 217 * 218 * @since 4.0.0 219 */ 220 public function onExtensionAfterUpdate() 221 { 222 $this->storeAfterEventFiles(); 223 $result = $this->getUpdatedFiles('Extension Update'); 224 $this->finalize($result); 225 } 226 227 /** 228 * Event before joomla update. 229 * 230 * @return void 231 * 232 * @since 4.0.0 233 */ 234 public function onJoomlaBeforeUpdate() 235 { 236 $this->storeBeforeEventFiles(); 237 } 238 239 /** 240 * Event after joomla update. 241 * 242 * @return void 243 * 244 * @since 4.0.0 245 */ 246 public function onJoomlaAfterUpdate() 247 { 248 $this->storeAfterEventFiles(); 249 $result = $this->getUpdatedFiles('Joomla Update'); 250 $this->finalize($result); 251 } 252 253 /** 254 * Event before install. 255 * 256 * @return void 257 * 258 * @since 4.0.0 259 */ 260 public function onInstallerBeforeInstaller() 261 { 262 $this->storeBeforeEventFiles(); 263 } 264 265 /** 266 * Event after install. 267 * 268 * @return void 269 * 270 * @since 4.0.0 271 */ 272 public function onInstallerAfterInstaller() 273 { 274 $this->storeAfterEventFiles(); 275 $result = $this->getUpdatedFiles('Extension Install'); 276 $this->finalize($result); 277 } 278 279 /** 280 * Check for existing id. 281 * 282 * @param string $id Hash id of file. 283 * @param integer $exid Extension id of file. 284 * 285 * @return boolean True/False 286 * 287 * @since 4.0.0 288 */ 289 public function load($id, $exid) 290 { 291 $db = $this->db; 292 293 // Create a new query object. 294 $query = $db->getQuery(true); 295 296 $query 297 ->select($db->quoteName('hash_id')) 298 ->from($db->quoteName('#__template_overrides')) 299 ->where($db->quoteName('hash_id') . ' = :id') 300 ->where($db->quoteName('extension_id') . ' = :exid') 301 ->bind(':id', $id) 302 ->bind(':exid', $exid, ParameterType::INTEGER); 303 304 $db->setQuery($query); 305 $results = $db->loadObjectList(); 306 307 if (count($results) === 1) { 308 return true; 309 } 310 311 return false; 312 } 313 314 /** 315 * Save the updated files. 316 * 317 * @param array $pks Updated files. 318 * 319 * @return void 320 * 321 * @since 4.0.0 322 * @throws \Joomla\Database\Exception\ExecutionFailureException|\Joomla\Database\Exception\ConnectionFailureException 323 */ 324 private function saveOverrides($pks) 325 { 326 // Insert columns. 327 $columns = [ 328 'template', 329 'hash_id', 330 'action', 331 'created_date', 332 'modified_date', 333 'extension_id', 334 'state', 335 'client_id', 336 ]; 337 338 // Create an insert query. 339 $insertQuery = $this->db->getQuery(true) 340 ->insert($this->db->quoteName('#__template_overrides')) 341 ->columns($this->db->quoteName($columns)); 342 343 foreach ($pks as $pk) { 344 $date = new Date('now'); 345 $createdDate = $date->toSql(); 346 347 if (empty($pk->coreFile)) { 348 $modifiedDate = null; 349 } else { 350 $modifiedDate = $createdDate; 351 } 352 353 if ($this->load($pk->id, $pk->extension_id)) { 354 $updateQuery = $this->db->getQuery(true) 355 ->update($this->db->quoteName('#__template_overrides')) 356 ->set( 357 [ 358 $this->db->quoteName('modified_date') . ' = :modifiedDate', 359 $this->db->quoteName('action') . ' = :pkAction', 360 $this->db->quoteName('state') . ' = 0', 361 ] 362 ) 363 ->where($this->db->quoteName('hash_id') . ' = :pkId') 364 ->where($this->db->quoteName('extension_id') . ' = :exId') 365 ->bind(':modifiedDate', $modifiedDate) 366 ->bind(':pkAction', $pk->action) 367 ->bind(':pkId', $pk->id) 368 ->bind(':exId', $pk->extension_id, ParameterType::INTEGER); 369 370 // Set the query using our newly populated query object and execute it. 371 $this->db->setQuery($updateQuery); 372 $this->db->execute(); 373 374 continue; 375 } 376 377 // Insert values, preserve order 378 $bindArray = $insertQuery->bindArray( 379 [ 380 $pk->template, 381 $pk->id, 382 $pk->action, 383 $createdDate, 384 $modifiedDate, 385 ], 386 ParameterType::STRING 387 ); 388 389 $bindArray = array_merge( 390 $bindArray, 391 $insertQuery->bindArray( 392 [ 393 $pk->extension_id, 394 0, 395 (int) $pk->client, 396 ], 397 ParameterType::INTEGER 398 ) 399 ); 400 401 $insertQuery->values(implode(',', $bindArray)); 402 } 403 404 if (!empty($bindArray)) { 405 $this->db->setQuery($insertQuery); 406 $this->db->execute(); 407 } 408 } 409 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Wed Sep 7 05:41:13 2022 | Chilli.vc Blog - For Webmaster,Blog-Writer,System Admin and Domainer |