You are here

class FileManager in Minify JS 8

Same name and namespace in other branches
  1. 8.2 src/Controller/FileManager.php \Drupal\minifyjs\Controller\FileManager

Controller routines for minifyjs routes.

Hierarchy

Expanded class hierarchy of FileManager

2 files declare their use of FileManager
minifyjs.drush.inc in ./minifyjs.drush.inc
MinifyJsCommands.php in src/Commands/MinifyJsCommands.php

File

src/Controller/FileManager.php, line 11

Namespace

Drupal\minifyjs\Controller
View source
class FileManager extends ControllerBase {

  /**
   * Minify a single file.
   *
   * @param stdClass $file
   *
   * @return \Symfony\Component\HttpFoundation\RedirectResponse
   *   Returns a redirect to the manage javascript page.
   */
  public function minify($file) {
    $result = minifyjs_minify_file($file, TRUE);
    if ($result === TRUE) {
      drupal_set_message(t('File was minified successfully.'));
    }
    else {
      drupal_set_message($result, 'error');
    }
    return $this
      ->redirect('minifyjs.manage');
  }

  /**
   * Remove the minified version of a single file (restore it).
   *
   * @param stdClass $file
   *
   * @return \Symfony\Component\HttpFoundation\RedirectResponse
   *   Returns a redirect to the manage javascript page.
   */
  public function restore($file) {
    $result = minifyjs_remove_minified_file($file, TRUE);
    if ($result === TRUE) {
      drupal_set_message(t('File was restored successfully.'));
    }
    else {
      drupal_set_message($result, 'error');
    }
    return $this
      ->redirect('minifyjs.manage');
  }

  /**
   * Scans the system for javascript.
   *
   * @param bool $drush
   *
   * @return \Symfony\Component\HttpFoundation\RedirectResponse
   *   Returns a redirect to the manage javascript page.
   */
  public function scan($drush = FALSE) {

    // Recursive scan of the entire doc root to find .js files. Include
    // minified files as well so they can be re-minified (comments removed).
    $directory = new \RecursiveDirectoryIterator(DRUPAL_ROOT);
    $iterator = new \RecursiveIteratorIterator($directory);
    $regex = new \RegexIterator($iterator, '/\\.js$/i');

    // Process files.
    $new_files = [];
    $old_files = [];
    $changed_files = [];
    $existing = minifyjs_load_all_files();
    $exclusions = \Drupal::config('minifyjs.config')
      ->get('exclusion_list');
    foreach ($regex as $info) {
      $new_absolute = $info
        ->getPathname();
      $new_relative = str_replace(DRUPAL_ROOT . '/', '', $new_absolute);

      // skip exclusions
      if (\Drupal::service('path.matcher')
        ->matchPath($new_relative, $exclusions)) {
        continue;
      }

      // Loop existing and see if it already exists from previous scans.
      $exists = FALSE;
      foreach ($existing as $file) {
        if ($file->uri == $new_relative) {

          // See if the size and modified time differ from the last time the scan
          // checked this file. If the file has changed (based on those two
          // pieces of data), mark the minified version for removal if a minified
          // version of the file exists.
          if (!empty($file->minified_uri)) {
            $size = filesize($new_absolute);
            $modified = filemtime($new_absolute);
            if ($size != $file->size || $modified != $file->modified) {
              $changed_files[$new_relative] = $file;
            }
          }
          $exists = TRUE;
          $old_files[$new_relative] = TRUE;
          break;
        }
      }

      // File not found in the existing array, so it's new.
      if (!$exists) {
        $new_files[$new_absolute] = TRUE;
      }
    }

    // Build a list of files that currently exist in the minifyjs_file table but
    // no longer exist in the file system. These files should be removed.
    foreach ($existing as $file) {
      if (!isset($old_files[$file->uri])) {
        $this
          ->remove_file($file->uri);
      }
    }

    // Remove changed files.
    foreach ($changed_files as $file_uri => $file) {
      $this
        ->remove_file($file->uri);
      $new_files[$file_uri] = TRUE;
      drupal_set_message(t('Original file %file has been modified and was restored.', [
        '%file' => $file_uri,
      ]));
    }

    // Add all new files to the database.
    foreach ($new_files as $file => $junk) {
      \Drupal::database()
        ->insert('minifyjs_file')
        ->fields(array(
        'uri' => str_replace(DRUPAL_ROOT . '/', '', $file),
        'size' => filesize($file),
        'modified' => filemtime($file),
      ))
        ->execute();
    }

    // Clear the cache so all of these new files will be picked up.
    \Drupal::cache()
      ->delete(MINIFYJS_CACHE_CID);
    $return = TRUE;
    if (!$drush) {
      $return = $this
        ->redirect('minifyjs.manage');
    }
    return $return;
  }

  /**
   * Helper function removes the file, the entry in the file_managed table and
   * the entry in the minifyjs_file.
   *
   * @param string $file_uri
   */
  private function remove_file($file_uri) {

    // Get the fid and minified uri of the file
    $query = \Drupal::database()
      ->select('minifyjs_file', 'm')
      ->fields('m', array(
      'fid',
      'minified_uri',
    ))
      ->condition('m.uri', $file_uri);

    // make sure that it exists
    if ($query
      ->countQuery()
      ->execute()
      ->fetchField() > 0) {
      $file = $query
        ->execute()
        ->fetchObject();

      // Handle the minified file, if applicable.
      if (!empty($file->minified_uri)) {

        // Get the fid of the minified file.
        $query = \Drupal::database()
          ->select('file_managed', 'f')
          ->fields('f', array(
          'fid',
        ))
          ->condition('f.uri', $file->minified_uri);
        if ($query
          ->countQuery()
          ->execute()
          ->fetchField() > 0) {
          $minified_file = $query
            ->execute()
            ->fetchObject();

          // Remove the file from the file_managed table
          $minified_file = File::load($minified_file->fid);
          $minified_file
            ->delete();
        }
      }

      // Remove the file from minifyjs_file table.
      \Drupal::database()
        ->delete('minifyjs_file')
        ->condition('fid', $file->fid)
        ->execute();
      return TRUE;
    }
  }

}

Members

Namesort descending Modifiers Type Description Overrides
ControllerBase::$configFactory protected property The configuration factory.
ControllerBase::$currentUser protected property The current user service. 1
ControllerBase::$entityFormBuilder protected property The entity form builder.
ControllerBase::$entityManager protected property The entity manager.
ControllerBase::$entityTypeManager protected property The entity type manager.
ControllerBase::$formBuilder protected property The form builder. 2
ControllerBase::$keyValue protected property The key-value storage. 1
ControllerBase::$languageManager protected property The language manager. 1
ControllerBase::$moduleHandler protected property The module handler. 2
ControllerBase::$stateService protected property The state service.
ControllerBase::cache protected function Returns the requested cache bin.
ControllerBase::config protected function Retrieves a configuration object.
ControllerBase::container private function Returns the service container.
ControllerBase::create public static function Instantiates a new instance of this class. Overrides ContainerInjectionInterface::create 40
ControllerBase::currentUser protected function Returns the current user. 1
ControllerBase::entityFormBuilder protected function Retrieves the entity form builder.
ControllerBase::entityManager Deprecated protected function Retrieves the entity manager service.
ControllerBase::entityTypeManager protected function Retrieves the entity type manager.
ControllerBase::formBuilder protected function Returns the form builder service. 2
ControllerBase::keyValue protected function Returns a key/value storage collection. 1
ControllerBase::languageManager protected function Returns the language manager service. 1
ControllerBase::moduleHandler protected function Returns the module handler. 2
ControllerBase::redirect protected function Returns a redirect response object for the specified route. Overrides UrlGeneratorTrait::redirect
ControllerBase::state protected function Returns the state storage service.
FileManager::minify public function Minify a single file.
FileManager::remove_file private function Helper function removes the file, the entry in the file_managed table and the entry in the minifyjs_file.
FileManager::restore public function Remove the minified version of a single file (restore it).
FileManager::scan public function Scans the system for javascript.
LinkGeneratorTrait::$linkGenerator protected property The link generator. 1
LinkGeneratorTrait::getLinkGenerator Deprecated protected function Returns the link generator.
LinkGeneratorTrait::l Deprecated protected function Renders a link to a route given a route name and its parameters.
LinkGeneratorTrait::setLinkGenerator Deprecated public function Sets the link generator service.
LoggerChannelTrait::$loggerFactory protected property The logger channel factory service.
LoggerChannelTrait::getLogger protected function Gets the logger for a specific channel.
LoggerChannelTrait::setLoggerFactory public function Injects the logger channel factory.
MessengerTrait::$messenger protected property The messenger. 29
MessengerTrait::messenger public function Gets the messenger. 29
MessengerTrait::setMessenger public function Sets the messenger.
RedirectDestinationTrait::$redirectDestination protected property The redirect destination service. 1
RedirectDestinationTrait::getDestinationArray protected function Prepares a 'destination' URL query parameter for use with \Drupal\Core\Url.
RedirectDestinationTrait::getRedirectDestination protected function Returns the redirect destination service.
RedirectDestinationTrait::setRedirectDestination public function Sets the redirect destination service.
StringTranslationTrait::$stringTranslation protected property The string translation service. 1
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.
UrlGeneratorTrait::$urlGenerator protected property The url generator.
UrlGeneratorTrait::getUrlGenerator Deprecated protected function Returns the URL generator service.
UrlGeneratorTrait::setUrlGenerator Deprecated public function Sets the URL generator service.
UrlGeneratorTrait::url Deprecated protected function Generates a URL or path for a specific route based on the given parameters.