TinkPHP5 實現網站欄目下拉框
阿新 • • 發佈:2019-01-05
荊軻刺秦王
通常情況下,我們做網站的時候,經常會遇到這種一級欄目下面有二級目錄。今天我們就來看一下具體實現:
效果圖:
資料表結構:
欄目表:所有的欄目都在這個表裡面
既然這個欄目是公共的內容,我就把這個欄目控制器,放到一個 Base 控制器,然後繼承 Home 控制器,其他所有欄目的控制器都繼承 Base 控制器,這位一來網站所有欄目都可以顯示出來了。
控制器:
我們在 Base 控制器中查詢出所有的欄目
/** * 初始化方法 * @author 劉耀威 <[email protected]> */ protected function _initialize() { //查詢出一級欄目 $result = DB::name('column_review')->field('id,pid,name,url,target')->order('pid asc,sort asc')->where('status','<>',0)->select(); $arr_1 = array(); $arr_2 = array(); foreach($result as $i=>$a){ if($a['pid']==0){ $arr_1[$a['id']]=array( 'id'=>$a['id'], 'pid'=>$a['pid'], 'name'=>$a['name'], 'url'=>$a['url'], 'target'=>$a['target'], ); }else{ $arr_2[$a['pid']][]=array( 'id'=>$a['id'], 'pid'=>$a['pid'], 'name'=>$a['name'], 'url'=>$a['url'], 'target'=>$a['target'], ); } } $this->assign('list1',$arr_1); $this->assign('list2',$arr_2); $this->assign('column1',$arr_1); $this->assign('column2',$arr_2); }
這裡我們將一級欄目和二級欄目分別放到兩個陣列中。
檢視:
<div class="dao"> <div class="dh2"><a href="/" class="dan">首頁</a></div> {foreach name='list1' item="list1" key="key"} <div class="dh2"> <div class="canpin"> <div><p href="javascript:void(0)" class="dan">{$list1.name}</p></div> <div class="zicaidan"> <div><img src="__STATIC__/index/images/lanxian.png"></div> {foreach name="list2" item="vo" key="k" } {if ( $k == $key )} {foreach name="vo" item="vo1" key="k1" } <div class="zi"><a href="{$vo1.url}?id={$vo1.id}" target="{$vo1.target}">{$vo1.name}</a></div> {/foreach} {/if} {/foreach} </div> </div> </div> {/foreach} <div class="change"> <div class="shuxian "><img src="__STATIC__/index/images/shuxian.png"></div> <div class="zhong "><a href="javascript:void(0)" onclick="zh_tran('s')">簡體</a></div> <div class="ying "><a href="javascript:void(0)" onclick="zh_tran('t')">繁體</a></div> <div class="clear"></div> </div> </div>
這裡 不用 volist 遍歷,而是使用 foreach 遍歷,因為 volist 不能滿足我們的需求,foreach 可以使用 key 值將兩個陣列做比較。
上面控制器中,我將一個數組給前臺賦值了兩次,是因為,我們的網站為了適配手機,所以寫了兩套模板,這個時候,我發現兩套模板不能公用一份資料,所以只能使控制器向前臺傳遞了兩次資料。
反正我是看著挺難受的,如果有同學有好的解決方法,可以留言討論