如果想要使用Ajax的話,因為Ajax是寫在一個頁面里面的,那么也就是說必須要先顯示個頁面出來,先顯示一個靜態的文件,然后我們可以在這個靜態的文件里面寫Jquery,通過Ajax
來調數據讀數據。所以首先先做一個操作方法,這個操作方法來顯示一個頁面。
用下面這個方法來輸出一下TP的所有常量的值
<?php namespace Home\Controller; use Think\Controller; class TestController extends Controller //如果不繼承父類它就不是一個操作方法。 { public function index(){ var_dump(get_defined_constants(true)); } }
顯示結果如下圖:
如果這里面出現的常量沒有出現雙下划線的,只能是嵌在標記里面來用。(也就是定界符里面需要進行解析來使用)
有雙下划線的直接用就行,不用寫標記。
<?php namespace Home\Controller; use Think\Controller; class IndexController extends Controller { public function index(){ echo "歡迎使用ThinkPHP"; } public function ceshi(){ $this->show(); } public function shuju(){ //沒有傳值,直接用這個操作方法來讀取數據庫,會得到一個二維數組,然后把這個數組編碼成Json返回 $n = M("Nation"); $arr = $n->select(); //調用這個select方法就可以調取所有數據了。讀到的數據是個二維數組。 //讀完數據后就要返回數據,之前用的方法是直接用echo輸出就可以了。但這因為是TP框架里面,就不能直接用echo了 //我們必須使用TP框架自帶的方法,這個方法是控制器里面的方法。是控制器里面帶的。所以要用$this過來調用 $this->ajaxReturn($arr); //調該方法返回數據。括號內要寫你要返回的數據。 //這個ajaxReturn括號里面可以有兩個參數。第一個數據是你要返回的數據,第二個參數是你要返回數據的類型 //因為這個ajaxRenturn是默認返回Json的,所以不寫的話也是返回Json。給個二維數組它會自動編碼成Json 返回字符串的話參數寫eval } }
需要在View內建個與操作方法相對應的模板文件出來
再打開ceshi.html文件來寫個模板:
<title>無標題文檔</title> <script src="__ROOT__/Public/js/jquery-1.11.2.min.js"></script> </head> <body> <select id="nation"> </select> </body> <script type="text/javascript"> $.ajax({ url:"__CONTROLLER__/shuju", //這個url我應該是調當前這個控制器里面的另外一個操作方法叫做數據。 //所以我就先用這個雙下划線controller找到當前控制器所在的路徑,然后在后面拼上這個shuju的方法這樣就可以了 //第二個data不需要傳參數就不用寫data了,因為是查詢所有數據。 dataType:"JSON", success:function(data){ //這個返回的數據data是個Json二維數組,所以應該從這個二維數組里邊遍歷數據然后顯示 var str = ""; //定義一個空字符串 for(var k in data){ //定義一個變量,這個變量就是遍歷出來的每一條。這個遍歷出來的k是索引不是值。 str = str+"<option value='"+data[k].code+"'>"+data[k].name+"</option>"; //里面包含了兩列,一列叫做Code一列叫做Name 要取code的值就可以直接.code命令。 //通過上面那個str循環就能造出很多個<option>,造完之后再把所有的<option>扔到<select>里面。 //data取索引k是能夠取到這個二維數組的每一項值的。data二維的取索引k取到的是個一維的,這個一維的里面包含了兩列,一列叫做Code一列叫做Name 要取code的值就可以直接.code命令。 } $("#nation").html(str); } }); </script> </html>
在這個模板文件里面需要引入Jquery文件怎么引入?
將這個Jquery文件放在上圖的位置時再到模板文件ceshi.html文件里面引入即可使用。
TP框架里面的Session Cook緩存。
在ThinkPHP里面不用開啟session了,直接用就可以。
關於Cookie
判斷session的值是否為空用到的方法:
思路:就是在父類的構造函數里面加上限制條件,加上判斷條件。因為所有的控制器都繼承父類controller,controller是TP框架自帶的一個父類。雖然不能去更改里面的配置內容,
那就在controller和所有控制器中間加一個中間類,讓這個類當作父類,所有控制器繼承這個類,然后這個中間類再繼承controller。也就是自己再做一個父類,做的這個父類是所有控制器的父類,也就是做的這個中間類。但是做的這個父類還要依然繼承controller。這樣的話每一個控制器在造的時候都會執行我們造的這個中間類父類里面的構造函數,都會進行判斷,所以說就可以不用在每個控制器里面都添加限制條件了。
首先在Controller文件夾里面新建一個LoginColler.class.php登錄的控制器,這個登錄的控制器比較特殊,因為它不能繼承父類,它在執行的時候它里面是沒有session的值的。所以說這個控制器是個個例。
<?php namespace Home\Controller; use Think\Controller; class LoginController extends Controller { public function login(){ //只要訪問這個登錄的話就要實現兩個邏輯,第一個邏輯是要顯示頁面,第二個邏輯是執行登陸代碼。 if(empty($_POST)){ $this->show(); //如果判斷這個post數組沒有提交數據的話,就過來顯示登錄頁面。 }else{ //如果有提交過來的數據的話,就實現登錄的邏輯。先在View文件夾下面建個Login文件夾里面建個login.html。這里面來做登錄的界面 $uid = $_POST["uid"]; $pwd = $_POST["pwd"]; $n = M("users"); $arr = $n->find($uid); if($arr["pwd"]==$pwd && !empty($pwd)){ session("uid",$uid); echo "登錄成功!"; }else{ echo "登錄失敗!"; } } } }
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>無標題文檔</title> <script src="__ROOT__/Public/js/jquery-1.11.2.min.js"></script> </head> <body> <h1>登陸界面</h1> <form action="__ACTION__" method="post"> <div>用戶名:<input type="text" name="uid" /></div> <div>密碼:<input type="text" name="pwd"/></div> <input type="submit" value="登錄"/> </form> </body> </html>
做好了登錄界面之后我們就可以去建父類文件了。
在Home模塊Controller控制器下新建一個BaseController.class.php所有控制器都要繼承的父類控制器。
這個Controller.class.php父類文件里面是有構造函數的,我們在面向對象里面學了哈,如果說我在子類里面寫一個同名函數的話就相當於對父類的函數進行重寫,
這個父類Controller.class.php里面的構造函數必須要執行的,如果不執行的話,這個控制器是不能使用的。所以說我們做了一個構造函數,這個構造函數不能覆蓋父類的,
你可以對它進行重寫,但是不能把父類的給覆蓋掉。你應該再把父類里面的內容再給調一下,需要執行一遍父類的。
BaseController.class.php(父類文件):
<?php namespace Home\Controller; use Think\Controller; class BaseController extends Controller{ //我們在這個類里面做一個構造函數,在這個構造函數里面我們是要加控制條件的。 //構造函數 public function __construct(){ //調用父類的構造 parent::__construct(); //寫session控制 if(session("?uid")){ //如果uid存在的話就可以登錄並且干其他的事情 }else{ //如果uid不存在的話,說明沒有走登錄。沒有走登錄這時候就要跳轉頁面了。然后就不再執行下面的內容了 //$url = U("Login/login"); //下面跳轉方法里面的第一個參數寫路徑的時候首先在上面用U方法生成一個路徑防止寫錯。 $this->redirect("Login/login"); exit; //這樣的話我們就把這個父類給做好了,這個父類就是個構造函數了。所有的其他類都要繼承這個類。除了LoginController.class.php之外。 } } }
然后再找到Home模塊下,所有的控制器,都讓它繼承這個BaseController.class.php文件。
但是這個LoginController.class.php文件類不能繼承BaseController.class.php父類文件而讓它直接繼承它爺爺Controller.class.php如下圖:
這三個類分別是EmptyController.class.php MainController.class.php IndexController.class.php 都繼承我們自己寫的這個父類BaseController.class.php
那么現在再去訪問Home模塊下Index控制器的ceshi的操作方法,由於第一次訪問,沒有走登錄,沒有登錄的話就沒有session,沒有session的話它就應該跳轉到登錄頁面進行登錄。
注釋:
TP框架自帶的跳轉頁面方法:
總結:做一個父類,來控制防止繞過登錄。這種方法要必須會使用。