校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > tp5框架前臺無限極導航菜單類實現方法分析

tp5框架前臺無限極導航菜單類實現方法分析

熱門標簽:南京3D地圖標注 辦理400電話哪家好點 邢臺400電話辦理 正規電銷機器人系統 咸陽電銷 濟源百應電銷機器人聯系方式 重慶外呼電銷系統多少錢 南寧電話外呼系統線路 嘟嘟云外呼系統

本文實例講述了tp5框架前臺無限極導航菜單類實現方法。分享給大家供大家參考,具體如下:

適用于 id name pid sort 類似結構的表結構

使用方法:(tp5)

1、將最下面的代碼保存到“前臺”控制器目錄下(名為 FrontNav.php),比如(路徑): application/index/controll(應用/模塊/控制器)

2、在控制器中使用:(application/index/controll/index)(應用/模塊/控制器/方法)

也可以放到基礎類的初始化方法中,如:Base.php 的 _initialize() 方法(不用多解釋,這個是 tp5 的初始化方法 貌似 init() 也行?可以自己試試)

使用:

1)、第一步:先實例化本類, 5 個參數。

參數說明:

  • param 1:必填 字符串類型 數據表名稱(也是模型名稱),不用其實字母大寫也行。例如: category
  • param 2:選填 字符串類型 模型所在的路徑(默認是:admin模塊下的model目錄)。如果你不叫 admin,那么書寫格式如下:houtai/model
  • param 3:必填 字符串類型 父級欄目字段名稱,例如:pid(parent id)
  • param 4:選填 數組類型 默認是按 id 正序排序的,如果有排序字段 sortField 的值為 字段名稱 如 sort 或者 listorder 等…,sortOrder 的值為 asc(正序) 或 desc (倒序),建議按這個排序,要不然會顯示有點亂,因為權重的關系需要手動排序顯示的位置。
  • param 5:必填 二維數組 替換關鍵詞,該參數的第一個數組為頂部導航所需要替換的關鍵詞(必填),linkUrl(url 鏈接)是固定模式,必須這么寫,它的值是:模塊/控制器/方法,其他的鍵為要替換的關鍵詞值為字段名稱。第二個數組(選填)為二級菜單,第三個數組(選填)為N級菜單,此三個數組個數要對應 $this->createNavHtml() 方法中模版參數的個數,詳見 createNavHtml() 方法解釋。
$frontNav = new FrontNav('category', '', 'pid', array(
'sortField' => 'sort',
'sortOrder' => 'asc'
), array(
array(
'linkUrl' => 'index/artlist/index',
'catName' => 'name',
'catDesc' => 'desc'
),
array(
'linkUrl' => 'index/artlist/index',
'catName' => 'name',
'catDesc' => 'desc'
)
));

2)、第二步:生成 導航的 html 結構,4個參數

  1. param 1:選填 字符串類型 首頁的 html 模版,例如 ‘li>a class=”navi_home” href=”/”>首頁/a>/li>'
  2. param 2:必填 數組類型 頂部導航的 html 模版,注意下面實例的格式寫法
  3. param 3:選填 數組類型 二級菜單的 html 模版,同上
  4. param 4:選填 數組類型 N級菜單的 html 模版,同上
$navHtml = $frontNav->createNavHtml('li>a class="navi_home" href="/" rel="external nofollow" rel="external nofollow" >首頁/a>/li>', array(
'ul id="jsddm" class="topNav">',
'li>a href="linkUrl" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" title="catDesc">catName/a>',
'/li>',
'/ul>'
), array(
'ul class="twoLevel">',
'li>a href="linkUrl" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" title="catDesc">catName/a>',
'/li>',
'/ul>'
), '');

3)、第三步:向模版輸出

$this->assign(array(
'navHtml' => $navHtml
));

4)、第四步:模版調用(多余??)

div id="navi">
{$navHtml}
/div>

提示:

1、替換關鍵詞參數個數與模版(除了首頁外)參數個數一定要對應,打字解釋的可能有點不明白,詳細的對照 實例化 和 創鍵方法 的代碼看幾遍就明白了,實在不行可以看源程序,都有較詳細的注釋。

2、本類默認模型優先,如果沒有模型就會查表返回數據庫實例。

3、還有一點要注意就是你的替換關鍵詞盡量要跟模版里的字符串不要重復,比如說,你的替換關鍵詞叫 ‘id' => catename,而模版里 li id=”xixixi”>a href=”###”>哎呀?/a>/li>,要是這樣就壞了…

求高手改成php原生的,可聯系qq發給我嗎?嘿嘿…

具體哪有不清楚的可以聯系我QQ

效果圖:(好像也支持無限極菜單)

?php
  /**
   * Created by PhpStorm.
   * User: Chao Chao
   * Date: 2017/9/23
   * Time: 10:18
   * versions: 1.0.0
   * url: null
   * email: 2776332953@qq.com
   * phone: ***
   */
  namespace app\index\controller;
  use think\Db;    // 引用 Db (數據庫鏈接) 類
  use think\Url;   // 引用 Url ( 創建 url) 類
  use think\Loader;  // 引用 Loader ( 加載 ) 類
  class FrontNav {
    // 數據庫實例
    protected $db;
    // 無限極字段名稱
    protected $pidName = '';
    // 排序設置
    protected $sort = array();
    // 一級導航html模版
    protected $levelOne = array();
    // 二級導航html模版
    protected $levelTwo = array();
    // n級導航html模版
    protected $levelN = array();
    // nav html
    protected $navHtml = '';
    // 替換關鍵詞
    protected $replaceKeywords = array();
    /**
     * FrontNav constructor.  構造方法用于生成數據實例與配置參數
     * @param string $name 數據表名稱或模型名稱
     * @param string $modelPath 模型所在路徑,默認為 admin/model (admin模塊下的model目錄)
     * @param string $pidName 無限極分類的字段(如:pid 或 parentid 等)
     * @param string $sort 要排序的字段名稱
     * @param array $replaceKeywords 定義的替換關鍵詞
     */
    public function __construct($name, $modelPath, $pidName, $sort, $replaceKeywords) {
      // $name 為必填參數
      if (empty($name) || !is_string($name)) {
        throw new \think\Exception('參數錯誤 $name(表名稱或模型名稱),實例化時該參數必須為字符串類型且不能為空!');
      }
      // 模型優先考慮 如果 模型類先存在 就返回 模型實例,否則返回 Db 類實例。
      // 防止大小寫錯誤,先都轉換成小寫在將第一個字母大寫 如:Category,因為 linux 區分大小寫
      $fileName = ucwords(strtolower($name));
      // 一般欄目的模型都在后臺,所以這里就寫死了地址 '/admin/model/',也可以傳參制定位置
      $modelPath = !empty($modelPath) ? strtolower($modelPath) : 'admin/model';
      if (class_exists('app\\' . str_replace('/', '\\', $modelPath) . '\\' . $fileName)) {
        $this->db = Loader::model($fileName, 'model', false, 'admin');
      } else {
        // 不確定在 linux 下數據庫名稱是否區分大小寫,所以都轉換成小寫。
        $this->db = Db::name(strtolower($fileName));
      }
      // 無限極父類字段不能為空
      if (!empty($pidName)) {
        $this->pidName = $pidName;
      } else {
        throw new \think\Exception('參數錯誤 $pidName(父欄目id),實例化時字段名稱不能為空!');
      }
      // 替換關鍵詞
      if (empty($replaceKeywords) || !is_array($replaceKeywords)) {
        throw new \think\Exception('參數錯誤 $replaceKeywords(替換關鍵詞),實例化時該參數必須是而為數組類型且不能為空!');;
      } else {
        $this->replaceKeywords = $replaceKeywords;
      }
      $this->sort = $sort;
    }
    /**
 * 控制器調用,生成導航菜單。頂層導航的樣式( 參數2 $levelOneTemplate )為必填項,也就是說最基本的是一層導航,二級和多級是選填項( 參數3: $levelTwoTemplate 與 參數4 $levelNTemplate 非必填項 )
     * @param string $homePageHml 首頁 標簽的html樣式,如: li>a class="navi_home" href="/" rel="external nofollow" rel="external nofollow" >首頁/a>/li>
     * @param array $levelOneTemplate 必填 頂部導航的html樣式,如: array(
     * 'ul id="jsddm" class="topNav">',  最外層 ul
     * 'li>a href="linkUrl" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" title="catDesc">catName/a>',  li標簽
     * '/li>',  li 結束
     * '/ul>' ul 結束
     * )
     * @param array $levelTwoTemplate 選填 二級菜單的html樣式,如: array(
     * 'ul class="twoLevel">',  二級菜單的 ul
     * 'li>a href="linkUrl" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" title="catDesc">catName/a>',  li標簽
     * '/li>',li 結束
     * '/ul>'ul 結束
     * )
     * @param array $levelNTemplate 選填 多級菜單的html樣式,如: array(
     * 'ul class="nLevel">',  N級菜單的 ul
     * 'li>a href="linkUrl" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" title="catDesc">catName/a>',  li標簽
     * '/li>',li 結束
     * '/ul>'ul 結束
     * @return string
     */
    public function createNavHtml($homePageHml, $levelOneTemplate, $levelTwoTemplate, $levelNTemplate) {
      // 第一層導航不能為空且必須是數組
      if (empty($levelOneTemplate) || !is_array($levelOneTemplate)) {
        throw new \think\Exception('參數錯誤 $levelOneTemplate(一級導航模版),該參數必須是數組類型且不能為空!');
      }
      $this->levelOne = $levelOneTemplate;
      // 二級導航
      if (!empty($levelTwoTemplate)  !is_array($levelTwoTemplate)) {
        throw new \think\Exception('參數錯誤 $levelTwoTemplate(二級導航模版),該參數可以為空 \'' 或 array(),否則必須是數組類型!');
      }
      $this->levelTwo = $levelTwoTemplate;
      // N級導航
      if (!empty($levelNTemplate)  !is_array($levelNTemplate)) {
        throw new \think\Exception('參數錯誤 $levelNTemplate(N級導航模版),該參數可以為空 \'' 或 array(),否則必須是數組類型!');
      }
      $this->levelN = $levelNTemplate;
      $treeData = $this->getTreeData($this->getAllData(), 0);
      //print_r($treeData);
      $this->createHtml($treeData);
      return $this->levelOne[0] . (!empty($homePageHml) ? $homePageHml : '') . $this->navHtml .
          $this->levelOne[3] . "\n";
    }
    /**
     * 獲取所有數據
     * @return array
     */
    private function getAllData() {
    if (empty($this->sort) || empty($this->sort['sortField']) || empty($this->sort['sortOrder'])) {
        return collection($this->db->where(1)
                      ->select())->toArray();
      } else {
        return collection($this->db->where(1)
                      ->order($this->sort['sortField'] . ' ' . $this->sort['sortOrder'])
                      ->select())->toArray();
      }
    }
    /**
     * 將所有數據攢成樹狀結構的數組
     * 增加 levels (層級) children (子數組)
     * @param $allData   傳遞過來的所有非樹狀結構的數組
     * @param $parentId   初始化時的父欄目id
     * @return array    樹狀結構的數組
     */
    private function getTreeData($allData, $parentId) {
      $tree = array();
      // 層級計數
      static $number = 1;
      foreach ($allData as $v) {
        if ($v[$this->pidName] == $parentId) {
          if ($v[$this->pidName] == 0) {
            $v['levels'] = 0;
          } else {
            $v['levels'] = $number;
            ++$number;
          }
          $v['children'] = $this->getTreeData($allData, $v['id']);
          $tree[] = $v;
        } else {
          $number = 1;
        }
      }
      return $tree;
    }
    /**
     * 遞歸生成樹狀結構的html
     * @param $allData array  由 createNavHtml() 方法傳遞過來的 樹形結構 數據(數組)
     * @return     string 返回(最外層ul內部的html)樹狀結構的html
     */
    private function createHtml($allData) {
      foreach ($allData as $v) {
        // 頂部導航
        if ($v['levels'] == 0) {
          $tempStr0 = $this->levelOne[1];
          foreach ($this->replaceKeywords[0] as $k1 => $v1) {
            if ($k1 == 'linkUrl') {
              $tempStr0 = str_replace($k1, Url::build($v1, 'id=' . $v['id']), "\n" . $tempStr0);
            } else {
              $tempStr0 = str_replace($k1, $v[$v1], $tempStr0);
            }
          }
          $this->navHtml .= $tempStr0;
          if (empty($v['children'])) {
            $this->navHtml .= $this->levelOne[2] . "\n";
          } else if (!empty($v['children'])  !empty($this->levelTwo)) {
            $this->navHtml .= "\n" . $this->levelTwo[0] . "\n";
            $this->createHtml($v['children']);
            $this->navHtml .= $this->levelTwo[3] . $this->levelOne[2];
          }
        }
        // 二級菜單
        if ($v['levels'] == 1) {
          $tempStr2 = $this->levelTwo[1];
          foreach ($this->replaceKeywords[1] as $k1 => $v1) {
            if ($k1 == 'linkUrl') {
              $tempStr2 = str_replace($k1, Url::build($v1, 'id=' . $v['id']),       $tempStr2);
            } else {
              $tempStr2 = str_replace($k1, $v[$v1], $tempStr2);
            }
          }
          $this->navHtml .= $tempStr2;
          if (empty($v['children'])) {
            $this->navHtml .= $this->levelTwo[2] . "\n";
          } else if (!empty($v['children'])  !empty($this->levelN)) {
            // 是否多級導航,有 children ,還必須有3級 html 模版
            $this->navHtml .= "\n" . $this->levelN[0] . "\n";
            $this->createHtml($v['children']);
            $this->navHtml .= $this->levelN[3] . $this->levelTwo[2] . "\n";
          }
        }
        // 多級菜單
        if (!empty($this->levelN)  $v['levels'] > 1) {
          $tempStrN = $this->levelN[1];
          foreach ($this->replaceKeywords[2] as $k1 => $v1) {
            if ($k1 == 'linkUrl') {
              $tempStrN = str_replace($k1, Url::build($v1, 'id=' . $v['id']), $tempStrN);
            } else {
              $tempStrN = str_replace($k1, $v[$v1], $tempStrN);
            }
          }
          $this->navHtml .= $tempStrN;
          if (empty($v['children'])) {
            $this->navHtml .= $this->levelN[2] . "\n";
          } else {
            $this->navHtml .= $this->levelN[0];
            $this->createHtml($v['children']);
            $this->navHtml .= $this->levelN[3] . $this->levelN[2];
          }
        }
      }
      return $this->navHtml;
    }
  }

更多關于thinkPHP相關內容感興趣的讀者可查看本站專題:《ThinkPHP入門教程》、《thinkPHP模板操作技巧總結》、《ThinkPHP常用方法總結》、《codeigniter入門教程》、《CI(CodeIgniter)框架進階教程》、《Zend FrameWork框架入門教程》及《PHP模板技術總結》。

希望本文所述對大家基于ThinkPHP框架的PHP程序設計有所幫助。

您可能感興趣的文章:
  • thinkphp實現面包屑導航(當前位置)例子分享
  • ThinkPHP+EasyUI之ComboTree中的會計科目樹形菜單實現方法
  • thinkPHP實現的聯動菜單功能詳解
  • thinkPHP基于ajax實現的菜單與分頁示例
  • ThinkPHP使用心得分享-ThinkPHP + Ajax 實現2級聯動下拉菜單
  • ThinkPHP無限級分類原理實現留言與回復功能實例
  • thinkphp實現無限分類(使用遞歸)
  • ThinkPHP自動填充實現無限級分類的方法
  • ThinkPHP實現遞歸無級分類——代碼少
  • 使用ThinkPHP的自動完成實現無限級分類實例詳解

標簽:平頂山 隴南 通遼 南通 河南 武漢 唐山 黃山

巨人網絡通訊聲明:本文標題《tp5框架前臺無限極導航菜單類實現方法分析》,本文關鍵詞  tp5,框架,前臺,無限,極,導航,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《tp5框架前臺無限極導航菜單類實現方法分析》相關的同類信息!
  • 本頁收集關于tp5框架前臺無限極導航菜單類實現方法分析的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    婷婷国产在线综合| av欧美精品.com| 成人激情开心网| 91视频观看视频| 欧美视频精品在线| 日韩片之四级片| 成人欧美一区二区三区小说| 午夜精品福利视频网站| 久久69国产一区二区蜜臀| 成人一区二区三区| 欧美日韩国产天堂| 国产精品无圣光一区二区| 日韩一区欧美二区| 91丨porny丨在线| 欧美不卡视频一区| 亚洲免费视频成人| 国内久久婷婷综合| 欧美系列一区二区| 国产精品婷婷午夜在线观看| 日本不卡中文字幕| 欧美性受xxxx黑人xyx性爽| 国产日韩亚洲欧美综合| 秋霞影院一区二区| 欧美日韩国产免费一区二区| 中文字幕一区二区三区精华液 | 欧美一区二区三区小说| 亚洲乱码国产乱码精品精98午夜| 国精产品一区一区三区mba视频| 欧美另类一区二区三区| 亚洲黄色在线视频| 日本精品一级二级| 依依成人综合视频| eeuss国产一区二区三区| 国产精品视频线看| 波多野结衣亚洲一区| 亚洲少妇最新在线视频| 91网站最新地址| 亚洲一区二区在线免费观看视频| 91色乱码一区二区三区| 亚洲男人天堂av| 91无套直看片红桃| 一区二区在线观看视频在线观看| 99久久伊人精品| 亚洲欧美日韩一区二区| 色婷婷精品久久二区二区蜜臀av| 亚洲精品v日韩精品| 欧美男生操女生| 裸体健美xxxx欧美裸体表演| 欧美人牲a欧美精品| 蜜桃精品在线观看| 欧美激情在线免费观看| 91福利视频久久久久| 日韩成人免费在线| 国产女同互慰高潮91漫画| 91偷拍与自偷拍精品| 日韩专区一卡二卡| 久久久五月婷婷| 在线观看亚洲一区| 久久97超碰国产精品超碰| 自拍偷拍国产亚洲| 欧美一卡2卡3卡4卡| 国产成人精品免费一区二区| 亚洲精品五月天| 久久精品男人天堂av| 日本电影欧美片| 国产美女av一区二区三区| 亚洲综合色婷婷| 国产婷婷色一区二区三区在线| 99视频精品全部免费在线| 久热成人在线视频| **欧美大码日韩| 欧美唯美清纯偷拍| 国产精品一区二区无线| 亚洲一区二区三区视频在线 | 亚洲精品videosex极品| 欧美一区二区三区免费在线看 | 久久久国产午夜精品| 欧美日韩一区三区| 国产成人免费网站| 午夜精品在线看| 亚洲视频中文字幕| 精品盗摄一区二区三区| 91免费看视频| 国产乱码精品一区二区三区五月婷| 亚洲一区二区成人在线观看| 日韩午夜小视频| 欧美日本国产一区| 成人a免费在线看| 国产在线不卡一卡二卡三卡四卡| 午夜欧美一区二区三区在线播放| 国产精品嫩草99a| 日韩亚洲欧美综合| 欧美日韩成人综合天天影院| 日本韩国欧美三级| 99精品视频在线免费观看| 久久99精品久久只有精品| 首页亚洲欧美制服丝腿| 午夜激情一区二区| 亚洲成av人片在线观看| 亚洲在线免费播放| 国产精品不卡在线| 亚洲综合丝袜美腿| 亚洲成人黄色小说| 亚洲成av人片一区二区三区| 洋洋av久久久久久久一区| 一区二区三区欧美日| 亚洲精品美腿丝袜| 99久久免费精品| 色八戒一区二区三区| 欧美视频一区二区三区四区 | 欧美午夜精品电影| 欧美一区二区视频在线观看2020| 91精选在线观看| 久久久午夜电影| 亚洲免费在线电影| 亚洲一区二区3| 麻豆传媒一区二区三区| 粉嫩绯色av一区二区在线观看| 成人国产在线观看| 在线国产亚洲欧美| 欧美日韩免费视频| 26uuu国产一区二区三区| 国产精品久久久久久久久免费樱桃| 亚洲男人电影天堂| 奇米四色…亚洲| 91在线免费看| 日韩视频免费观看高清在线视频| 国产日韩欧美精品综合| 亚洲国产精品久久人人爱蜜臀| 免费观看久久久4p| av亚洲产国偷v产偷v自拍| 7777精品伊人久久久大香线蕉的| 国产精品久久久久久久久久久免费看 | 亚洲免费视频中文字幕| 国产主播一区二区三区| 欧美日韩国产高清一区二区| 久久欧美中文字幕| 亚洲国产一区二区在线播放| av在线不卡网| 久久久蜜桃精品| 麻豆高清免费国产一区| 欧美日韩一区二区三区视频 | 成人黄色777网| 久久色在线视频| 精品一区二区三区视频在线观看| 波多野结衣欧美| 中文字幕一区免费在线观看| 国产麻豆精品一区二区| 4438x成人网最大色成网站| 亚洲一区二区三区中文字幕| 国产69精品久久久久毛片| 久久久久久免费毛片精品| 日韩在线一区二区三区| 欧美日韩国产综合一区二区三区| 国产精品久久久久久久久久免费看 | 欧美不卡一区二区三区四区| 天堂久久久久va久久久久| 97精品久久久久中文字幕| 国产精品久久久久久妇女6080 | 日本精品免费观看高清观看| 国产亚洲欧美一区在线观看| 国产一区二区在线影院| 久久久精品国产免费观看同学| 成人久久视频在线观看| 国产精品毛片a∨一区二区三区 | 成人av影院在线| 中文字幕一区二区三区在线播放 | 亚洲成av人**亚洲成av**| 精品国产在天天线2019| 国产不卡在线视频| 成人欧美一区二区三区1314| 91搞黄在线观看| 麻豆专区一区二区三区四区五区| 日韩欧美一级二级三级| 国产乱理伦片在线观看夜一区| 成人欧美一区二区三区白人| 欧美日免费三级在线| 人人狠狠综合久久亚洲| 国产三级三级三级精品8ⅰ区| 高清不卡一二三区| 天天影视色香欲综合网老头| 欧美吻胸吃奶大尺度电影| 国产一区二区网址| 亚洲色图.com| 久久色在线观看| 69堂国产成人免费视频| 在线日韩一区二区| 国产精品伊人色| 青青草国产成人av片免费| 国产精品三级视频| 欧美日韩国产一区| 91女神在线视频| 国产美女在线精品| 亚洲aⅴ怡春院| 中文字幕一区二区三区在线观看| 国产亚洲欧美激情| 日韩一区二区三区电影在线观看| 日本丰满少妇一区二区三区| 国产精品中文字幕日韩精品| 天天综合天天综合色|