diff options
-rw-r--r-- | system/core/Loader.php | 42 |
1 files changed, 27 insertions, 15 deletions
diff --git a/system/core/Loader.php b/system/core/Loader.php index 07e572950..18fba2b72 100644 --- a/system/core/Loader.php +++ b/system/core/Loader.php @@ -94,11 +94,11 @@ class CI_Loader { protected $_ci_cached_vars = array(); /** - * stack of variables for nested _ci_load calls + * Stack of variable arrays to provide nested _ci_load calls all variables from parent calls * * @var array */ - protected $_ci_vars_stack = array(); + protected $_ci_load_vars_stack = array(); /** * List of loaded classes @@ -945,26 +945,38 @@ class CI_Loader { * * You can either set variables using the dedicated $this->load->vars() * function or via the second parameter of this function. We'll merge - * the two types. Additionally we merge them with the last variables - * from the nested call stack so that views that are embedded within - * other views can have access to these variables. + * the two types so that loaded views and files have access to these + * variables. + * Additionally we want all subsequent nested _ci_load() calls embedded + * within the current file to 'inherit' all variables that are + * accessible to the current file. For this purpose we push the current + * variable configuration (_ci_vars) to the stack and remove it again + * after the file or view is completely loaded. Nested _ci_load() calls + * within the current file extend the stack with their variable + * configuration. */ - // init current _ci_vars + // Init current _ci_vars as current variable configuration if (!is_array($_ci_vars)) { $_ci_vars = []; } - // merge with global cached vars (first call) or last state from nested - // call stack (subsequent nested calls) - if (!empty($this->_ci_vars_stack)) { - $_ci_vars = array_merge(end($this->_ci_vars_stack), $_ci_vars); - } else if (!empty($this->_ci_cached_vars)) { + // Include the global cached vars into the current _ci_vars if needed + if (!empty($this->_ci_cached_vars)) { $_ci_vars = array_merge($this->_ci_cached_vars, $_ci_vars); } - // push current _ci_vars state to stack and extract it - array_push($this->_ci_vars_stack, $_ci_vars); + // Merge the last variable configuration from a parent _ci_load() + // call into the current _ci_vars + if (!empty($this->_ci_load_vars_stack)) { + $previous_variable_configuration = end($this->_ci_load_vars_stack); + $_ci_vars = array_merge($previous_variable_configuration, $_ci_vars); + } + + // Push the current _ci_vars to the stack + array_push($this->_ci_load_vars_stack, $_ci_vars); + + // Extract the current _ci_vars extract($_ci_vars); /** @@ -983,8 +995,8 @@ class CI_Loader { include($_ci_path); // include() vs include_once() allows for multiple views with the same name log_message('info', 'File loaded: '.$_ci_path); - // remove current _ci_vars state from stack - array_pop($this->_ci_vars_stack); + // Remove current _ci_vars from stack again + array_pop($this->_ci_load_vars_stack); // Return the file data if requested if ($_ci_return === TRUE) |