项目需求,新建一个奖杯表,在用户等级表中,指定奖杯个数,在循环展示用户等级的时候,根据等级设定的奖杯个数从第一个奖杯开始展现奖杯明细
$trophyList=M("trophy")->order("orderno")->select();
在controller里,先把奖杯的数据读取出来,并使用$this->assign("trophyList",$trophyList);将数据assign 到前台。
在前台循环读取数据时,外层循环使用的是<foreach></foreach>标签。代码如下:
<foreach name="lists" item="vo">
<td><if condition="$vo['film_message'] eq '1' "><span class="greenSpan">√</span><else /><span class="redSpan">×</span></if></td>
<td>
<if condition="$vo['trophy_num'] gt 0">
<volist name="trophyList" id="trophyList" offset="0" length="$vo['trophy_num']" empty="沒有獎盃">
<p>{$trophyList['trophy_name']} -- {$trophyList['trophy_code']}分</p>
</volist>
</if>
</td>
<td>{$vo['login_point']}</td>
</foreach>
如上:红色部分是原来的写法,这里出现错误的结果展示如下图:
因为第一条数据和第二条数据写的奖杯个数都是2,所以,第二条的展现数据应该跟第一条是一样的,显然,这个结果时错误的。
我们来分析上面红色部分的代码,
首先,我们可以先在volist标签上面使用<php>print_r($trophyList);</php>将数组数据打印一下看看,如下图:
显然,foreach第二轮循环的时候,volist需要循环的数据已经发生了变化,这时,我们分析下volist代码可以发现name="trophyList" id="trophyList" 在执行第一遍volist的时候,读取出来的数据在执行了offset="0" length="$vo['trophy_num']"之后,
数据显然是被截取了,因为name和id是一样的,所以被截取的数据又重新赋值给了trophyList,所以才导致数据丢失的问题。
将上面的代码做修改之后,把id的属性值改为v1,就成功避免了上面的问题,因为trophyList数据被截取赋值给了v1,原来的数据不会被重新赋值。
所以,正确的写法应该是:
<volist name="trophyList" id="v1" offset="0" length="$vo['trophy_num']" empty="沒有獎盃">
<p>{$v1['trophy_name']} -- {$v1['trophy_code']}分</p>
</volist>