Commit 54601e16 authored by Gaurav Kapoor's avatar Gaurav Kapoor Committed by Gaurav Kapoor
Browse files

Issue #2558459 by lomasr, gaurav.kapoor: Modify the counting logic

parent baf76493
Loading
Loading
Loading
Loading

counter.services.yml

0 → 100644
+6 −0
Original line number Diff line number Diff line
services:
  counter_event_subscriber:
    class: '\Drupal\counter\EventSubscriber\CounterEventsSubscriber'
    arguments: ['@database', '@config.factory', '@current_user']
    tags:
      - { name: 'event_subscriber' }
+157 −0
Original line number Diff line number Diff line
<?php

namespace Drupal\counter\EventSubscriber;

use Drupal\Component\Utility\Html;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Database\Connection;
use Drupal\Core\Session\AccountInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;

/**
 * Class CounterEventSubscriber.
 *
 * @package Drupal\counter\EventSubscriber
 */
class CounterEventsSubscriber implements EventSubscriberInterface {

  /**
   * The database connection.
   *
   * @var Drupal\Core\Database\Connection
   */
  protected $database;

  /**
   * The config factory.
   *
   * @var \Drupal\Core\Config\ConfigFactoryInterface
   */
  protected $configFactory;

  /**
   * The account interface for accessing current user.
   *
   * @var Drupal\Core\Session\AccountInterface
   */
  protected $account;

  /**
   * Constructs an event subscriber.
   *
   * @param \Drupal\Core\Database\Connection $database
   *   The database connection variable for executing queries.
   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
   *   The config factory for the form.
   * @param \Drupal\Core\Session\AccountInterface $account
   *   The account interface for accessing current user.
   */
  public function __construct(Connection $database, ConfigFactoryInterface $config_factory, AccountInterface $account) {
    $this->database = $database;
    $this->configFactory = $config_factory;
    $this->account = $account;
  }

  /**
   * {@inheritdoc}
   *
   * @return array
   *   The event names to listen for, and the methods that should be executed.
   */
  public static function getSubscribedEvents() {
    return [
      KernelEvents::REQUEST => 'counterInsert',
    ];
  }

  /**
   * React to a HTTP event.
   *
   * @param \Symfony\Component\HttpKernel\Event\RequestEvent $event
   *   Request event.
   */
  public function counterInsert(RequestEvent $event) {
    $request = $event->getRequest();
    $ip = $request->getClientIp();
    $created = \time();
    $url = Html::escape($request->getRequestUri());

    $config = $this->configFactory->get('counter.settings');
    $counter_insert_delay = $config->get('counter_insert_delay');
    $counter_skip_admin = $config->get('counter_skip_admin');

    // Fetch last created value from database.
    $db_types = $this->database->driver();
    switch ($db_types) {
      case 'mssql':
        $sql = " SELECT TOP 1 created FROM {counter} WHERE created<>0 ORDER BY created DESC";
        break;

      case 'oracle':
        $sql = " SELECT created FROM {counter} WHERE ROWNUM=1 AND created<>0 ORDER BY created DESC";
        break;

      default:
        $sql = " SELECT created FROM {counter} WHERE created<>0 ORDER BY created DESC LIMIT 1";
    }
    $counter_lastdate = $this->database->query($sql)->fetchField();

    // Check if permitted to insert data.
    $interval = \time() - $counter_lastdate;
    $data_insert = ($interval >= $counter_insert_delay ? 1 : 0);

    // Uid, nid, type, browser name, browser version, platform.
    $node = $request->attributes->get('node');
    $nid = 0;
    $type = '';
    $account = $this->account;
    $path_args = \explode('/', $request->getRequestUri());
    if ($path_args[0] == 'node' && is_numeric($path_args[1])) {
      $nid  = $node->nid;
      $type = $node->type;
    }
    $browser = counter_get_browser();
    $browser_name = $browser['browser_name'];
    $browser_version = $browser['browser_version'];
    $platform = $browser['platform'];

    $sql = " INSERT INTO {counter} (ip,created,url, uid, nid, type, browser_name, browser_version, platform)" .
    " VALUES (:ip, :created, :url, :uid, :nid, :type, :browser_name, :browser_version, :platform)";
    $counter_exec = FALSE;

    if ($data_insert && ($account->id() <> 1)) {
      $counter_exec = TRUE;
    }
    else {
      if ($data_insert && ($account->id() == 1) && !$counter_skip_admin) {
        $counter_exec = TRUE;
      }
    }

    if ($counter_exec) {
      $this->database->query($sql, [
        ':ip' => $ip,
        ':created' => $created,
        ':url' => $url,
        ':uid' => $account->id(),
        ':nid' => $nid,
        ':type' => $type,
        ':browser_name' => $browser_name,
        ':browser_version' => $browser_version,
        ':platform' => $platform,
      ]);
    }

    // Update counter data table.
    $sql_site_counter = "SELECT counter_value FROM {counter_data} WHERE counter_name='site_counter'";
    $site_counter = $this->database->query($sql_site_counter)->fetchField();

    $new_site_counter = $site_counter + 1;

    $sql = " UPDATE {counter_data} SET counter_value = :counter_value WHERE counter_name='site_counter'";
    $this->database->query($sql, [':counter_value' => $new_site_counter]);
  }

}
+0 −61
Original line number Diff line number Diff line
@@ -2,7 +2,6 @@

namespace Drupal\counter\Plugin\Block;

use Drupal\Component\Utility\Html;
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Database\Connection;
@@ -105,7 +104,6 @@ class CounterBlock extends BlockBase implements ContainerFactoryPluginInterface
   * {@inheritdoc}
   */
  public function build() {

    $config                         = $this->configFactory->get('counter.settings');
    $counter_show_site_counter      = $config->get('counter_show_site_counter');
    $counter_show_unique_visitor    = $config->get('counter_show_unique_visitor');
@@ -117,9 +115,7 @@ class CounterBlock extends BlockBase implements ContainerFactoryPluginInterface
    $counter_show_server_ip         = $config->get('counter_show_server_ip');
    $counter_show_ip                = $config->get('counter_show_ip');
    $counter_show_counter_since     = $config->get('counter_show_counter_since');
    $counter_skip_admin             = $config->get('counter_skip_admin');
    $counter_refresh_delay          = $config->get('counter_refresh_delay');
    $counter_insert_delay           = $config->get('counter_insert_delay');
    $counter_initial_counter        = $config->get('counter_initial_counter');
    $counter_initial_unique_visitor = $config->get('counter_initial_unique_visitor');
    $counter_initial_since          = $config->get('counter_initial_since');
@@ -129,8 +125,6 @@ class CounterBlock extends BlockBase implements ContainerFactoryPluginInterface
    $counter_statistic_year         = $config->get('counter_statistic_year');
    $ip                             = $this->requestStack->getCurrentRequest()->getClientIp();
    $counter_svr_ip                 = $this->requestStack->getCurrentRequest()->server->get('SERVER_ADDR');
    $created                        = \time();
    $url                            = Html::escape($this->requestStack->getCurrentRequest()->getRequestUri());

    // Counter_insert_delay.
    $db_types = $this->database->driver();
@@ -151,63 +145,8 @@ class CounterBlock extends BlockBase implements ContainerFactoryPluginInterface

    // Check if permitted to insert data.
    $interval = \time() - $counter_lastdate;
    $data_insert = ($interval >= $counter_insert_delay ? 1 : 0);
    $data_update = ($interval >= $counter_refresh_delay ? 1 : 0);

    // Uid, nid, type, browser name, browser version, platform.
    $node = $this->requestStack->getCurrentRequest()->attributes->get('node');
    $nid = 0;
    $type = '';
    $account = $this->account;
    $path_args = \explode('/', $this->requestStack->getCurrentRequest()->getRequestUri());
    if ($path_args[0] == 'node' && is_numeric($path_args[1])) {
      $nid  = $node->nid;
      $type = $node->type;
    }
    $browser         = counter_get_browser();
    $browser_name    = $browser['browser_name'];
    $browser_version = $browser['browser_version'];
    $platform        = $browser['platform'];

    $sql = " INSERT INTO {counter} (ip,created,url, uid, nid, type, browser_name, browser_version, platform)" .
    " VALUES (:ip, :created, :url, :uid, :nid, :type, :browser_name, :browser_version, :platform)";

    $counter_exec = FALSE;

    if ($data_insert && ($account->id() <> 1)) {
      $counter_exec = TRUE;
    }
    else {
      if ($data_insert && ($account->id() == 1) && !$counter_skip_admin) {
        $counter_exec = TRUE;
      }
    }

    if ($counter_exec) {
      $results = $this->database->query($sql, [
        ':ip' => $ip,
        ':created' => $created,
        ':url' => $url,
        ':uid' => $account->id(),
        ':nid' => $nid,
        ':type' => $type,
        ':browser_name' => $browser_name,
        ':browser_version' => $browser_version,
        ':platform' => $platform,
      ]);
    }
    else {
      return;
    }

    $sql_site_counter = "SELECT counter_value FROM {counter_data} WHERE counter_name='site_counter'";
    $site_counter     = $this->database->query($sql_site_counter)->fetchField();

    $new_site_counter = $site_counter + 1;

    $sql = " UPDATE {counter_data} SET counter_value = :counter_value WHERE counter_name='site_counter'";
    $results = $this->database->query($sql, [':counter_value' => $new_site_counter]);

    // Read counter_data.
    $sql = " SELECT * FROM {counter_data} ORDER BY counter_name";
    $results = $this->database->query($sql);