0%

[技能檢定]題組一 步驟8 撰寫後台資料列表功能

完成新增資料後,接下來就是要可以在畫面上看到新增資料的結果,我們把這個工作拉回類別中,由類別中的 view() 方法來引入html模版,而畫面中需要的資料會打包成一個陣列後,在引入模版前透過extract()這個函式把陣列中的變數都解封,如此一來就可以直接在html模版中使用這些變數了。

  1. /Controller/Title.php 新增一個方法 backend()

  2. backend() 方法中我們會使用 view() 來引入 /view/backend/title.php 這個模板檔案

  3. backend() 方法中以陣列的方式建立起模板需要的資料內容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16

    //沒有宣告封裝屬性的方法視為public可供外部存取
    function backend(){
    //以陣列的方式建立模版需要的資料
    $view=['header'=>'網站標題管理', //功能頁上面的名稱字串
    'table'=>$this->table, //資料表名稱
    'rows'=>$this->all(), //全部的資料
    'addbtn'=>'新增網站標題圖片', //新增按鈕的文字字串
    'modal'=>"./view/modal/title.php?table=".$this->table, //要引入的彈出視窗表單檔案,並加上網址參數
    'updateModal'=>"./view/modal/updateTitle.php?table=".$this->table, //更新圖片的表單檔案
    'updateBtn'=>"更新圖片"
    ];

    //使用view()來引入html頁面並將需要資料帶入
    return $this->view('./view/backend/title.php',$view);
    }
  4. 原本我們在backend.php中是使用網址參數來判斷要引入那個頁面的,現在物件本身就可以產生後台的資料列表了,因此我們修改一下原本 backend.php 中關於引入各功能頁面的寫法
    /backend.php

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $do=$_GET['do']??'title';
    $file="./view/backend/".$do.".php";

    //將網址參數首字母轉為大學
    //比如$do='title' ucfirst($do) => Title
    $table=ucfirst($do);

    //使用可變變數來執行物件中的backend()方法
    //比如$table='Title' $$table => $Title
    $$table->backend();

    /**
    * 原本的程式碼中有判斷如果引入的檔案不存在則會預設載入title.php
    * 可以將這段判斷的方式寫到類的DB.php中
    */
  5. 修改 /view/backend/title.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
    60
    61
    62
    63
    64
    65
    <div style="width:99%; height:87%; margin:auto; overflow:auto; border:#666 1px solid;">
    <!--這邊是用來放置各功能的名稱-->
    <p class="t cent botli"><?=$header;?></p>
    <!--表單統一傳送到edit.php這支api,可處理多個資料表-->
    <form method="post" action="./api/edit.php">
    <table width="100%">
    <tbody>
    <tr class="yel">
    <td width="45%">網站標題</td>
    <td width="23%">替代文字</td>
    <td width="7%">顯示</td>
    <td width="7%">刪除</td>
    <td></td>
    </tr>
    <?php
    /**
    * 這邊可以直接使用$rows來列出資料
    */
    foreach($rows as $row){
    ?>
    <tr>
    <td width="45%">
    <img src="./upload/<?=$row['img'];?>" style="width:300px;height:30px">
    </td>
    <td width="23%">
    <!--注意name的欄位中,除了因為多筆資料而使用陣列方式外,我們將資料的key設成資料的id
    這是為了方便後端程式判斷目前的這個資料是屬於資料表中那一個id的資料-->
    <input type="text" name="text[<?=$row['id'];?>]" value="<?=$row['text'];?>">
    </td>
    <td width="7%">
    <input type="radio" name="sh" value="<?=$row['id'];?>" <?=($row['sh']==1)?'checked':'';?>>
    </td>
    <td width="7%">
    <input type="checkbox" name="del[<?=$row['id'];?>]" value="<?=$row['id'];?>">
    </td>
    <td>
    <!--這邊加入一個按鈕用來顯示更新圖片的表單,要注意的是我們在網址參數中加了id及table
    這樣方便載入的表單可以自動取得需要的參數-->
    <input type="button"
    onclick="op('#cover','#cvr','<?=$updateModal;?>?table=<?=$table;?>&id=<?=$row['id'];?>')" value="<?=$updateBtn;?>">
    <!--按鈕的文字也是在backend()方法中就寫好的,直接使用即可-->
    </td>
    </tr>
    <?php } ?>
    </tbody>
    </table>
    <table style="margin-top:40px; width:70%;">
    <tbody>
    <tr>
    <td width="200px">
    <!--新增資料的按鈕中會帶入表單檔案的位置,value的文字也是backend()中寫好的-->
    <input type="button"
    onclick="op('#cover','#cvr','<?=$modal;?>')" value="<?=$addbtn;?>">
    </td>
    <td class="cent">
    <!--隱藏欄位用來表示這個功能的資料表-->
    <input type="hidden" name='table' value='<?=$table;?>'>
    <input type="submit" value="修改確定">
    <input type="reset" value="重置">
    </td>
    </tr>
    </tbody>
    </table>
    </form>
    </div>
  6. 我們所修改的 /view/backend/title.php 中除了中間的列表每個功能的欄位會有不同外,其它需要變數代入的地方都是不變的,所以這個檔案可以當成其他功能的範本,只要在各類別中定義好變數的內容就好。

  7. 完成後即可在新增資料後馬上看到資料。