其實如果在不考慮smarty樣板輸出的情況下,php三維陣列是滿好解的,可以用兩個while來互相撈資料,也能用遞迴函數的方法來解,但如果要輸出smarty樣板,就比較麻煩一點,必須定義陣列的array()值才行,以下為撈取兩個資料表後透過php三維陣列輸出smarty樣板的實際範例。
資料表A:neoblockmenusort,主要是紀錄分類的標題及一些分類的設定值,目前共有5個欄位,sortid為欄位的PRIMARY KEY值。
資料表B:neoblockmenubutton,主要是分類底下的子分類,儲存按鈕的一些設定值,bid為欄位的PRIMARY KEY值。
PHP結構部分:
<?php
function neoblockmenulayers_block_show($options)
{
global $xoopsDB, $xoTheme;
$optionsval=preg_split('/,/',$options[2]);
foreach($optionsval as $key=> $val){
if($options[3]==$val){
$y='';
}else{
$y='||';
}
$Displayfield.="`sortid`=$val {$y}";
}
$category = array(); //建構第一層陣列
$sql = "select * from " . $xoopsDB->prefix('neoblockmenusort'.$mydirnumber) . "
where {$Displayfield} order by sorting ASC limit 0 , {$options[1]}";
$result = $xoopsDB->query($sql)
or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
while(list($sortid,$sorttitle,$sortimg,$sorting,$radiogstyle,$imgstyle) = $xoopsDB -> fetchRow($result)){
//第一層取值
$menu[$sortid]['sortid']= $sortid;
$menu[$sortid]['sorttitle']= $sorttitle;
$table[$sortid] = array(); //建構第二層陣列
$sql2 = "select bid,sortid,buttontitle,buttonurl,target from " . $xoopsDB->prefix('neoblockmenubutton'.$mydirnumber) . "
where `sortid`='{$sortid}' order by orderid ASC limit 0 , {$options[0]}";
$result2 = $xoopsDB->query($sql2)
or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
while(list($bid,$sortid2,$buttontitle,$buttonurl,$target) = $xoopsDB -> fetchRow($result2)){
//第2層陣列取值
$menua[$bid]['buttontitle']= $buttontitle;
//吧第二層數值加到$table[$sortid]陣列中
array_push($table[$sortid] , $menua[$bid]);
}
//吧第二層陣列加入第一層陣列中
$menu[$sortid]['table']=$table[$sortid];
//吧第1層陣列加入$category陣列中
array_push($category, $menu[$sortid]);
}
$GLOBALS['xoopsTpl']->assign('category', $category);
return $category;
}
?>
樣板部分.tpl
//備註:第一層迴圈 from=$category就是php的陣列頂層名稱
教學撰寫:徐嘉裕 Neil hsu
資料表A:neoblockmenusort,主要是紀錄分類的標題及一些分類的設定值,目前共有5個欄位,sortid為欄位的PRIMARY KEY值。
資料表B:neoblockmenubutton,主要是分類底下的子分類,儲存按鈕的一些設定值,bid為欄位的PRIMARY KEY值。
PHP結構部分:
<?php
function neoblockmenulayers_block_show($options)
{
global $xoopsDB, $xoTheme;
$optionsval=preg_split('/,/',$options[2]);
foreach($optionsval as $key=> $val){
if($options[3]==$val){
$y='';
}else{
$y='||';
}
$Displayfield.="`sortid`=$val {$y}";
}
$category = array(); //建構第一層陣列
$sql = "select * from " . $xoopsDB->prefix('neoblockmenusort'.$mydirnumber) . "
where {$Displayfield} order by sorting ASC limit 0 , {$options[1]}";
$result = $xoopsDB->query($sql)
or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
while(list($sortid,$sorttitle,$sortimg,$sorting,$radiogstyle,$imgstyle) = $xoopsDB -> fetchRow($result)){
//第一層取值
$menu[$sortid]['sortid']= $sortid;
$menu[$sortid]['sorttitle']= $sorttitle;
$table[$sortid] = array(); //建構第二層陣列
$sql2 = "select bid,sortid,buttontitle,buttonurl,target from " . $xoopsDB->prefix('neoblockmenubutton'.$mydirnumber) . "
where `sortid`='{$sortid}' order by orderid ASC limit 0 , {$options[0]}";
$result2 = $xoopsDB->query($sql2)
or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
while(list($bid,$sortid2,$buttontitle,$buttonurl,$target) = $xoopsDB -> fetchRow($result2)){
//第2層陣列取值
$menua[$bid]['buttontitle']= $buttontitle;
//吧第二層數值加到$table[$sortid]陣列中
array_push($table[$sortid] , $menua[$bid]);
}
//吧第二層陣列加入第一層陣列中
$menu[$sortid]['table']=$table[$sortid];
//吧第1層陣列加入$category陣列中
array_push($category, $menu[$sortid]);
}
$GLOBALS['xoopsTpl']->assign('category', $category);
return $category;
}
?>
樣板部分.tpl
//備註:第一層迴圈 from=$category就是php的陣列頂層名稱
//備註:第二層迴圈from=$blockmenulayers.table 就是第一層的item值+第二層陣列名稱,用.合併
<{foreach item=blockmenulayers from=$category}>
<div><{$blockmenulayers.sortid}><{$blockmenulayers.sorttitle}></div>
<{foreach from=$blockmenulayers.table item=news}>
<{$news.buttontitle}>
<{/foreach}>
<{/foreach}>
<{foreach item=blockmenulayers from=$category}>
<div><{$blockmenulayers.sortid}><{$blockmenulayers.sorttitle}></div>
<{foreach from=$blockmenulayers.table item=news}>
<{$news.buttontitle}>
<{/foreach}>
<{/foreach}>
區塊樣板顯示結果->資料按照三維陣列結構呈現輸出內容
教學撰寫:徐嘉裕 Neil hsu
留言
張貼留言