次選單功能是本題組中較為複雜,但說明卻相對模糊的功能,這裏我們採用較直覺的做法來解題,依照題目給出的參考圖來看,題目希望次選單的新增/修改/刪除都在彈出視窗中完成。
由於一個畫面的表單中要同時具有增改刪查的功能,因此我們無法延用先前製作的API或彈出視窗表單來處理次選單的功能,所以次選單的API單獨一支程式來處理,因此我們在 ./view/backend/menu.php
的彈出視窗的按鈕參數上採用指定路徑檔名的方式來處理,而不是和先前幾個功能一樣採用帶入資料表變數的方式。
/Controller/Menu.php
1 2 3 4 5 6 7 8 9 10
| ---------------------------------- $view=['header'=>'選單管理', 'table'=>$this->table, 'rows'=>$rows, 'addbtn'=>'新增主選單', 'modal'=>"./view/modal/menu.php", 'updateModal'=>"./view/modal/submenu.php", 'updateBtn'=>"編輯次選單" ];
|
建立彈出視窗表單
/view/modal/submenu.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| <!--因為是獨立的功能,而且會使用到資料表,所以要先include base.php進來使用--> include_once "../../base.php";
$subs=$Menu->all(['main_id'=>$_GET['id']]);
?> <h3 class="cent">編輯次選單</h3> <hr> <!--編輯次選單的api為獨立的一支,不和edit.php共用--> <form action="./api/submenu.php" method='post' enctype="multipart/form-data"> <table style="width:70%;margin:auto" id="submenu"> <tr> <td>主選單名稱:</td> <td>選單連結網址:</td> <td>刪除</td> </tr> <?php /** * $subs 有可能是沒有資料的 ,但沒資料就不會印出任何東西, * 所以這邊就不再特別去判斷$subs是否有值 */ foreach($subs as $sub){ ?> <tr> <td><input type="text" name="text[<?=$sub['id'];?>]" value="<?=$sub['text'];?>"></td> <td><input type="text" name="href[<?=$sub['id'];?>]" value="<?=$sub['href'];?>"></td> <td><input type="checkbox" name="del[<?=$sub['id'];?>]" value="<?=$sub['id'];?>"></td> </tr> <?php } ?> </table> <div class="cent"> <input type="hidden" name="table" value="menu"> <!--將主選單的id加入到隱藏欄位中, 讓後台的api知道這個表單的次選單資料是屬於那個主選單的--> <input type="hidden" name="main_id" value="<?=$_GET['id'];?>"> <input type="submit" value="修改確認"> <input type="reset" value="重置"> <input type="button" value="更多次選單" onclick="more()"> </div> </form> <script> /** * 新增次選單的js函式 */ function more(){ let row=`<tr> <td><input type="text" name="text2[]"></td> <td><input type="text" name="href2[]"></td> <td></td> </tr>` $("#submenu").append(row); } </script>
|

在API的部份,我們透過表單中的name屬性命名(text vs text2 ; href vs href2),區分出那些資料是屬於新增的,而那些資料是屬於改和刪的。
建立次選單編輯api
/api/submenu.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| include_once "base.php";
if(isset($_POST['text'])){
foreach($_POST['text'] as $id => $text){
if(isset($_POST['del']) && in_array($id,$_POST['del'])){ $Menu->del($id); }else{
$row=$Menu->find($id);
$row['name']=$text; $row['href']=$_POST['href'][$idx];
$Menu->save($row); } } }
if(isset($_POST['text2'])){
foreach($_POST['text2'] as $idx => $text){
if($text!=''){
$Menu->save([ 'text'=>$text, 'href'=>$_POST['href2'][$idx], 'sh'=>1, 'main_id'=>$_POST['main_id'] ]); } } }
to("../backend.php?do=".$_POST['table']);
|