mirror of
				https://github.com/smarty-php/smarty.git
				synced 2025-10-31 04:11:37 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			116 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| /**
 | |
|  * Runtime Extension updateScope
 | |
|  *
 | |
|  * @package    Smarty
 | |
|  * @subpackage PluginsInternal
 | |
|  * @author     Uwe Tews
 | |
|  **/
 | |
| class Smarty_Internal_Runtime_UpdateScope
 | |
| {
 | |
|     /**
 | |
|      * Update new assigned template or config variable in other effected scopes
 | |
|      *
 | |
|      * @param Smarty_Internal_Template $tpl      data object
 | |
|      * @param string|null              $varName  variable name
 | |
|      * @param int                      $tagScope tag scope to which bubble up variable value
 | |
|      */
 | |
|     public function _updateScope(Smarty_Internal_Template $tpl, $varName, $tagScope = 0)
 | |
|     {
 | |
|         if ($tagScope) {
 | |
|             $this->_updateVarStack($tpl, $varName);
 | |
|             $tagScope = $tagScope & ~Smarty::SCOPE_LOCAL;
 | |
|             if (!$tpl->scope && !$tagScope) {
 | |
|                 return;
 | |
|             }
 | |
|         }
 | |
|         $mergedScope = $tagScope | $tpl->scope;
 | |
|         if ($mergedScope) {
 | |
|             if ($mergedScope & Smarty::SCOPE_GLOBAL && $varName) {
 | |
|                 Smarty::$global_tpl_vars[ $varName ] = $tpl->tpl_vars[ $varName ];
 | |
|             }
 | |
|             // update scopes
 | |
|             foreach ($this->_getAffectedScopes($tpl, $mergedScope) as $ptr) {
 | |
|                 $this->_updateVariableInOtherScope($ptr->tpl_vars, $tpl, $varName);
 | |
|                 if ($tagScope && $ptr->_isTplObj() && isset($tpl->_cache[ 'varStack' ])) {
 | |
|                     $this->_updateVarStack($ptr, $varName);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get array of objects which needs to be updated  by given scope value
 | |
|      *
 | |
|      * @param Smarty_Internal_Template $tpl
 | |
|      * @param int                      $mergedScope merged tag and template scope to which bubble up variable value
 | |
|      *
 | |
|      * @return array
 | |
|      */
 | |
|     public function _getAffectedScopes(Smarty_Internal_Template $tpl, $mergedScope)
 | |
|     {
 | |
|         $_stack = array();
 | |
|         $ptr = $tpl->parent;
 | |
|         if ($mergedScope && isset($ptr) && $ptr->_isTplObj()) {
 | |
|             $_stack[] = $ptr;
 | |
|             $mergedScope = $mergedScope & ~Smarty::SCOPE_PARENT;
 | |
|             if (!$mergedScope) {
 | |
|                 // only parent was set, we are done
 | |
|                 return $_stack;
 | |
|             }
 | |
|             $ptr = $ptr->parent;
 | |
|         }
 | |
|         while (isset($ptr) && $ptr->_isTplObj()) {
 | |
|             $_stack[] = $ptr;
 | |
|             $ptr = $ptr->parent;
 | |
|         }
 | |
|         if ($mergedScope & Smarty::SCOPE_SMARTY) {
 | |
|             if (isset($tpl->smarty)) {
 | |
|                 $_stack[] = $tpl->smarty;
 | |
|             }
 | |
|         } elseif ($mergedScope & Smarty::SCOPE_ROOT) {
 | |
|             while (isset($ptr)) {
 | |
|                 if (!$ptr->_isTplObj()) {
 | |
|                     $_stack[] = $ptr;
 | |
|                     break;
 | |
|                 }
 | |
|                 $ptr = $ptr->parent;
 | |
|             }
 | |
|         }
 | |
|         return $_stack;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Update variable in other scope
 | |
|      *
 | |
|      * @param array                     $tpl_vars template variable array
 | |
|      * @param \Smarty_Internal_Template $from
 | |
|      * @param string                    $varName  variable name
 | |
|      */
 | |
|     public function _updateVariableInOtherScope(&$tpl_vars, Smarty_Internal_Template $from, $varName)
 | |
|     {
 | |
|         if (!isset($tpl_vars[ $varName ])) {
 | |
|             $tpl_vars[ $varName ] = clone $from->tpl_vars[ $varName ];
 | |
|         } else {
 | |
|             $tpl_vars[ $varName ] = clone $tpl_vars[ $varName ];
 | |
|             $tpl_vars[ $varName ]->value = $from->tpl_vars[ $varName ]->value;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Update variable in template local variable stack
 | |
|      *
 | |
|      * @param \Smarty_Internal_Template $tpl
 | |
|      * @param string|null               $varName variable name or null for config variables
 | |
|      */
 | |
|     public function _updateVarStack(Smarty_Internal_Template $tpl, $varName)
 | |
|     {
 | |
|         $i = 0;
 | |
|         while (isset($tpl->_cache[ 'varStack' ][ $i ])) {
 | |
|             $this->_updateVariableInOtherScope($tpl->_cache[ 'varStack' ][ $i ][ 'tpl' ], $tpl, $varName);
 | |
|             $i++;
 | |
|         }
 | |
|     }
 | |
| }
 |