[ Index ]

PHP Cross Reference of Joomla 4.2.2 documentation

title

Body

[close]

/plugins/installer/override/ -> override.php (source)

   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  }


Generated: Wed Sep 7 05:41:13 2022 Chilli.vc Blog - For Webmaster,Blog-Writer,System Admin and Domainer