crmScope - Move logic to CRM_Core_Smarty
authorTim Otten <totten@civicrm.org>
Thu, 10 Jul 2014 03:10:35 +0000 (20:10 -0700)
committerTim Otten <totten@civicrm.org>
Thu, 10 Jul 2014 03:10:35 +0000 (20:10 -0700)
Currently, you can enter/exit scopes with Smarty tags. This patch allows you
to also enter/exit scopes using PHP.

CRM/Core/Smarty.php
CRM/Core/Smarty/plugins/block.crmScope.php

index a29d2e231f238c616233fb98e5ce4a991f37c9da..9396326f3c299093270ffacfb00f7bc8e1e0024a 100644 (file)
@@ -73,6 +73,11 @@ class CRM_Core_Smarty extends Smarty {
    */
   static private $_singleton = NULL;
 
+  /**
+   * @var array (string $name => mixed $value) a list of variables ot save temporarily
+   */
+  private $backupFrames = array();
+
   /**
    * class constructor
    *
@@ -245,5 +250,56 @@ class CRM_Core_Smarty extends Smarty {
     }
 
   }
+
+  /**
+   * Temporarily assign a list of variables.
+   *
+   * @code
+   * $smarty->pushScope(array(
+   *   'first_name' => 'Alice',
+   *   'last_name' => 'roberts',
+   * ));
+   * $html = $smarty->fetch('view-contact.tpl');
+   * $smarty->popScope();
+   * @endcode
+   *
+   * @param array $vars (string $name => mixed $value)
+   * @return CRM_Core_Smarty
+   * @see popScope
+   */
+  public function pushScope($vars) {
+    $oldVars = $this->get_template_vars();
+    $backupFrame = array();
+    foreach ($vars as $key => $value) {
+      $backupFrame[$key] = isset($oldVars[$key]) ? $oldVars[$key] : NULL;
+    }
+    $this->backupFrames[] = $backupFrame;
+
+    $this->assignAll($vars);
+
+    return $this;
+  }
+
+  /**
+   * Remove any values that were previously pushed.
+   *
+   * @return CRM_Core_Smarty
+   * @see pushScope
+   */
+  public function popScope() {
+    $this->assignAll(array_pop($this->backupFrames));
+    return $this;
+  }
+
+  /**
+   * @param array $vars (string $name => mixed $value)
+   * @return CRM_Core_Smarty
+   */
+  public function assignAll($vars) {
+    foreach ($vars as $key => $value) {
+      $this->assign($key, $value);
+    }
+    return $this;
+  }
 }
 
index b37050b326d95867975dce14fff6eddc014c0e57..4dc15b8e9c55dc347ddfe69c10a9323bf923afbc 100644 (file)
  * @return string
  */
 function smarty_block_crmScope($params, $content, &$smarty, &$repeat) {
-  // A list of variables/values to save temporarily
-  static $backupFrames = array();
+  /** @var CRM_Core_Smarty $smarty */
 
   if ($repeat) {
     // open crmScope
-    $vars = $smarty->get_template_vars();
-    $backupFrame = array();
-    foreach ($params as $key => $value) {
-      $backupFrame[$key] = isset($vars[$key]) ? $vars[$key] : NULL;
-    }
-    $backupFrames[] = $backupFrame;
-    _smarty_block_crmScope_applyFrame($smarty, $params);
+    $smarty->pushScope($params);
   }
   else {
     // close crmScope
-    _smarty_block_crmScope_applyFrame($smarty, array_pop($backupFrames));
+    $smarty->popScope();
   }
 
   return $content;
 }
-
-/**
- * @param $smarty
- * @param $frame
- */
-function _smarty_block_crmScope_applyFrame(&$smarty, $frame) {
-  foreach ($frame as $key => $value) {
-    $smarty->assign($key, $value);
-  }
-}