CRM-16373 - Path, URL Admin - Explain variables
authorTim Otten <totten@civicrm.org>
Thu, 17 Sep 2015 07:51:02 +0000 (00:51 -0700)
committerTim Otten <totten@civicrm.org>
Thu, 17 Sep 2015 22:49:33 +0000 (15:49 -0700)
CRM/Core/Resources.php
CRM/Core/Smarty/plugins/function.crmResPath.php [new file with mode: 0644]
Civi/Core/Paths.php
templates/CRM/Admin/Form/Setting/Path.hlp [new file with mode: 0644]
templates/CRM/Admin/Form/Setting/Path.tpl
templates/CRM/Admin/Form/Setting/Url.hlp
templates/CRM/Admin/Form/Setting/Url.tpl

index f2bb53a18f8dd22f447867241f4b255b0754b4e6..11fd31f002cf6554d823b5231b9e7571a4011c83 100644 (file)
@@ -98,6 +98,11 @@ class CRM_Core_Resources {
    */
   public $ajaxPopupsEnabled;
 
+  /**
+   * @var \Civi\Core\Paths
+   */
+  protected $paths;
+
   /**
    * Get or set the single instance of CRM_Core_Resources.
    *
@@ -141,6 +146,7 @@ class CRM_Core_Resources {
       $this->resetCacheCode();
     }
     $this->ajaxPopupsEnabled = (bool) Civi::settings()->get('ajaxPopupsEnabled');
+    $this->paths = Civi::paths();
   }
 
   /**
@@ -465,10 +471,13 @@ class CRM_Core_Resources {
    */
   public function getPath($ext, $file = NULL) {
     // TODO consider caching results
+    $base = $this->paths->hasVariable($ext)
+      ? rtrim($this->paths->getVariable($ext, 'path'), '/')
+      : $this->extMapper->keyToBasePath($ext);
     if ($file === NULL) {
-      return $this->extMapper->keyToBasePath($ext);
+      return $base;
     }
-    $path = $this->extMapper->keyToBasePath($ext) . '/' . $file;
+    $path = $base . '/' . $file;
     if (is_file($path)) {
       return $path;
     }
@@ -494,7 +503,10 @@ class CRM_Core_Resources {
       $file .= '?r=' . $this->getCacheCode();
     }
     // TODO consider caching results
-    return $this->extMapper->keyToUrl($ext) . '/' . $file;
+    $base = $this->paths->hasVariable($ext)
+      ? $this->paths->getVariable($ext, 'url')
+      : ($this->extMapper->keyToUrl($ext) . '/');
+    return $base . $file;
   }
 
   /**
diff --git a/CRM/Core/Smarty/plugins/function.crmResPath.php b/CRM/Core/Smarty/plugins/function.crmResPath.php
new file mode 100644 (file)
index 0000000..257797a
--- /dev/null
@@ -0,0 +1,56 @@
+<?php
+/*
+ +--------------------------------------------------------------------+
+ | CiviCRM version 4.7                                                |
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC (c) 2004-2015                                |
+ +--------------------------------------------------------------------+
+ | This file is a part of CiviCRM.                                    |
+ |                                                                    |
+ | CiviCRM is free software; you can copy, modify, and distribute it  |
+ | under the terms of the GNU Affero General Public License           |
+ | Version 3, 19 November 2007 and the CiviCRM Licensing Exception.   |
+ |                                                                    |
+ | CiviCRM is distributed in the hope that it will be useful, but     |
+ | WITHOUT ANY WARRANTY; without even the implied warranty of         |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.               |
+ | See the GNU Affero General Public License for more details.        |
+ |                                                                    |
+ | You should have received a copy of the GNU Affero General Public   |
+ | License and the CiviCRM Licensing Exception along                  |
+ | with this program; if not, contact CiviCRM LLC                     |
+ | at info[AT]civicrm[DOT]org. If you have questions about the        |
+ | GNU Affero General Public License or the licensing of CiviCRM,     |
+ | see the CiviCRM license FAQ at http://civicrm.org/licensing        |
+ +--------------------------------------------------------------------+
+ */
+
+/**
+ *
+ * @package CRM
+ * @copyright CiviCRM LLC
+ * $Id$
+ *
+ */
+
+/**
+ * Determine the path of a resource file
+ *
+ * @param array $params
+ *   Array with keys:
+ *   - ext: string, extension name. see CRM_Core_Resources::getPath
+ *   - file: string, relative file path. see CRM_Core_Resources::getPath
+ * @param CRM_Core_Smarty $smarty
+ *
+ * @return string
+ */
+function smarty_function_crmResPath($params, &$smarty) {
+  $res = CRM_Core_Resources::singleton();
+  if (!array_key_exists('ext', $params)) {
+    $params['ext'] = 'civicrm';
+  }
+  if (!array_key_exists('file', $params)) {
+    $params['file'] = NULL;
+  }
+  return $res->getPath($params['ext'], $params['file']);
+}
index 230ea24254f9851585119333048e4df35e5025f9..8ec074f3041966c30490ed9d54022c2f2397d6e7 100644 (file)
@@ -22,15 +22,12 @@ class Paths {
    * @var array
    *   Array(string $name => array(url => $, path => $)).
    */
-  private $containers = array();
+  private $variables = array();
 
-  protected $containerFactory = array();
+  private $variableFactory = array();
 
   public function __construct() {
     $this
-      //->register('civicrm', function () {
-      //  return \CRM_Core_Config::singleton()->userSystem->getCiviSourceStorage();
-      //})
       ->register('civicrm.root', function () {
         return \CRM_Core_Config::singleton()->userSystem->getCiviSourceStorage();
       })
@@ -56,7 +53,7 @@ class Paths {
    * Register a new URL/file path mapping.
    *
    * @param string $name
-   *   The name of the container.
+   *   The name of the variable.
    * @param callable $factory
    *   Function which returns an array with keys:
    *    - path: string.
@@ -64,28 +61,39 @@ class Paths {
    * @return $this
    */
   public function register($name, $factory) {
-    $this->containerFactory[$name] = $factory;
+    $this->variableFactory[$name] = $factory;
     return $this;
   }
 
-  protected function getContainerAttr($name, $attr) {
-    if (!isset($this->containers[$name])) {
-      $this->containers[$name] = call_user_func($this->containerFactory[$name]);
+  /**
+   * @param string $name
+   *   Ex: 'civicrm.root'.
+   * @param string $attr
+   *   Ex: 'url', 'path'.
+   * @return mixed
+   */
+  public function getVariable($name, $attr) {
+    if (!isset($this->variables[$name])) {
+      $this->variables[$name] = call_user_func($this->variableFactory[$name]);
     }
-    if (!isset($this->containers[$name][$attr])) {
+    if (!isset($this->variables[$name][$attr])) {
       throw new \RuntimeException("Cannot resolve path using \"$name.$attr\"");
     }
-    return $this->containers[$name][$attr];
+    return $this->variables[$name][$attr];
+  }
+
+  public function hasVariable($name) {
+    return isset($this->variableFactory[$name]);
   }
 
   /**
    * Determine the absolute path to a file, given that the file is most likely
-   * in a given particular container.
+   * in a given particular variable.
    *
    * @param string $value
-   *   The file path (which is probably relative to $container).
-   *   Use "." to reference to container root.
-   *   Values may explicitly specify the a container, e.g. "[civicrm.files]/upload".
+   *   The file path.
+   *   Use "." to reference to default file root.
+   *   Values may begin with a variable, e.g. "[civicrm.files]/upload".
    * @return mixed|string
    */
   public function getPath($value) {
@@ -100,16 +108,14 @@ class Paths {
     if ($value === '.') {
       $value = '';
     }
-    return \CRM_Utils_File::absoluteDirectory($value, $this->getContainerAttr($defaultContainer, 'path'));
+    return \CRM_Utils_File::absoluteDirectory($value, $this->getVariable($defaultContainer, 'path'));
   }
 
   /**
-   * Determine the absolute URL to a file, given that the file is most likely
-   * in a given particular container.
+   * Determine the URL to a file.
    *
    * @param string $value
-   *   The file path (which is probably relative to $container).
-   *   Values may explicitly specify the a container, e.g. "[civicrm.files]/upload".
+   *   The file path. The path may begin with a variable, e.g. "[civicrm.files]/upload".
    * @param string $preferFormat
    *   The preferred format ('absolute', 'relative').
    *   The result data may not meet the preference -- if the setting
@@ -136,7 +142,7 @@ class Paths {
       return $value;
     }
 
-    $value = $this->getContainerAttr($defaultContainer, 'url') . $value;
+    $value = $this->getVariable($defaultContainer, 'url') . $value;
 
     if ($preferFormat === 'relative') {
       $parsed = parse_url($value);
diff --git a/templates/CRM/Admin/Form/Setting/Path.hlp b/templates/CRM/Admin/Form/Setting/Path.hlp
new file mode 100644 (file)
index 0000000..a79eeea
--- /dev/null
@@ -0,0 +1,22 @@
+{htxt id='id-path_vars'}
+{ts}Path Variables{/ts}
+  <table>
+    <tbody>
+    <tr>
+      <td><tt>[cms.root]</tt></td>
+      <td><tt>{crmResPath ext='cms.root'}</tt></td>
+    </tr>
+    <tr>
+      <td><tt>[civicrm.root]</tt></td>
+      <td><tt>{crmResPath ext='civicrm.root'}</tt></td>
+    </tr>
+    <tr>
+      <td><tt>[civicrm.files]</tt></td>
+      <td><tt>{crmResPath ext='civicrm.files'}</tt></td>
+    </tr>
+    </tbody>
+  </table>
+  <p>
+    {ts}These variables are computed automatically using <tt>civicrm.settings.php</tt> and its options, such as <tt>CIVICRM_TEMPLATE_COMPILEDIR</tt>.{/ts}
+  </p>
+{/htxt}
index 9549f692ddbd753d8de893c06dce4de28b23dfe6..185404c2d4cf9d7b0cb8209c60ee82f2b81ead8a 100644 (file)
  +--------------------------------------------------------------------+
 *}
 <div class="crm-block crm-form-block crm-path-form-block">
-<div id="help">
-    {ts}Default values will be supplied for these upload directories the first time you access CiviCRM - based on the CIVICRM_TEMPLATE_COMPILEDIR specified in civicrm.settings.php. If you need to modify the defaults, make sure that your web server has write access to the directories.{/ts}
-</div>
+  <div id="help">
+    <p>
+      {ts}You may configure these upload directories using absolute paths or path variables.{/ts}
+      {help id='id-path_vars'}
+    </p>
+    <p>
+      {ts}If you modify the defaults, make sure that your web server has write access to the directories.{/ts}
+    </p>
+
+  </div>
  <div class="crm-submit-buttons">{include file="CRM/common/formButtons.tpl" location="top"}</div>
            <table class="form-layout">
             <tr class="crm-path-form-block-uploadDir">
index 03430f1738c0b02db6ef81e0634b13833fbaeba6..d31e45f1297b7d8197f980a8fe564530cd5e85b2 100644 (file)
 {htxt id='id-css_url'}
 <p>{ts}You can modify the look and feel of CiviCRM by adding your own stylesheet. For small to medium sized modifications, use your css file to override some of the styles in civicrm.css. Or if you need to make drastic changes, you can choose to disable civicrm.css completely.{/ts}</p>
 {/htxt}
+
+{htxt id='id-url_vars'}
+{ts}URL Variables{/ts}
+  <table>
+    <tbody>
+    <tr>
+      <td><tt>[cms.root]</tt></td>
+      <td><tt>{crmResURL ext='cms.root'}</tt></td>
+    </tr>
+    <tr>
+      <td><tt>[civicrm.root]</tt></td>
+      <td><tt>{crmResURL ext='civicrm.root'}</tt></td>
+    </tr>
+    <tr>
+      <td><tt>[civicrm.files]</tt></td>
+      <td><tt>{crmResURL ext='civicrm.files'}</tt></td>
+    </tr>
+    </tbody>
+  </table>
+  <p>
+    {ts}These variables are computed automatically using <tt>civicrm.settings.php</tt> and its options, such as <tt>CIVICRM_TEMPLATE_COMPILEDIR</tt>.{/ts}
+  </p>
+{/htxt}
index 5a524c093546077926e61de60fb683cbda89b1c9..96d331c004026d9cb4bf9ffff871f3cbe44fa66d 100644 (file)
 *}
 <div class="crm-block crm-form-block crm-url-form-block">
 <div id="help">
-    {ts}These settings define the URLs used to access CiviCRM resources (CSS files, Javascript files, images, etc.). Default values will be inserted the first time you access CiviCRM - based on the CIVICRM_UF_BASEURL specified in your installation's settings file (civicrm.settings.php).{/ts}
+  <p>
+    {ts}These settings define the URLs used to access CiviCRM resources (CSS files, Javascript files, images, etc.).{/ts}
+  </p>
+  <p>
+    {ts}You may configure these settings using absolute URLs or URL variables.{/ts}
+    {help id='id-url_vars'}
+  </p>
+
 </div>
 <div class="crm-submit-buttons">{include file="CRM/common/formButtons.tpl" location="top"}</div>
 <table class="form-layout">