有关smarty的循环输出数组的问题[已解决]

#1 prince

查询结果dump出来如下:
Array
(
    [0] => Array
        (
            [cp_id] => 40
            [accouts] => 10000
            [cp_name] => 豆瓣鲫鱼
            [cp_yongl] => 肉片 豆腐卷
            [cp_tiaol] =>
            [cp_jiag] => 120
            [cp_zhek] => 8.8
            [cp_huiyuanjia] => 105
            [cp_jies] =>


       





            [check_yes] => 0
            [crDate] => 2010-08-25 14:15:14
            [modDate] => 2010-08-26 22:07:00
            [at_date] => 2010-11-24 20:15:14
            [delete_is] => 0
            [cplist_album] => Array
                (
                    [0] => Array
                        (
                            [pic_id] => 1
                            [cp_id] => 40
                            [picture] => no.jpg
                        )

                    [1] => Array
                        (
                            [pic_id] => 2
                            [cp_id] => 40
                            [picture] =>no.jpg
                        )

                    [2] => Array
                        (
                            [pic_id] => 5
                            [cp_id] => 40
                            [picture] => no.jpg
                        )

                )

        )
模板部分如何用取得[picture]的值并用section输出?(不明白如何取得多维数组的键值)

2010-08-28 17:42:16

#2 azwl

<{foreach from=$arry item=item1}>
<{foreach from=$item1 item=item2}>
<{foreach from=$item2 item=item3}>
<{/foreach}
<{/foreach}
<{/foreach}

看了smraty编译模板后的文件,section 比foreach 复杂的多,所以能用foreach 尽量用foreach

2010-08-28 19:01:31

#3 prince

回复 2 azwl


    不能用foreach了,因为上面还有一层foreach呢,如果嵌套foreach的话会输出空白页面的。

2010-08-28 19:19:51

#4 jake

不能用foreach了,因为上面还有一层foreach呢,如果嵌套foreach的话会输出空白页面的。 ...
prince 发表于 2010-8-28 19:19
foreach嵌套多少层都是可以的,空白页面就是smarty的语法出错。看看foreach的闭合其他的地方有无错误。

按照你的数据来看,显示的方式大致如下:


<{foreach from=$results item=oneresult}>
名称是:<{$oneresult.cp_name}>

相册:
<{foreach from=$oneresult.cplist_album item=onealbum}>
<{$onealbum.piture}>

<{/foreach}>
<{/foreach}>


PS:还是老规则,先用上面代码作为模板试试,然后再加入自己的代码。

2010-08-28 19:29:25

#5 prince

回复 4 jake


    再看了下smarty手册里的,确实可以嵌套,但前提是:foreach 可以嵌套,但必须保证嵌套中的 foreach 名称唯一.
    之前我的foreach名称应该是重复了,所以输出空白页面。
我把模板里的嵌套按您说的改为:
<{foreach from=$results item=id}>

    <{$id.cp_id}>
    <{$id.cp_name}>
   
           

           

                        <{foreach from=$oneresult.cplist_album item=$onealbum}>
                        
  • <{$onealbum.picture}>

  •                 <{/foreach}>
               

        

   
    <{$id.crDate}>
    <{$id.at_date}>
    <{$id.modDate}>
   
           
        修改

            
        
        删除

     

<{/foreach}>
运行后有提示出错:Parse error: syntax error, unexpected T_ENDFOREACH in E:\special\www\speedphp\client\tmp\%%DF^DFA^DFA37647%%cpinGL.html.php on line 67
看了下编译生成的文件的67行是第二个foreach的结束符,它的前面没有对应的foreach开始标记,但检查模板里的foreach开始结束都对得上的,不知何故?

2010-08-28 20:51:44

#6 azwl

看看中间那个循环变量!!!
按你的写法要么
第一句应为:<{foreach from=$result item=oneresult}>

要么中间循环为<{foreach from=$id.cplist_album item=onealbum}>

2010-08-28 23:21:51

#7 jake

回复  jake


    再看了下smarty手册里的,确实可以嵌套,但前提是:foreach 可以嵌套,但必须保证嵌套中 ...
prince 发表于 2010-8-28 20:51
我的错,写错了item这个,很多时候这个地方都容易出错的。

<{foreach from=$oneresult.cplist_album item=$onealbum}>


应该是


<{foreach from=$oneresult.cplist_album item=onealbum}>

2010-08-29 10:09:59

#8 prince

谢谢楼上二位的帮助,但这样都无法获取到picture键的值,搜了下有关smarty输出四维数组的文章参照,还是解决不了

2010-08-29 17:01:45

#9 prince

摸了好久,终于弄清楚了!控制器和模板都要做一下修改
控制器做如下修改:

$this -> results = $cpList -> spLinker() -> spPager($this -> spArgs('page', 1), 10) -> findAll($conditions);//按条件查找所有符合条件的记录,这行也需要用一个"spLinker()"的,否则对应表的数据不包含在$results里,这点我还不太明白,请大家指点!
$this-> pager = $cpList -> spPager() -> getPager();//分页,这里这个spLinker()还有没有必要留着?因为数据不够多所以看不到效果,请指点迷津
$this -> display("cpinGL.html");
最终模板如下:

<{foreach from=$results item=id}>

    <{$id.cp_id}>
    <{$id.cp_name}>
   
           

            <{foreach from=$id.cplist_album item=one}>
                                                      
  • <{$one.picture}>

  •         <{/foreach}>

   
    <{$id.crDate}>
    <{$id.at_date}>
    <{$id.modDate}>
   
           
        修改

            
        
        删除

     

<{/foreach}>
关键是foreach能这样用:from=$id.cplist_album,所以真的很方便.
另外,我可能表达得不好,请勿见怪!

2010-08-29 17:38:36

#10 xpp1000

dump出来结果
Array
(
    [0] => Array
        (
            [id] => 1
            [user] => 3423
            [tile] => 32432
            [cont] => 23423
            [fg] => 324234
        )

    [1] => Array
        (
            [id] => 2
            [user] => 3423
            [tile] => 32432
            [cont] => 23423
            [fg] => 324234
        )

    [2] => Array
        (
            [id] => 3
            [user] => 3423
            [tile] => 32432
            [cont] => 23423
            [fg] => 324234
        )

)


  
   
   
   
   
  
<{foreach from=$aa item=one}>

   
   
   
   
  
  <{/foreach }>
标题内容发言人管理
<{ $one.tile }><{ $one.cont  }><{ $one.user }>

删除


   

更新


不显示,是什么原因,function show()
{
        $liuyan=spClass("liuyan");
        $sql="select * from liuyan";
        $this->$aa=$liuyan->findsql($sql);
        dump($this->$aa);
        //$this->$results=$sp->findAll();
        $this->display("default/index.html");
        }

2010-09-05 22:06:38

#11 xpp1000

字段名没有错误的

2010-09-05 22:07:29

#12 jake

字段名没有错误的
xpp1000 发表于 2010-9-5 22:07
$this->$aa=$liuyan->findsql($sql);

改回正确的


$this->aa=$liuyan->findsql($sql);

2010-09-06 09:35:14

#13 prince

回复 12 jake


    对呀,$this->后的变量是不能带$的,看看$this->display("index.html");就是这么回事了

2010-09-06 10:29:17

#14 xpp1000

谢谢,问题解决了,有一个新问题来了,我在开发过程碰到这样一个问题,不知道如何解决,就是有很多注册用户(学生家长),还有管理员以及园长,他们的用户认证问题,以及给他们每个注册用户开一个二级域名。

2010-09-14 19:59:00