diff options
| -rw-r--r-- | docu/language_definition.html | 8 | ||||
| -rw-r--r-- | ste.php | 23 | ||||
| -rw-r--r-- | tests/test_foreach/.gitignore | 3 | ||||
| -rw-r--r-- | tests/test_foreach/code.php | 9 | ||||
| -rw-r--r-- | tests/test_foreach/test.tpl | 8 | ||||
| -rw-r--r-- | tests/test_foreach/want | 5 | 
6 files changed, 53 insertions, 3 deletions
| diff --git a/docu/language_definition.html b/docu/language_definition.html index a21a869..84232de 100644 --- a/docu/language_definition.html +++ b/docu/language_definition.html @@ -380,6 +380,14 @@  <code><pre><ste:foreach array="foo" key="k" value="v" counter="i"><br />	Number: $i<br /><br />	Key: $k<br /><br />	Value: $v<br /><br />	<br /><br /></ste:foreach></pre></code>  				This code will loop through the array <code>foo</code> and return the counter <code>$i</code>, the key <code>$k</code> and the value <code>$v</code> of the current iteration.  			</p> +			<p> +				There can also be an optional <code><ste:else></code> clause, that will be executed, if the input array was empty. +			</p> +			<p> +				Example:<br /> +				<code><pre><ste:foreach array="foo" value="v"><br />    <p>$v</p><br />    <ste:else><br />        Array \$foo is empty.<br />    </ste:else><br /></ste:foreach></pre></code> +				This code will list all array elements or will display <code>Array $foo is empty</code> if the array <code>$foo</code> is empty. +			</p>  		<h3 id="builtin_infloop">ste:infloop</h3>  			<p>Creates an infinitive loop. You can get out of the loop using the <a href="#builtin_break">ste:break</a> tag. Can be used to emulate other loop constructs like while loops.</p> @@ -887,14 +887,29 @@ $ste_builtins = array(  			$loopbody .= "\$${loopname}_counter++;\n\$ste->set_var_by_name(\$${loopname}_countervar, \$${loopname}_counter);\n";  		} +		$loop = array(); +		$else = array(); +		foreach($ast->sub as $node) { +			if(($node instanceof TagNode) && ($node->name == "else")) { +				$else = array_merge($else, $node->sub); +			} else { +				$loop[] = $node; +			} +		} +		  		$loopbody .= "\$ste->set_var_by_name(\$${loopname}_valuevar, \$${loopname}_value);\n";  		if(!empty($ast->params["key"])) {  			$loopbody .= "\$ste->set_var_by_name(\$${loopname}_keyvar, \$${loopname}_key);\n";  		}  		$loopbody .= "\n"; -		$loopbody .= _transcompile($ast->sub); +		$loopbody .= _transcompile($loop);  		$loopbody = "{\n" . loopbody(indent_code($loopbody)) . "\n}\n"; +		if(!empty($else)) { +			$code .= "if(empty(\$${loopname}_array))\n{\n"; +			$code .= indent_code(_transcompile($else)); +			$code .= "\n}\nelse "; +		}  		$code .= "foreach(\$${loopname}_array as \$${loopname}_key => \$${loopname}_value)\n$loopbody\n";  		return $code; @@ -1351,13 +1366,15 @@ class STECore {  	}  	private function &_get_var_reference(&$from, $name, $create_if_not_exist) { +		$nullref = NULL; +		  		$bracket_open = strpos($name, "[");  		if($bracket_open === false) {  			if(isset($from[$name]) or $create_if_not_exist) {  				$ref = &$from[$name];  				return $ref;  			} else { -				return NULL; +				return $nullref;  			}  		} else {  			$old_varname = $varname; @@ -1371,7 +1388,7 @@ class STECore {  				if($create_if_not_exist) {  					$from[$varname] = array();  				} else { -					return NULL; +					return $nullref;  				}  			}  			try { diff --git a/tests/test_foreach/.gitignore b/tests/test_foreach/.gitignore new file mode 100644 index 0000000..de2a41b --- /dev/null +++ b/tests/test_foreach/.gitignore @@ -0,0 +1,3 @@ +have +*.ast +*.transc.php diff --git a/tests/test_foreach/code.php b/tests/test_foreach/code.php new file mode 100644 index 0000000..380ee69 --- /dev/null +++ b/tests/test_foreach/code.php @@ -0,0 +1,9 @@ +<?php + +function test_func($ste) { +	$ste->vars["foo"] = array( +		"a" => array("a" => 100, "b" => 200), +		"b" => array("a" => 1, "b" => 2), +		"c" => array("a" => 42, "b" => 1337) +	); +} diff --git a/tests/test_foreach/test.tpl b/tests/test_foreach/test.tpl new file mode 100644 index 0000000..1aec8b4 --- /dev/null +++ b/tests/test_foreach/test.tpl @@ -0,0 +1,8 @@ +<ste:foreach array="foo" key="k" value="v" counter="i"> +	$i: $k -> $v[a], $v[b] +</ste:foreach> +--- +<ste:foreach array="bar" value="v"> +	$v +	<ste:else>--empty--</ste:else> +</ste:foreach> diff --git a/tests/test_foreach/want b/tests/test_foreach/want new file mode 100644 index 0000000..5710bf7 --- /dev/null +++ b/tests/test_foreach/want @@ -0,0 +1,5 @@ +0: a -> 100, 200 +1: b -> 1, 2 +2: c -> 42, 1337 +--- +--empty-- | 
