diff --git a/frontend/cphp/class.templater.php b/frontend/cphp/class.templater.php index 1dacd86..b3d816d 100644 --- a/frontend/cphp/class.templater.php +++ b/frontend/cphp/class.templater.php @@ -82,101 +82,155 @@ class Templater { if(!is_null($this->tpl)) { - $this->tpl_rendered = preg_replace_callback("/<%foreach ([a-z0-9_-]+) in ([a-z0-9_-]+)>(.*?)<%\/foreach>/si", function($matches) use($strings) { - $variable_name = $matches[1]; - $array_name = $matches[2]; - $template = $matches[3]; - $returnvalue = ""; - - if(isset($strings[$array_name])) + $this->tpl_rendered = $this->ParseForEach($this->tpl_rendered, $strings); + $this->tpl_rendered = $this->ParseIf($this->tpl_rendered, $strings); + + preg_match_all("/<%\?([a-zA-Z0-9_-]+)>/", $this->tpl_rendered, $strlist); + foreach($strlist[1] as $str) + { + if(isset($strings[$str])) + { + $this->tpl_rendered = str_replace("<%?{$str}>", $strings[$str], $this->tpl_rendered); + } + } + } + else + { + Throw new Exception("No template loaded."); + } + } + + public function ParseForEach($source, $data) + { + $templater = $this; + + return preg_replace_callback("/<%foreach ([a-z0-9_-]+) in ([a-z0-9_-]+)>(.*?)<%\/foreach>/si", function($matches) use($data, $templater) { + $variable_name = $matches[1]; + $array_name = $matches[2]; + $template = $matches[3]; + $returnvalue = ""; + + if(isset($data[$array_name])) + { + foreach($data[$array_name] as $item) { - foreach($strings[$array_name] as $item) + $rendered = $template; + + $rendered = $templater->ParseIf($rendered, $data, $item, $variable_name); + + foreach($item as $key => $value) { - $rendered = $template; - - foreach($item as $key => $value) - { - $rendered = str_replace("<%?{$variable_name}[{$key}]>", $value, $rendered); - } - - $returnvalue .= $rendered; + $rendered = str_replace("<%?{$variable_name}[{$key}]>", $value, $rendered); } - return $returnvalue; + $returnvalue .= $rendered; } - return false; - }, $this->tpl_rendered); + return $returnvalue; + } - $this->tpl_rendered = preg_replace_callback("/<%if ([a-z0-9_-]+) (=|==|>|<|>=|<=|!=) ([^>]+)>(.*?)<%\/if>/si", function($matches) use($strings) { - $variable_name = $matches[1]; - $operator = $matches[2]; - $value = $matches[3]; - $template = $matches[4]; - - if(isset($strings[$variable_name])) + return false; + }, $source); + } + + public function ParseIf($source, $data, $context = null, $identifier = "") + { + return preg_replace_callback("/<%if ([][a-z0-9_-]+) (=|==|>|<|>=|<=|!=) ([^>]+)>(.*?)<%\/if>/si", function($matches) use($data, $context, $identifier) { + $variable_name = $matches[1]; + $operator = $matches[2]; + $value = $matches[3]; + $template = $matches[4]; + + if(!empty($identifier)) + { + if(preg_match("/{$identifier}\[([a-z0-9_-]+)\]/i", $variable_name, $submatches)) { - $variable = $strings[$variable_name]; + // Local variable. + $name = $submatches[1]; - if($variable == "true") { $variable = true; } - if($variable == "false") { $variable = false; } - if(is_numeric($variable)) { $variable = (int)$variable; } - if($value == "true") { $value = true; } - if($value == "false") { $value = false; } - if(is_numeric($value)) { $value = (int)$value; } - - switch($operator) + if(isset($context[$name])) { - case "=": - case "==": - $display = ($variable == $value); - break; - case ">": - $display = ($variable > $value); - break; - case "<": - $display = ($variable < $value); - break; - case ">=": - $display = ($variable >= $value); - break; - case "<=": - $display = ($variable <= $value); - break; - case "!=": - $display = ($variable != $value); - break; - default: - return false; - break; + $variable = $context[$name]; } - - if($display === true) + else + { + return false; + } + } + elseif(preg_match("/[a-z0-9_-]+\[[a-z0-9_-]+\]/i", $variable_name)) + { + // Not the right scope. + return false; + } + else + { + // Global variable. + if(isset($data[$variable_name])) { - return $template; + $variable = $data[$variable_name]; } else { - return ""; + return false; } } - - return false; - }, $this->tpl_rendered); - - preg_match_all("/<%\?([a-zA-Z0-9_-]+)>/", $this->tpl_rendered, $strlist); - foreach($strlist[1] as $str) + } + else { - if(isset($strings[$str])) + if(isset($data[$variable_name])) { - $this->tpl_rendered = str_replace("<%?{$str}>", $strings[$str], $this->tpl_rendered); + $variable = $data[$variable_name]; + } + else + { + return false; } } - } - else - { - Throw new Exception("No template loaded."); - } + + if($variable == "true") { $variable = true; } + if($variable == "false") { $variable = false; } + if(is_numeric($variable)) { $variable = (int)$variable; } + if($value == "true") { $value = true; } + if($value == "false") { $value = false; } + if(is_numeric($value)) { $value = (int)$value; } + + switch($operator) + { + case "=": + case "==": + $display = ($variable == $value); + break; + case ">": + $display = ($variable > $value); + break; + case "<": + $display = ($variable < $value); + break; + case ">=": + $display = ($variable >= $value); + break; + case "<=": + $display = ($variable <= $value); + break; + case "!=": + $display = ($variable != $value); + break; + default: + return false; + break; + } + + if($display === true) + { + return $template; + } + else + { + return ""; + } + + return false; + }, $source); } public function Render() diff --git a/frontend/templates/list.tpl b/frontend/templates/list.tpl index c7a80d2..4456689 100644 --- a/frontend/templates/list.tpl +++ b/frontend/templates/list.tpl @@ -11,7 +11,17 @@ <%foreach container in containers>