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}">&nbsp;&nbsp;&nbsp;&nbsp;{$lang.$k}</option>
              {/foreach}
              {/if}
             {/foreach}

         相关文章:

          分析ecmall的model中引用其他

         分析ecshop后台用户评论管

         ecshop购物车中属性显示的

       修改ecshop2.7.0后台路径

        来源:中国B4C电子商务