在前幾講里,我們逐漸實現了自己小模塊的新聞列表展示、新聞詳情展示功能,現在您已經初步有能力開發一個phpWeChat小模塊了,本文將在已開發的hello world模塊基礎上,增加一個新的功能——新聞投稿。
今天我們進入《10天學會phpWeChat》系列教程的第五天:實現新聞投稿功能,通過今天的學習,希望大家對phpWeChat的表單提交、數據入庫有個清晰的認識。
我們定義,投稿的鏈接為:http://www.example.com/index.php?m=hello&a=tougao,如同以前的情況,目前直接訪問改地址,肯定是報模板不存在的錯誤的,針對這個鏈接我們需要建立對應的模型處理函數、控制器路由以及對應的視圖文件。
1、創建投稿視圖文件 template/default/tougao.html
在視圖文件里,我們創建一個表單用來提交文章數據
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 5 <title>投稿</title> 6 </head> 7 8 <body> 9 <form action="{U('hello','tougaosave')}" method="post" name="tougaoform"> 10 標題:<input type="text" name="info[title]" size="36" /> 11 <br /> 12 內容:<textarea name="info[content]" cols="55" rows="5"></textarea> 13 <br /> 14 <input type="submit" value="投稿" /> 15 </form> 16 </body> 17 </html>
訪問http://www.example.com/index.php?m=hello&a=tougao,效果如下:
在以上的視圖表單代碼中,我們定義了form提交后的action為http://www.example.com/index.php?m=hello&a=tougaosave。因此我們需要在控制器里添加這個case 'tougaosave':路由來實現對應的數據保存邏輯。
2、編輯前端控制器文件index.php
1 <?php 2 use wechat\hello\hello; 3 use phpWeChat\Area; 4 use phpWeChat\CaChe; 5 use phpWeChat\Config; 6 use phpWeChat\Member; 7 use phpWeChat\Module; 8 use phpWeChat\MySql; 9 use phpWeChat\Order; 10 use phpWeChat\Upload; 11 12 !defined('IN_APP') && exit('Access Denied!'); 13 14 switch($action) 15 { 16 case 'index': 17 //從數據表讀取數據並賦給數組$data 18 $data=Hello::dataList(); 19 20 break; 21 case 'detail': 22 $data=Hello::dataGet($id); //$id 可以改成$_GET['id'] 23 break; 24 case 'tougao': 25 26 break; 27 case 'tougaosave': 28 print_r($info); 29 exit(); 30 break; 31 //以下 case 條件僅為 示例。您可以根據業務邏輯自由修改和拓展 32 33 //case 'index': 34 35 //在此寫 index.php?m=hello&a=index 時的邏輯 36 37 //break; 38 39 //case 'list': 40 41 //在此寫 index.php?m=hello&a=list 時的邏輯 42 43 //break; 44 45 //以此類推... 46 47 //case '...': 48 49 //在此寫 index.php?m=hello&a=... 時的邏輯 50 51 //break; 52 53 default: 54 break; 55 } 56 ?>
在以上的控制器中,我們通過
1 case 'tougaosave': 2 print_r($info); 3 exit(); 4 break;
來實現提交的數據處理。這里暫時只打印下數據。
效果如下:
3、編輯模型類文件(include/hello.class.php),增加處理方法來實現數據真正入庫
1 <?php 2 // +---------------------------------------------------------------------- 3 // | phpWeChat hello 操作類 Last modified 2016-12-28 00:02:22 4 // +---------------------------------------------------------------------- 5 // | Copyright (c) 2009-2016 phpWeChat http://www.phpwechat.com All rights reserved. 6 // +---------------------------------------------------------------------- 7 // | Author: 騎馬的少年 <phpwechat@126.com> <http://www.phpwechat.com> 8 // +---------------------------------------------------------------------- 9 namespace wechat\Hello; 10 11 use phpWeChat\Area; 12 use phpWeChat\CaChe; 13 use phpWeChat\Config; 14 use phpWeChat\DataInput; 15 use phpWeChat\DataList; 16 use phpWeChat\Member; 17 use phpWeChat\Module; 18 use phpWeChat\MySql; 19 use phpWeChat\Order; 20 use phpWeChat\Upload; 21 22 class Hello 23 { 24 public static $mPageString=''; // 這個靜態成員是系統自帶,請勿刪除 25 private static $mArticleTable='wechat_hello_article'; 26 27 static public function dataList() 28 { 29 //DB_PRE常量是phpWeChat自帶常量,指數據表前綴。 30 31 $data=MySql::fetchAll("SELECT * FROM `".DB_PRE.self::$mArticleTable."` ORDER BY `id` DESC"); 32 33 return $data; 34 } 35 36 static public function dataGet($id) 37 { 38 //DB_PRE常量是phpWeChat自帶常量,指數據表前綴。 39 40 $id=intval($id); 41 42 $data=MySql::fetchOne("SELECT * FROM `".DB_PRE.self::$mArticleTable."` WHERE `id` =".$id); 43 44 return $data; 45 } 46 47 static function dataInsert($data) 48 { 49 return MySql::insert(DB_PRE.self::$mArticleTable,$data); 50 } 51 } 52 ?>
在模型文件中,我們定義了dataInsert()方法來實現數據的數據庫插入,此時我們正式修正控制器的操作:
4、最終的前端控制器文件index.php
1 <?php 2 use wechat\hello\hello; 3 use phpWeChat\Area; 4 use phpWeChat\CaChe; 5 use phpWeChat\Config; 6 use phpWeChat\Member; 7 use phpWeChat\Module; 8 use phpWeChat\MySql; 9 use phpWeChat\Order; 10 use phpWeChat\Upload; 11 12 !defined('IN_APP') && exit('Access Denied!'); 13 14 switch($action) 15 { 16 case 'index': 17 //從數據表讀取數據並賦給數組$data 18 $data=Hello::dataList(); 19 20 break; 21 case 'detail': 22 $data=Hello::dataGet($id); //$id 可以改成$_GET['id'] 23 break; 24 case 'tougao': 25 26 break; 27 case 'tougaosave': 28 //print_r($info); 29 30 $op=Hello::dataInsert($info); 31 32 if($op) 33 { 34 echo '文章投稿成功,ID為'.$op; 35 } 36 else 37 { 38 echo '文章投稿失敗'; 39 } 40 exit(); 41 break; 42 //以下 case 條件僅為 示例。您可以根據業務邏輯自由修改和拓展 43 44 //case 'index': 45 46 //在此寫 index.php?m=hello&a=index 時的邏輯 47 48 //break; 49 50 //case 'list': 51 52 //在此寫 index.php?m=hello&a=list 時的邏輯 53 54 //break; 55 56 //以此類推... 57 58 //case '...': 59 60 //在此寫 index.php?m=hello&a=... 時的邏輯 61 62 //break; 63 64 default: 65 break; 66 } 67 ?>
此時提交表單,提示如下圖所示:
我們訪問:http://www.example.com/index.php?m=hello&a=index 模塊首頁鏈接,則剛才投稿的文章已經顯示出來:
至此,一個帶有前端投稿功能的小模塊順利完成。我們離畢業已經越來越近了!:)