CRM-14949 - Switch dynamic js to a file instead of a callback
authorColeman Watts <coleman@civicrm.org>
Wed, 9 Jul 2014 16:26:13 +0000 (17:26 +0100)
committerColeman Watts <coleman@civicrm.org>
Wed, 9 Jul 2014 20:17:24 +0000 (21:17 +0100)
CRM/Admin/Page/AJAX.php
CRM/Core/Page/AJAX.php
CRM/Core/Resources.php
CRM/Core/xml/Menu/Misc.xml
CRM/Utils/File.php

index 844f61441770f59d4c385f3fd3ed7af8ea209f12..68b71b1a31d01295c27d70132a053488f6a7c96f 100644 (file)
@@ -45,7 +45,13 @@ class CRM_Admin_Page_AJAX {
   static function getNavigationMenu() {
     $contactID = CRM_Core_Session::singleton()->get('userID');
     if ($contactID) {
-      CRM_Core_Page_AJAX::returnDynamicJS('CRM/common/navigation.js.tpl', array(
+      // Set headers to encourage browsers to cache for a long time
+      $year = 60*60*24*364;
+      header('Expires: '.gmdate('D, d M Y H:i:s \G\M\T', time() + $year));
+      header('Content-Type:    application/javascript');
+      header("Cache-Control: max-age=$year, public");
+
+      print CRM_Core_Page_AJAX::returnDynamicJS('CRM/common/navigation.js.tpl', array(
         'navigation' => CRM_Core_BAO_Navigation::createNavigation($contactID),
       ));
     }
index dbbd257cb0f72b969e1b02de9f120916ceb28ee8..4de7604307f0fb3c8c0c21fb72980722a8b77188 100644 (file)
@@ -205,19 +205,12 @@ class CRM_Core_Page_AJAX {
    * @param array $vars - template variables
    */
   static function returnDynamicJS($tplFile, $vars = array()) {
-    // Set headers to encourage browsers to cache for a long time
-    $year = 60*60*24*364;
-    header('Expires: '.gmdate('D, d M Y H:i:s \G\M\T', time() + $year));
-    header('Content-Type:      application/javascript');
-    header("Cache-Control: max-age=$year, public");
-
     $smarty = CRM_Core_Smarty::singleton();
     $vars += array('timeGenerated' => date('d M Y H:i:s'));
     foreach ($vars as $name => $val) {
       $smarty->assign($name, $val);
     }
-    print $smarty->fetch($tplFile);
-    CRM_Utils_System::civiExit();
+    return $smarty->fetch($tplFile);
   }
 
   /**
index 2ccf22d7349e5b9a5e03dc86d76dab30b7795cad..cb6381684a4563ae9c0b5e39dbd036786f4a9747 100644 (file)
@@ -468,7 +468,7 @@ class CRM_Core_Resources {
       }
 
       // Dynamic localization script
-      $this->addScriptUrl(CRM_Utils_System::url('civicrm/ajax/localizationjs/' . $config->lcMessages), $jsWeight++, $region);
+      $this->addScriptUrl($this->addLocalizationJs(), $jsWeight++, $region);
 
       // Add global settings
       $settings = array('config' => array(
@@ -547,9 +547,22 @@ class CRM_Core_Resources {
   }
 
   /**
-   * Callback to add dymanic script for localizing js widgets
+   * Add dynamic l10n js
    */
-  static function outputLocalizationJS() {
+  private function addLocalizationJs() {
+    $config = CRM_Core_Config::singleton();
+    $fileName = 'l10n-' . $config->lcMessages . '.js';
+    if (!is_file(CRM_Utils_File::dynamicResourcePath($fileName))) {
+      $this->createLocalizationJs($fileName);
+    }
+    // Dynamic localization script
+    return CRM_Utils_File::dynamicResourceUrl($fileName);
+  }
+
+  /**
+   * Create dymanic script for localizing js widgets
+   */
+  private function createLocalizationJs($fileName) {
     $config = CRM_Core_Config::singleton();
     $vars = array(
       'moneyFormat' => json_encode(CRM_Utils_Money::format(1234.56)),
@@ -557,7 +570,7 @@ class CRM_Core_Resources {
       'otherSearch' => json_encode(ts('Enter search term...')),
       'contactCreate' => CRM_Core_BAO_UFGroup::getCreateLinks(),
     );
-    CRM_Core_Page_AJAX::returnDynamicJS('CRM/common/localization.js.tpl', $vars);
+    CRM_Utils_File::addDynamicResource($fileName, CRM_Core_Page_AJAX::returnDynamicJS('CRM/common/localization.js.tpl', $vars));
   }
 
   /**
index 020ff717f5c8c6a366563d2e497f84975c1735f8..e1f4a1d11d43694c01890bdc8514851933ac1a95 100644 (file)
     <page_callback>CRM_Core_Page_Angular</page_callback>
     <access_arguments>access CiviCRM</access_arguments>
   </item>
-  <item>
-    <path>civicrm/ajax/localizationjs</path>
-    <page_callback>CRM_Core_Resources::outputLocalizationJS</page_callback>
-  </item>
 </menu>
index 724f269bc13eb6f55849e8a767a884c1594f67fc..c459fa0cc8a655211807c391751c3801d37e96d2 100644 (file)
@@ -687,5 +687,52 @@ HTACCESS;
     }
     return TRUE;
   }
+
+  /**
+   * Create a static file (e.g. css or js) in the dynamic resource directory
+   * Note: if the file already exists it will be overwritten
+   * @param string $fileName
+   * @param string $contents
+   */
+  static function addDynamicResource($fileName, $contents) {
+    // First ensure the directory exists
+    $path = self::baseFilePath() . 'dynamic';
+    if (!is_dir($path)) {
+      self::createDir($path);
+      self::restrictBrowsing($path);
+    }
+    file_put_contents($path . DIRECTORY_SEPARATOR . $fileName, $contents);
+  }
+
+  /**
+   * Get the path of a dynamic resource file
+   * @param string $fileName
+   * @return string
+   */
+  static function dynamicResourcePath($fileName) {
+    return self::baseFilePath() . 'dynamic' . DIRECTORY_SEPARATOR . $fileName;
+  }
+
+  /**
+   * Get the URL of a dynamic resource file
+   * @param string $fileName
+   * @return string
+   */
+  static function dynamicResourceUrl($fileName) {
+    $config = CRM_Core_Config::singleton();
+    return str_replace('persist/contribute', 'dynamic', $config->imageUploadURL) . $fileName;
+  }
+
+  /**
+   * Flush the dynamic resource directory
+   */
+  static function flushDynamicResources() {
+    $files = glob(self::dynamicResourcePath('*'));
+    foreach ($files ? $files : array() as $file) {
+      if (is_file($file)) {
+        unlink($file);
+      }
+    }
+  }
 }