Encourage better scoping of js CRM vars with new addVars method
authorColeman Watts <coleman@civicrm.org>
Tue, 4 Nov 2014 16:09:05 +0000 (11:09 -0500)
committerColeman Watts <coleman@civicrm.org>
Tue, 18 Nov 2014 16:23:21 +0000 (11:23 -0500)
CRM/Core/Resources.php
tests/phpunit/CRM/Core/ResourcesTest.php

index dd9fdf805d56bf1911f1403a69f71bd3333af747..d1426b1de2c498d7aa45fc94d4148b8cc5c13c74 100644 (file)
@@ -210,16 +210,32 @@ class CRM_Core_Resources {
   }
 
   /**
-   * Add JavaScript variables to the global CRM object.
+   * Add JavaScript variables to CRM.vars
    *
    * Example:
    * From the server:
-   * CRM_Core_Resources::singleton()->addSetting(array('myNamespace' => array('foo' => 'bar')));
-   * From javascript:
-   * CRM.myNamespace.foo // "bar"
+   * CRM_Core_Resources::singleton()->addVars('myNamespace', array('foo' => 'bar'));
+   * Access var from javascript:
+   * CRM.vars.myNamespace.foo // "bar"
    *
    * @see http://wiki.civicrm.org/confluence/display/CRMDOC/Javascript+Reference
    *
+   * @param string $nameSpace - usually the name of your extension
+   * @param array $vars
+   * @return CRM_Core_Resources
+   */
+  public function addVars($nameSpace, $vars) {
+    $existing = CRM_Utils_Array::value($nameSpace, CRM_Utils_Array::value('vars', $this->settings), array());
+    $vars = $this->mergeSettings($existing, $vars);
+    $this->addSetting(array('vars' => array($nameSpace => $vars)));
+    return $this;
+  }
+
+  /**
+   * Add JavaScript variables to the root of the CRM object.
+   * This function is usually reserved for low-level system use.
+   * Extensions and components should generally use addVars instead.
+   *
    * @param $settings array
    * @return CRM_Core_Resources
    */
index d95dbc79dc231fa75ed8315cbd0777e34fcdd24b..f8782612f12e985865368999778cec73177e48e1 100644 (file)
@@ -127,6 +127,17 @@ class CRM_Core_ResourcesTest extends CiviUnitTestCase {
     $this->assertEquals($expected, $actual);
   }
 
+  function testAddVars() {
+    $this->res
+      ->addVars('food', array('fruit' => array('mine' => 'apple', 'ours' => 'banana')))
+      ->addVars('food', array('fruit' => array('mine' => 'new apple', 'yours' => 'orange')))
+    ;
+    $this->assertTreeEquals(
+      array('vars' => array('food' => array('fruit' => array('yours' => 'orange', 'mine' => 'new apple', 'ours' => 'banana')))),
+      $this->res->getSettings()
+    );
+  }
+
   function testAddSetting() {
     $this->res
       ->addSetting(array('fruit' => array('mine' => 'apple')))