PHP SMARTY 樣板引擎
ugmKind.php
<?php #--------------------------------- defined('WEB_PATH') || die("WEB_PATH root path not defined"); class ugmKind { protected $tbl; //資料表 protected $kind; //類別 protected $stopLevel; //層數 protected $ofsn; //父類別 function __construct($tbl, $kind,$stopLevel=1,$ofsn = 0) { $this->set_tbl($tbl); $this->set_kind($kind); $this->set_stopLevel($stopLevel); $this->set_ofsn($ofsn); } #--------- 設定類 -------------------- #設定資料表 public function set_tbl($value) { $this->tbl = $value; } #設定類別 public function set_kind($value) { $this->kind = $value; } #設定層數 public function set_stopLevel($value) { $this->stopLevel = $value; } #設定父類別 public function set_ofsn($value) { $this->ofsn = $value; } //--------- 取得類 ------------*/ #取得資料表 public function get_tbl() { return $this->tbl; } #取得分類 public function get_kind() { return $this->kind; } #取得層數 public function get_stopLevel() { return $this->stopLevel; } #取得父類別 public function get_ofsn() { return $this->ofsn; } #get ################################################################ # 取得外鍵下拉選單 的 選項 # 傳入:($kind_arr, $width = 3) # 回傳:ForeignKeyForm ################################################################ public function get_foreignOption($foreign, $default="") { # ----得到Foreign key選單 ---------------------------- $foreignOption = ""; foreach ($foreign as $key => $value) { $selected = ""; if ($default == $key) { $selected = " selected"; } $foreignOption .= "<option value='{$key}'{$selected}>{$value['title']}</option>"; } return $foreignOption; } ################################################################ # 取得類別body的陣列 # 有資料表沒有 kind 、ofsn欄位 ################################################################ public function get_listArr($ofsn=0,$level=1,$enable=0) { global $db; $andKey = $enable ? " and `enable`='{$enable}'":""; #檢查目前階層是否大於層次 if ($level > $this->stopLevel) { return; } #設定下層 $downLevel = $level + 1; $sql = "select * from `{$this->tbl}` where `ofsn`='{$ofsn}' and `kind`='{$this->kind}'{$andKey} order by sort"; //die($sql); $result = $db->query($sql) or redirect_header("", 3000, $db->error."\n".$sql,true); #-------------------------------------------------------------------- $rows = []; while ($row = $result->fetch_assoc()) { //以下會產生這些變數: $sn , $ofsn , $title , $enable ,$sort $row['sn'] = intval($row['sn']); $row['enable'] = intval($row['enable']); $row['target'] = intval($row['target']); $row['title'] = htmlspecialchars($row['title'], ENT_QUOTES); $row['url'] = htmlspecialchars($row['url'], ENT_QUOTES); $row['level'] = $level; #取得底下有幾層 $row['downLevel'] = $this->get_downLevel($row['sn']); $row['sub'] = $this->get_listArr($row['sn'], $downLevel); //移動圖示 $icon['move_i'] = ($this->stopLevel == $row['downLevel'])?false:true; //資料夾圖示(最後一層沒有) $icon['folder_i'] = $this->stopLevel > $level ? true : false; //增加類別圖示 $icon['add_downLevel_i'] = $this->stopLevel > $level ? true : false; //排序圖示 $icon['sort_i'] = true; $row['icon'] = $icon; $rows[] = $row; } return $rows; } #確認底下有幾層 #get_downLevel public function get_downLevel($sn,$downLevel=0) { global $db; if ($downLevel > $this->stopLevel) { return $downLevel; } $level = $downLevel+1; $sql = "select sn from `{$this->tbl}` where ofsn='{$sn}'"; // return $sql; $result = $db->query($sql) or redirect_header("", 3000, $db->error."\n".$sql,true); while ($row = $result->fetch_assoc()) { $downLevel_tmp = $this->get_downLevel($row['sn'], $level); $downLevel = ($downLevel_tmp > $downLevel) ? $downLevel_tmp : $downLevel; } return $downLevel; } ################################################################ # 取得類別body的html # data-tt-id 本身 # data-tt-parent-id 父層 ################################################################ public function get_listHtml($list, $listBodys) { $html = ""; foreach ($list as $item => $row) { $html .= $this->get_rowHtml($listBodys, $row); if ($row['sub']) { $html .= $this->get_listHtml($row['sub'], $listBodys); } } return $html; } ################################################################ # 取得類別body的html # data-tt-id 本身 # data-tt-parent-id 父層 ################################################################ public function get_rowHtml($listBodys, $row) { #row自己的層數 $level = $this->get_thisLevel($row['sn']); //style='letter-spacing: 0;' $html = " <tr id='tr_{$row['sn']}' data-tt-id='{$row['sn']}' data-tt-parent-id='{$row['ofsn']}' level='{$row['level']}' downLevel='{$row['downLevel']}' sn='{$row['sn']}' class='level{$row['level']}' >\n"; foreach ($listBodys as $k => $format) { if ($format['valuetype'] == "text") { #新增子類別 $addLevelButton = ($k == "title" and $this->stopLevel > $level) ? " <a href='?op=opForm&ofsn={$row['sn']}&kind={$row['kind']}' title='IN ({$row['title']}) 建立子類別' class='btn btn-primary btn-xs'> <i class='fa fa-plus' aria-hidden='true'></i> </a>" : ""; #移動 $moveButton = ($k == "title" and $row['icon']['move_i']) ? " <img src='" . WEB_URL . "/class/treeTable/images/move_s.png' class='folder' alt='用來搬移此分類到其他分類之下,請拖曳之,到目的地分類。' title='用來搬移此分類到其他分類之下,請拖曳之,到目的地分類。'> " : ""; #資料夾 $folderButton = ($k == "title" and $row['icon']['folder_i']) ? "<span class='folder'></span>" : ""; $width = ($k == "title") ? "width:65%;" : "width:100%;"; #一般input $html .= " <td class='text-{$format['align']}' style='vertical-align: middle;'> {$folderButton}{$moveButton} <input type='text' name='{$k}[{$row['sn']}]' value='{$row[$k]}' id='{$k}_{$row['sn']}' class='{$k}' style='{$width} padding: 2px 6px;'>{$addLevelButton} </td>"; } elseif ($format['valuetype'] == "yesNo") { if ($row[$k] == 1) { #啟用 $title_0 = ($k == "enable") ? "停用" : "啟用"; $html .= " <td class='text-{$format['align']}' style='vertical-align: middle;'><a href='?op=opUpdateEnable&sn={$row['sn']}&{$k}=0&kind=" . $this->get_kind() . "' title='{$title_0}' atl='{$title_0}'><i class='fa fa-check' aria-hidden='true'></i></a></td>"; } else { #停用 $title_1 = ($k == "enable") ? "啟用" : "停用"; $html .= " <td class='text-{$format['align']}' style='vertical-align: middle;'><a href='?op=opUpdateEnable&sn={$row['sn']}&{$k}=1&kind=" . $this->get_kind() . "' title='{$title_1}' atl='{$title_1}'><i class='fa fa-times' aria-hidden='true'></i></a></td>"; } } elseif ($format['valuetype'] == "btn") { $html .= " <td class='text-{$format['align']}' style='vertical-align: middle;'>\n"; $html .= "<i class='fa fa-sort' aria-hidden='true' style='cursor: s-resize;' title='可直接拉動排序'></i> "; foreach ($format['btn'] as $btnV) { if ($btnV == "view") { } elseif ($btnV == "edit") { $html .= "<a href='?op=opForm&sn={$row['sn']}&kind=" . $this->get_kind() . "' class='btn btn-success btn-xs'>編輯</a> "; } elseif ($btnV == "del") { $html .= "<button type='button' class='btn btn-xs btn-danger btnDel'>刪除</button> "; } } $html .= " </td>\n"; } } $html .= "</tr>\n"; return $html; } ########################################################### # 用流水號 得到自己的層數 ########################################################### public function get_thisLevel($sn, $level = 1) { global $db; if ($level > $this->stopLevel) { return $level; } $sql = "select ofsn from `{$this->tbl}` where sn='{$sn}'"; // die($sql); $result = $db->query($sql) or redirect_header("", 3000, $db->error."\n".$sql,true); list($ofsn) = $result->fetch_row(); if (!$ofsn) { return $level; } return $this->get_thisLevel($ofsn, ++$level); } #以流水號取得某筆分類資料 public function get_rowBYsn($sn) { global $db; if (empty($sn)) { return; } $sql = "select * from `$this->tbl` where sn='{$sn}'"; //die($sql); $result = $db->query($sql) or redirect_header("", 3000, $db->error."\n".$sql,true); $row = $result->fetch_assoc(); return $row; } ####################################################### # 取得父類別選單->選項(後台類別表單用)# op_form ####################################################### public function get_ofsnOption($default, $ofsn = 0, $level = 1, $indent = "", $enable = 0) { global $db; if ($level >= $this->stopLevel) { return; } $andKey = $enable ? " and `enable='{$enable}'`":""; $downLevel = $level + 1; $indent .= " "; $sql = "select * from `{$this->tbl}` where ofsn='{$ofsn}' and kind='{$this->kind}'{$andKey} order by sort"; //die($sql); $result = $db->query($sql) or redirect_header("", 3000, $db->error."\n".$sql,true); $options = ""; while ($row = $result->fetch_assoc()) { $selected = ($default == $row['sn']) ? " selected" : ""; $options .= "<option value='{$row['sn']}'{$selected}>{$indent}{$row['title']}</option>\n"; $options .= $this->get_ofsnOption($default, $row['sn'], $downLevel, $indent, $enable); } return $options; } }