:::

7. 後台發布文章界面

一、將後台整理成函式

  1. 編輯 admin/index.php
  2. 先將上傳部份獨立出一個 uploads() 函式,記得傳入 $id,因為路徑會用到。裡面也要判斷有無 $id ,若無,就直接跳出函式即可。
    // 檔案上傳
    function uploads($id)
    {
        // 若沒編號就跳出
        if (empty($id)) {
            return;
        }
    
        // 依序讀出檔案
        foreach ($_FILES['files']['name'] as $i => $filename) {
            // 若沒檔案就中斷
            if (!$filename) {
                break;
            }
            if ($_FILES['files']['error'][$i] === UPLOAD_ERR_OK) {
    
                // 讓檔案放在文章編號的目錄下,比較方便管理,檢查有無該目錄
                if (!is_dir(_PATH . "/uploads/{$id}")) {
                    // 若無建立原檔目錄
                    mkdir(_PATH . "/uploads/{$id}");
                    // 順便建立縮圖目錄
                    mkdir(_PATH . "/uploads/{$id}/thumbs");
                }
    
                // 暫存檔來源
                $file = $_FILES['files']['tmp_name'][$i];
                // 副檔名
                $ext = pathinfo($filename, PATHINFO_EXTENSION);
                // 圖片的前置字串
                $prefix = date('YmdHis');
                // 原圖欲放置到哪裡
                $dest = _PATH . "/uploads/{$id}/{$prefix}-{$i}.{$ext}";
    
                if ($ext == 'mp4') {
                    // 縮圖欲放置到哪裡
                    $thumb_dest = _PATH . "/uploads/{$id}/thumbs/{$prefix}-{$i}.jpg";
    
                    // 將檔案移至指定位置
                    if (move_uploaded_file($file, $dest)) {
                        // 物件設定
                        $ffmpeg = FFMpeg\FFMpeg::create(array(
                            'ffmpeg.binaries' => _PATH . '/ffmpeg/bin/ffmpeg.exe',
                            'ffprobe.binaries' => _PATH . '/ffmpeg/bin/ffprobe.exe',
                            'timeout' => 3600, // The timeout for the underlying process
                            'ffmpeg.threads' => 12, // The number of threads that FFMpeg should use
                        ));
                        // 開啟影片
                        $video = $ffmpeg->open($dest);
                        // 擷取畫面
                        $video
                            ->frame(FFMpeg\Coordinate\TimeCode::fromSeconds(10))
                            ->save($thumb_dest);
                        // 製作縮圖
                        $image = Image::make($thumb_dest)->resize(480, 480, function ($constraint) {
                            $constraint->aspectRatio();
                            $constraint->upsize();
                        })->save($thumb_dest);
                    } else {
                        die("無法將檔案{$file}上傳至指定位置{$dest}");
                    }
                } else {
                    // 縮圖欲放置到哪裡
                    $thumb_dest = _PATH . "/uploads/{$id}/thumbs/{$prefix}-{$i}.{$ext}";
    
                    // 將原圖縮成1600大圖
                    $image = Image::make($file)->resize(1600, 1600, function ($constraint) {
                        $constraint->aspectRatio();
                        $constraint->upsize();
                    })->save($dest);
    
                    // 再將大圖縮成480小圖
                    $image = Image::make($dest)->resize(480, 480, function ($constraint) {
                        $constraint->aspectRatio();
                        $constraint->upsize();
                    })->save($thumb_dest);
                }
    
            } else {
                die("上傳錯誤:{$_FILES['files']['error'][$i]}");
            }
        }
    }

     

  3. 將儲存部份做 store() 函式,並傳回流水號 $id(流程會用到)
    // 儲存文章
    function store()
    {
        global $db;
        // 寫入資料庫
        $sql = "INSERT INTO `articles`
        (`title`, `info`, `date`, `content`, `cate_id`)
        VALUES(?, ?, ?, ?, ?)";
        $sth = $db->prepare($sql);
        $values = [
            $_POST['title'],
            $_POST['info'],
            $_POST['date'],
            $_POST['content'],
            $_POST['cate_id'],
        ];
        $sth->execute($values);
    
        // 取得該資料的流水號
        $id = $db->lastInsertId();
    
        // 檔案上傳
        uploads($id);
        return $id;
    }

     

二、將後台加上流程控制

  1. 加上該有的變數過濾,$op 的預設值可以暫時用 create,也就是建立文章的意思,等會兒得用他來引入樣板。
    // 過濾外來變數
    $op = isset($_REQUEST['op']) ? filter_var($_REQUEST['op'], FILTER_SANITIZE_STRING) : 'create';
    

     

  2. 加上switch()流程控制,暫時不需要有 default 也沒關係(若要有也應該是執行 create 建立文章的動作),執行儲存後,可以直接利用傳回的編號,將會面重新導引到上一層的 index.php 其顯示文章畫面。
    switch ($op) {
        // 儲存文章
        case 'store':
            $id = store();
            //執行後轉向到該頁面
            header("location: ../index.php?op=show&id=$id");
            exit;
    }
    
  3. 一樣使用相同的 index.tpl 樣板來呈現畫面,同時務必也將 $op 值送至樣板,因為我們要靠它引入子樣板。另外,後台其實用不到 $cate_id,但是導覽列 nav.tpl 會用到,所以,可以送一個 $cate_id 過去,其值設為 0 即可(沒送的話,導覽列會有注意訊息出現)
    $smarty->assign('op', $op);
    $smarty->assign('cate_id', 0);
    $smarty->display('index.tpl');

     

  4. 最後看起來像這樣:
    <?php
    use Intervention\Image\ImageManagerStatic as Image;
    require_once '../header.php';
    
    // 過濾外來變數
    $op = isset($_REQUEST['op']) ? filter_var($_REQUEST['op'], FILTER_SANITIZE_STRING) : 'create';
    
    switch ($op) {
        // 儲存文章
        case 'store':
            $id = store();
            //執行後轉向到該頁面
            header("location: ../index.php?op-=show&id=$id");
            exit;
    }
    
    $smarty->assign('op', $op);
    $smarty->assign('cate_id', 0);
    $smarty->display('index.tpl');
    
    // 儲存文章
    function store()
        ...略...
    }
    
    // 檔案上傳
    function uploads($id)
    {
        ...略...
    }
    

     


:::

書籍目錄

展開 | 闔起

https%3A%2F%2Fcampus-xoops.tn.edu.tw%2Fmodules%2Ftad_book3%2Fpage.php%3Ftbsn%3D52%26tbdsn%3D1830

計數器

今天: 4119411941194119
昨天: 5069506950695069
總計: 5134567513456751345675134567513456751345675134567