summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--system/core/Loader.php42
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)