[ Index ]

PHP Cross Reference of Joomla 4.2.2 documentation

title

Body

[close]

/administrator/components/com_actionlogs/src/Model/ -> ActionlogModel.php (source)

   1  <?php
   2  
   3  /**
   4   * @package     Joomla.Administrator
   5   * @subpackage  com_actionlogs
   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  
  11  namespace Joomla\Component\Actionlogs\Administrator\Model;
  12  
  13  use Joomla\CMS\Component\ComponentHelper;
  14  use Joomla\CMS\Factory;
  15  use Joomla\CMS\HTML\HTMLHelper;
  16  use Joomla\CMS\Language\Text;
  17  use Joomla\CMS\Mail\Exception\MailDisabledException;
  18  use Joomla\CMS\Mail\MailTemplate;
  19  use Joomla\CMS\MVC\Model\BaseDatabaseModel;
  20  use Joomla\Component\Actionlogs\Administrator\Helper\ActionlogsHelper;
  21  use Joomla\Utilities\IpHelper;
  22  use PHPMailer\PHPMailer\Exception as phpMailerException;
  23  
  24  // phpcs:disable PSR1.Files.SideEffects
  25  \defined('_JEXEC') or die;
  26  // phpcs:enable PSR1.Files.SideEffects
  27  
  28  /**
  29   * Methods supporting a list of Actionlog records.
  30   *
  31   * @since  3.9.0
  32   */
  33  class ActionlogModel extends BaseDatabaseModel
  34  {
  35      /**
  36       * Function to add logs to the database
  37       * This method adds a record to #__action_logs contains (message_language_key, message, date, context, user)
  38       *
  39       * @param   array    $messages            The contents of the messages to be logged
  40       * @param   string   $messageLanguageKey  The language key of the message
  41       * @param   string   $context             The context of the content passed to the plugin
  42       * @param   integer  $userId              ID of user perform the action, usually ID of current logged in user
  43       *
  44       * @return  void
  45       *
  46       * @since   3.9.0
  47       */
  48      public function addLog($messages, $messageLanguageKey, $context, $userId = null)
  49      {
  50          $user   = Factory::getUser($userId);
  51          $db     = $this->getDatabase();
  52          $date   = Factory::getDate();
  53          $params = ComponentHelper::getComponent('com_actionlogs')->getParams();
  54  
  55          if ($params->get('ip_logging', 0)) {
  56              $ip = IpHelper::getIp();
  57  
  58              if (!filter_var($ip, FILTER_VALIDATE_IP)) {
  59                  $ip = 'COM_ACTIONLOGS_IP_INVALID';
  60              }
  61          } else {
  62              $ip = 'COM_ACTIONLOGS_DISABLED';
  63          }
  64  
  65          $loggedMessages = array();
  66  
  67          foreach ($messages as $message) {
  68              $logMessage                       = new \stdClass();
  69              $logMessage->message_language_key = $messageLanguageKey;
  70              $logMessage->message              = json_encode($message);
  71              $logMessage->log_date             = (string) $date;
  72              $logMessage->extension            = $context;
  73              $logMessage->user_id              = $user->id;
  74              $logMessage->ip_address           = $ip;
  75              $logMessage->item_id              = isset($message['id']) ? (int) $message['id'] : 0;
  76  
  77              try {
  78                  $db->insertObject('#__action_logs', $logMessage);
  79                  $loggedMessages[] = $logMessage;
  80              } catch (\RuntimeException $e) {
  81                  // Ignore it
  82              }
  83          }
  84  
  85          try {
  86              // Send notification email to users who choose to be notified about the action logs
  87              $this->sendNotificationEmails($loggedMessages, $user->name, $context);
  88          } catch (MailDisabledException | phpMailerException $e) {
  89              // Ignore it
  90          }
  91      }
  92  
  93      /**
  94       * Send notification emails about the action log
  95       *
  96       * @param   array   $messages  The logged messages
  97       * @param   string  $username  The username
  98       * @param   string  $context   The Context
  99       *
 100       * @return  void
 101       *
 102       * @since   3.9.0
 103       *
 104       * @throws  MailDisabledException  if mail is disabled
 105       * @throws  phpmailerException     if sending mail failed
 106       */
 107      protected function sendNotificationEmails($messages, $username, $context)
 108      {
 109          $app   = Factory::getApplication();
 110          $lang  = $app->getLanguage();
 111          $db    = $this->getDatabase();
 112          $query = $db->getQuery(true);
 113  
 114          $query
 115              ->select($db->quoteName(array('u.email', 'l.extensions')))
 116              ->from($db->quoteName('#__users', 'u'))
 117              ->where($db->quoteName('u.block') . ' = 0')
 118              ->join(
 119                  'INNER',
 120                  $db->quoteName('#__action_logs_users', 'l') . ' ON ( ' . $db->quoteName('l.notify') . ' = 1 AND '
 121                  . $db->quoteName('l.user_id') . ' = ' . $db->quoteName('u.id') . ')'
 122              );
 123  
 124          $db->setQuery($query);
 125  
 126          $users = $db->loadObjectList();
 127  
 128          $recipients = array();
 129  
 130          foreach ($users as $user) {
 131              $extensions = json_decode($user->extensions, true);
 132  
 133              if ($extensions && \in_array(strtok($context, '.'), $extensions)) {
 134                  $recipients[] = $user->email;
 135              }
 136          }
 137  
 138          if (empty($recipients)) {
 139              return;
 140          }
 141  
 142          $extension = strtok($context, '.');
 143          $lang->load('com_actionlogs', JPATH_ADMINISTRATOR);
 144          ActionlogsHelper::loadTranslationFiles($extension);
 145          $temp      = [];
 146  
 147          foreach ($messages as $message) {
 148              $m = [];
 149              $m['extension'] = Text::_($extension);
 150              $m['message']   = ActionlogsHelper::getHumanReadableLogMessage($message);
 151              $m['date']      = HTMLHelper::_('date', $message->log_date, 'Y-m-d H:i:s T', 'UTC');
 152              $m['username']  = $username;
 153              $temp[] = $m;
 154          }
 155  
 156          $templateData = [
 157              'messages'     => $temp
 158          ];
 159  
 160          $mailer = new MailTemplate('com_actionlogs.notification', $app->getLanguage()->getTag());
 161          $mailer->addTemplateData($templateData);
 162  
 163          foreach ($recipients as $recipient) {
 164              $mailer->addRecipient($recipient);
 165          }
 166  
 167          $mailer->send();
 168      }
 169  }


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