diff --git a/include/class.variable.php b/include/class.variable.php index a6dd7f0f35ec4de2db8ad33130d1404d6823a77e..12b98bb416577654fac9274e39c04ea87510f871 100644 --- a/include/class.variable.php +++ b/include/class.variable.php @@ -42,33 +42,45 @@ class VariableReplacer { function getErrors() { return $this->errors; } - + function getObj($tag) { return @$this->objects[$tag]; } - function assign($tag, $val) { + function assign($var, $val='') { - if($val && is_object($val)) - $this->objects[$tag] = $val; - else - $this->variables[$tag] = $val; + if($val && is_object($val)) { + $this->objects[$var] = $val; + } elseif($var && is_array($var)) { + foreach($var as $k => $v) + $this->variables[$k] = $v; //NOT calling assign to force one dimentional array. + } elseif($var) { + $this->variables[$var] = $val; + } } function getVar($obj, $var) { + if(!$obj) return ""; + if(!$var && is_callable(array($obj, 'asVar'))) return call_user_func(array($obj, 'asVar')); - if($var && is_callable(array($this, 'get'.ucfirst($var)))) - return call_user_func(array($this, 'get'.ucfirst($var))); + list($v, $part) = explode('.', $var, 2); + if($v && is_callable(array($obj, 'get'.ucfirst($v)))) { + $rv = call_user_func(array($obj, 'get'.ucfirst($v))); + if(!$rv || !is_object($rv)) + return $rv; + return $this->getVar($rv, $part); + } + if(!$var || !is_callable(array($obj, 'getVar'))) - return null; + return ""; $parts = explode('.', $var); if(($rv = call_user_func(array($obj, 'getVar'), $parts[0]))===false) - return null; + return ""; if(!is_object($rv)) return $rv; @@ -89,16 +101,16 @@ class VariableReplacer { function _resolveVar($var) { //Variable already memoized? - if($var && @$this->variables[$var]) + if($var && @isset($this->variables[$var])) return $this->variables[$var]; $parts = explode('.', $var, 2); - if(!$parts || !($obj=$this->getObj($parts[0]))) { - $this->setError('Unknown obj for "'.$var.'" tag '); - return null; - } + if($parts && ($obj=$this->getObj($parts[0]))) + return $this->getVar($obj, $parts[1]); - return $this->getVar($obj, $parts[1]); + //Unknown object or variable - leavig it alone. + $this->setError('Unknown obj for "'.$var.'" tag '); + return false; } function _parse($text) { @@ -109,7 +121,9 @@ class VariableReplacer { $vars = array(); foreach($result[0] as $k => $v) { - if(!@$vars[$v] && ($val=$this->_resolveVar($result[1][$k]))) + if(isset($vars[$v])) continue; + $val=$this->_resolveVar($result[1][$k]); + if($val!==false) $vars[$v] = $val; }