ecshop的smarty模板中foreach的应用和分析
2009-10-12 14:22 来源:www.chinab4c.com 作者:ecshop专家
ecshop中的模板是用的smarty模板引擎,他是一个比较好用,灵活的。
在ecshop中,常常会使用foreach循环,类似php中的foreach使用方式,他可以是单数组,也可以为多唯数组。同样是key/value对的。
ecshop中smarty中foreach标签显示形式如下。
case 'foreach':
$this->_foreachmark = 'foreach';
if(!isset($this->_patchstack))
{
$this->_patchstack = array();
}
return $this->_compile_foreach_start(substr($tag, 8));
break;
他是通过_compile_foreach_start函数来编辑处理该逻辑,返回一个foreach处理格式的数据。
接着分析compile_foreach_start()函数。
function _compile_foreach_start($tag_args)
{
$attrs = $this->get_para($tag_args, 0);
$arg_list = array();
$from = $attrs['from'];
if(isset($this->_var[$attrs['item']]) && !isset($this->_patchstack[$attrs['item']]))
{
$this->_patchstack[$attrs['item']] = $attrs['item'] . '_' . str_replace(array(' ', '.'), '_', microtime());
$attrs['item'] = $this->_patchstack[$attrs['item']];
}
else
{
$this->_patchstack[$attrs['item']] = $attrs['item'];
}
$item = $this->get_val($attrs['item']);
if (!empty($attrs['key']))
{
$key = $attrs['key'];
$key_part = $this->get_val($key).' => ';
}
else
{
$key = null;
$key_part = '';
}
if (!empty($attrs['name']))
{
$name = $attrs['name'];
}
else
{
$name = null;
}
$output = '<?php ';
$output .= "\$_from = $from; if (!is_array(\$_from) && !is_object(\$_from)) { settype(\$_from, 'array'); }; \$this->push_vars('$attrs[key]', '$attrs[item]');";
if (!empty($name))
{
$foreach_props = "\$this->_foreach['$name']";
$output .= "{$foreach_props} = array('total' => count(\$_from), 'iteration' => 0);\n";
$output .= "if ({$foreach_props}['total'] > 0):\n";
$output .= " foreach (\$_from AS $key_part$item):\n";
$output .= " {$foreach_props}['iteration']++;\n";
}
else
{
$output .= "if (count(\$_from)):\n";
$output .= " foreach (\$_from AS $key_part$item):\n";
}
return $output . '?>';
}
他通过smarty对字符串的处理,通过结合php中的eval来处理php自己定义的函数,达到进行处理数据的目的。(!is_array(\$_from) && !is_object(\$_from)) { settype(\$_from, 'array'); 和$foreach_props = "\$this->_foreach['$name']";
$output .= "{$foreach_props} = array('total' => count(\$_from), 'iteration' => 0);\n";
$output .= "if ({$foreach_props}['total'] > 0):\n";
$output .= " foreach (\$_from AS $key_part$item):\n";
$output .= " {$foreach_props}['iteration']++;\n";
标量和结构表明,在foreach中,字符串只要符合语法规范,可以是变量,也可以是组合变量。出现在foreach中。只要形成key/value对。
例子:
{foreach from=$menus item=menu key=key}
{if $key neq "admin_home"}
<option value="" style="font-weight:bold;">{$lang.$key}</option>
{foreach from=$menus.$key item=item key=k}
<option value="{$item}"> {$lang.$k}</option>
{/foreach}
{/if}
{/foreach}
相关文章:
来源:中国B4C电子商务
最近更新
常用插件
- ecshop分类树中统计商品数
最近忙于开发其他项目,在不少朋友不断要求和催促的情况下,做出了该小...
- ecshop降价通知登记插件
ecshop降价通知登记插件,主要是为了方便某些客户,对商品价格要求比...
- ecshop通用红包编码
很多时候,为了结合促销,必须扩展一下ecshop的红包功能。ecshop的红包...
- ecshop红包修改成满多少减
我们在长期使用ecshop的时候,我们可以发现。ecshop的红包是一个非常强...
- ecshop购物车功能改进[插件
ecshop购物车功能改进[插件套餐]主要是我们最近开发工作和开发项目中。...