slaask_for_drupal-8.x-1.x-dev/slaask.module

slaask.module
<?php

/**
 * @file
 * Drupal Module: Slaask.
 *
 * Adds the required Javascript to all your Drupal pages to Slaask to be
 * displayed.
 */

use Drupal\Component\Utility\Crypt;
use Drupal\Core\Routing\RouteMatchInterface;

/**
 * Implements hook_help().
 */
function slaask_help($route_name, RouteMatchInterface $route_match) {
  switch ($route_name) {
    case 'slaask.admin_settings_form':
      return t('<a href=":slaask_url">Slaask</a> is the first customer chat tool that is 100% integrated into Slack. Enter the widget id from the Slaask <a href=":slaask_code_url">code snippet</a>, "_slaask.init(#########)".', [':slaask_url' => 'http://www.slaask.com/', ':slaask_code_url' => 'https://slaask.help/general/adding-the-slaask-code-to-my-site-280']);
  }
}

/**
 * Implements hook_page_attachments().
 *
 * Insert JavaScript to the appropriate scope/region of the configured page(s).
 */
function slaask_page_attachments(array &$page) {
  // Retrieve the widget ID if it exists.
  $config = \Drupal::config('slaask.settings');
  $widget_id = $config->get('widget_id');

  $is_admin = \Drupal::service('router.admin_context')->isAdminRoute();

  // Attach JavaScript if this is not an admin page and the widget ID is set.
  if (!$is_admin && $widget_id) {

    $uri = 'public://slaask_js/chat.js';
    $path = file_create_url($uri);

    if ($config->get('cache') && file_exists($path)) {

      $page['#attached']['html_head'][] = [
        // The data.
        [
          '#type' => 'html_tag',
          // The HTML tag to add, in this case a  tag.
          '#tag' => 'script',
          // Set attributes like src to load a file.
          '#attributes' => array('src' => $path),

        ],

        // Key for finding HTML element later for alter.
        'slaask_chat',
      ];
    }
    else {
      $page['#attached']['library'][] = 'slaask/slaask.chat';
    }
    $page['#attached']['library'][] = 'slaask/slaask.init';
    $page['#attached']['drupalSettings']['slaask']['init'] = $widget_id;
  }

}

/**
 * Implements hook_cron().
 */
function slaask_cron() {
  $config = \Drupal::config('slaask.settings');

  // Regenerate the tracking code file every day.
  if (REQUEST_TIME - \Drupal::state()->get('slaask.last_cache') >= 1 && $config->get('cache')) {
    _slaask_cache('https://cdn.slaask.com/chat.js', TRUE);
    \Drupal::state()->set('slaask.last_cache', REQUEST_TIME);
    \Drupal::logger('slaask')->info('Slaask cron complete.');
  }
}

/**
 * Download/Synchronize/Cache tracking code file locally.
 *
 * @param string $location
 *   The full URL to the external javascript file.
 * @param bool $synchronize
 *   Synchronize to local cache if remote file has changed.
 *
 * @return mixed
 *   The path to the local javascript file on success, boolean FALSE on failure.
 */
function _slaask_cache($location, $synchronize = FALSE) {
  $path = 'public://slaask_js';
  $file_destination = $path . '/' . basename($location);
  \Drupal::logger('slaask')->info('attempting cache.');
  if (!file_exists($file_destination) || $synchronize) {
    // Download the latest tracking code.
    try {
      $data = \Drupal::httpClient()
        ->get($location)
        ->getBody(TRUE);

      if (file_exists($file_destination)) {
        // Synchronize tracking code and and replace local file if outdated.
        $data_hash_local = Crypt::hashBase64(file_get_contents($file_destination));
        $data_hash_remote = Crypt::hashBase64($data);
        // Check that the files directory is writable.
        if ($data_hash_local != $data_hash_remote && file_prepare_directory($path)) {
          // Save updated tracking code file to disk.
          file_unmanaged_save_data($data, $file_destination, FILE_EXISTS_REPLACE);
          \Drupal::logger('slaask')->info('Locally cached code file has been updated.');

          // Change query-strings on css/js files to enforce reload for all
          // users.
          _drupal_flush_css_js();
        }
      }
      else {
        // Check that the files directory is writable.
        if (file_prepare_directory($path, FILE_CREATE_DIRECTORY)) {
          // There is no need to flush JS here as core refreshes JS caches
          // automatically, if new files are added.
          file_unmanaged_save_data($data, $file_destination, FILE_EXISTS_REPLACE);
          \Drupal::logger('slaask')->info('Locally cached code file has been saved.');

          // Return the local JS file path.
          return file_create_url($file_destination);
        }
      }
    }
    catch (RequestException $exception) {
      watchdog_exception('slaask', $exception);
    }
  }
  else {
    // Return the local JS file path.
    return file_create_url($file_destination);
  }
}

/**
 * Delete cached files and directory.
 */
function slaask_clear_js_cache() {
  $path = 'public://slaask_js';

  if (file_prepare_directory($path)) {
    file_scan_directory($path, '/.*/', ['callback' => 'file_unmanaged_delete_recursive']);
    drupal_rmdir($path);

    // Change query-strings on css/js files to enforce reload for all users.
    _drupal_flush_css_js();

    \Drupal::logger('slaask')->info('Local cache has been purged.');
  }
}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc