<?php 
/** 
 * gTemplate Internal Function 
 * Compiles the 'foreach' function 
 * 
 * @package    gTemplate 
 * @subpackage internalFunctions 
 */ 
 
function compile_foreach_start($arguments, &$gTpl) { 
 
    //Emulate Smarty3 functionality: foreach $items as $item 
    $regexp1 = '/((?:('.$gTpl->_obj_call_regexp.'|' . $gTpl->_var_regexp . '|' . $gTpl->_svar_regexp . ')(' . $gTpl->_mod_regexp . '*))(?:\s+(.*))?) as \$('.$gTpl->_dvar_guts_regexp.')=>\$('.$gTpl->_dvar_guts_regexp.')/is'; 
    $regexp2 = '/((?:('.$gTpl->_obj_call_regexp.'|' . $gTpl->_var_regexp . '|' . $gTpl->_svar_regexp . ')(' . $gTpl->_mod_regexp . '*))(?:\s+(.*))?) as \$('.$gTpl->_dvar_guts_regexp.')/is'; 
    if (preg_match($regexp1, $arguments)) { 
        $arguments = preg_replace($regexp1, 'from=$1 key=$5 item=$6', $arguments); 
    } else { 
        $arguments = preg_replace($regexp2, 'from=$1 item=$5', $arguments); 
    } 
 
    $attrs = $gTpl->_parse_arguments($arguments); 
    $arg_list = array(); 
 
    /* Required attr: from */ 
    if (empty($attrs['from'])) { 
        return $gTpl->trigger_error("[SYNTAX] missing 'from' attribute in 'foreach' tag", E_USER_ERROR, $gTpl->_file, $gTpl->_linenum); 
    } 
    $from = $attrs['from']; 
 
    /* Required attr: item */ 
    if (empty($attrs['item'])) { 
        return $gTpl->trigger_error("[SYNTAX]  missing 'item' attribute in 'foreach' tag", E_USER_ERROR, $gTpl->_file, $gTpl->_linenum); 
    } 
    $item = $gTpl->_dequote($attrs['item']); 
    if (!preg_match('~^\w+$~', $item)) { 
        return $gTpl->trigger_error("[SYNTAX] 'item' must be a variable name (literal string) in 'foreach' tag", E_USER_ERROR, $gTpl->_file, $gTpl->_linenum); 
    } 
 
    /* attr: key */ 
    if (isset($attrs['key'])) { 
        $key  = $gTpl->_dequote($attrs['key']); 
        if (!preg_match('~^\w+$~', $key)) { 
            return $gTpl->trigger_error("[SYNTAX] 'key' must to be a variable name (literal string) in 'foreach' tag", E_USER_ERROR, $gTpl->_file, $gTpl->_linenum); 
        } 
        $key_part = "\$gTpl->_vars['$key'] => "; 
    } else { 
        $key = null; 
        $key_part = ''; 
    } 
 
    /* attr: name */ 
    if (isset($attrs['name'])) { 
        $name = $attrs['name']; 
    } else { 
        $name = null; 
    } 
 
 
    /* Generate output */ 
    $output =    "<?php \n/* START of Foreach on {$from} */\n" 
                ."\$_from = $from;\n" 
                ."if (!is_array(\$_from) && !is_object(\$_from)) { settype(\$_from, 'array'); }\n"; 
    if (isset($name)) { 
        $foreach_props = "\$gTpl->_foreach['$name']"; 
        $output .=   "{$foreach_props} = array('total' => count(\$_from), 'iteration' => 0);\n" 
                    ."if ({$foreach_props}['total'] > 0):\n" 
                    ."    foreach (\$_from as $key_part\$gTpl->_vars['$item']):\n" 
                    ."        {$foreach_props}['iteration']++;\n" 
                    ."        /* START of LOOP section */\n"; 
 
    } else { 
        $output .=   "if (count(\$_from)):\n" 
                    ."    foreach (\$_from as $key_part\$gTpl->_vars['$item']):\n" 
                    ."    /* START of LOOP section */\n"; 
    } 
    $output .= '?>'; 
    $gTpl->openTag('foreach', array('from' => $attrs['from'])); 
    return $output; 
} 
 
 |