留言板小程序開發筆記3

在vim中的 "刪除到" 命令, 使用 dt"關鍵字符", 這裏的關鍵字符 包括: "space"空格, 這個是很強大,頗有用的~

若是嚴格地寫代碼, 那麼, 在定義本身的controller類的時候, 裏面的函數方法, 仍是 應該明確的 寫成public, protected, private等訪問權限方式!

若是使用tp, 則導入:外部的css和js, 可使用tp的簡化方式:javascript

  1. import標籤, 指明 type屬性, 和file屬性.
    type指明是css仍是js, 默認是js能夠不寫.
    file指明文件的時候, 路徑直接從 /Public/寫起, 並且不用寫擴展名, 由於前面已經指明瞭文件類型的
    因爲 import是相似 Think的命名空間函數, 因此 在寫路徑的時候, 要用點號而不用 斜槓;php

  2. load 或 css js標籤
    這個就很簡單直接了:
    直接就只是一個 href屬性就好了. 直接寫完整路徑就行了.
    ... css


獲取 系統輸入變量值 (這裏僅僅是針對 系統變量的 "獲取輸入值")html

  1. 傳統的方式是直接使用 $_GET, $_POST 等 可是這個方式不安全, 由於沒有安全過濾方式
  2. 因此, 既然使用的是tp, 就要用tp的方式去獲取系統變量.(自定義變量的值須要本身去定義..)
  3. 要獲取系統變量的值, 這裏主要指的是 $_GET, $_POST, 就 用 I 函數.
  4. I函數 的語法是: I('變量類型.變量名', ['默認值'], ['過濾函數'])
  5. 即便你不寫過濾函數, tp也給你定義了 默認 的過濾函數: 'DEFAULT_FILTER' => 'htmlspecialchars'.因此它 的安全機制就在這裏. 固然你也能夠本身寫本身的過濾函數.前端

  6. 一般的寫法是: I('post.editorValue'). 系統變量的 類型不分大小寫, 而變量自己 要嚴格區分大小寫. get和post能夠用param來表示, 而默認的類型就是param, 因此若是是get或post, 能夠不寫變量類型, 直接就是 I('變量名稱').java


很重要的一點是, 使用 百度在線編輯器的時候, 請使用 Ueditor的版本, 不要使用 Umeditor的版本. 我原來使用umeditor就沒有出來, 而是要ueditor的版本就順利出來了.

如何禁用ueditor自動保存功能?

有兩種方法,
一是, 從 ueditor.all.js的 23910行 - 到 - 24038行, 註釋掉, 就行了: 即註釋掉 UE.plugin.register('autosave', function()...

二是, 將saveInterval 的時間設置得 大些

如 設置: `saveInterval: (606024*1000) (單位是ms)mysql


關於Xss攻擊和xss白名單過濾
跨站腳本攻擊(也稱爲XSS)指利用網站漏洞從用戶那裏惡意盜取信息。 用戶在瀏覽網站、使用即時通信軟件、甚至在閱讀電子郵件時,一般會點擊其中的連接。 攻擊者經過在連接中插入惡意代碼,就可以盜取用戶信息。 攻擊者一般會用十六進制(或其餘編碼方式)將連接編碼,以避免用戶懷疑它的合法性。 網站在接收到包含惡意代碼的請求以後會產成一個包含惡意代碼的頁面, 而這個頁面看起來就像是那個網站應當生成的合法頁面同樣。 許多流行的留言本和論壇程序容許用戶發表包含HTML和javascript的帖子。 假設用戶甲發表了一篇包含惡意腳本的帖子,那麼用戶乙在瀏覽這篇帖子時, 惡意腳本就會執行,盜取用戶乙的session信息jquery

人們常常將跨站腳本攻擊(Cross Site Scripting)縮寫爲CSS, 但這會與層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆。 所以有人將跨站腳本攻擊縮寫爲XSS。若是你聽到有人說 「我發現了一個XSS漏洞」,顯然他是在說跨站腳本攻擊。linux

過濾xss 一般的 javascript腳本攻擊, 是過濾掉 雙引號和 尖括號, 可是也不是徹底的, 還有不少種方法進行 xss攻擊.css3

也就是說, 當你點擊一個外部的(cross site)站點時, 這個 頁面會執行一些js腳本, 而這個腳本會"悄悄的"執行, 它不會有什麼輸出和彈出框, 可是實際上它的代碼 是在和你的站點之間進行交互, 如發生數據, 請求和響應信息, 從而盜取你的站點上的cookie / session 中的信息...


爲何表單元素的jquery選擇器要直接用冒號 :選擇器?
由於表單元素用input type="..."的較多, 若是仍是用屬性選擇器, 就會顯得比較麻煩, 因此就直接用 冒號選擇符來選擇了, 如: $(':submit')

注意, ueditor提供的api等函數, 是供前端頁面使用的, 後臺php頁面是沒有辦法使用這些函數api的

在使用一些外部的框架的時候, 若是要"排錯/debug/修改功能"時, 能夠 在外部css/js中調整, 也能夠 直接修改 源代碼!

ue和um的區別? um是ue的精簡版, 主要用在百度貼吧, 其中ue使用的是iframe結構, 而um使用的是div的 結構! 如今使用的較多的是 v1.4.3版本

overflow: 並非一個固定的總體, 能夠分別設置: overflow-x, overflow-y: auto;

如何判斷是否有最後一行的空格?
在editplus或vim中有行號的狀況下, 若是有空格的空行, 是會顯示行號的

對於php文件, 惟一的是 要在 文件的開頭, 加上 <?php標籤就行了

正則表達式中的 \s \S \b 的區別?
\b表示 border, 邊界, 包括 單詞/字符的 "開頭, 結尾, 空格 回車等 位置", 注意匹配的是位置,不是真的字符, 它不匹配字符的;
\s表示 space, 空格, 是要匹配 "空格字符"的
.點號表示的是任意字符.
表示的是任意個數(包括0個, 即沒有)
所以, 若是沒有字數限制的話就是 : (.
) 如 a(.*)b能夠匹配: ab, a1b, a12b, ...
而 大寫的\S則表示 否認的 意思, 即 \S表示 非空字符...

關於thinkphp中的數據庫操做?

  1. 增長和更新的區別: 增長記錄是add, 而更新記錄是save(save表示通過修改後, 再次 "保存" 修改後的內容).看看word 的操做
  2. 無論是什麼數據庫操做, 都須要有 數據對象. 要建立數據對象, 數據對象能夠用 數組或對象 來表示, 要建立數據對象, 能夠用 data方法: 即 ->data($data);
  3. add 或 save 方法, 你能夠直接傳入數據對象, 如 ->add($data); 可是一般的作法是 先建立數據對象, 而後再 直接調用 空 參數的add, 或 save方法: $M->data($data)->add();
  4. 建立對象的方式有兩種, 一種是data, 一種是create(create用於直接從 post過來的數據中 建立數據對象).
  5. tp支持多種方式的數據對象, 如: 字符串, 數組, 對象. 可是推薦使用 數組的方式;
  6. 數組的方式有 兩種定義: 一種是 採用中括號的方式, 如 $data['msger'] = $msger; .... 的方式, 另外一種是 採用 數組定義的方式: $data =array('msger' => $msger, ....); 可是好像 第一種方式比較經常使用, 可是二者的結果很明顯是同樣的!

  7. tp數據庫操做對字段 的過濾和選擇,使用 field方法, 一是, 在select的時候, 使用field方法, 只是查詢 你須要的字段, $M->field('f1, f2,f3')->select(); field字段也支持as別名, 對於複雜的別名/聚合函數操做, 就使用數組的方式; 另外一種是 和create方法結合使用, 建立數據對象: if($M->field('f1,f2,..) ->create()){$M -> add(); 或 $M -> save(); .....}; 這樣即便post有不少字段, 操做時也只有過濾後的字段 被寫入. 這樣就實現了一種安全機制..

真正理解了tp後, 就要把tp由厚讀薄, 先是理解了全部的東西后, 就只是注意掌握和使用最經常使用的功能就好了!! 其餘比較複雜的功能, 只有在遇到的時候, 再去作就好了.

關於註冊/登陸/發表 等操做成功時, 是否須要給予提示?


建議是:不要提示註冊成功, 直接引導用戶到 想要進行的操做就行了...
用來註冊的 from,當註冊成功後,再顯示提示信息沒有任何意義。
你能夠用 不少方法來讓引導用戶 讓他知道已經註冊成功了,好比,原來不能下載的,下載連接出現了,原來不能看的內容,如今顯示出來了能夠。用戶註冊就是爲了繼續他未能完成的操做。


在使用thinkphp, 作form表單提交的時候, 最好將處理頁面 裏面, 寫上 $this->display(); 顯示對應的 html頁面, 不然的話, 會出現" 觸發啓動 迅雷" 等莫名其妙 的問題?!

thinkphp的success和error方法, 指定本身的 模板文件時, 其調用的模板 的參考起始位置是::: 同一個控制器如, AnnController , 所對應的 View視圖目錄/控制器名稱目錄Ann/下的模板文件. 好比, 模板文件參數是 'Public/some' . 就是View/Ann/Public/some.html. 注意, 指定模板文件參數時, 不須要指定html 後綴名.因此, 這裏就用的是Public/some, 而不是Public/some.html


很是重要的: 如何在跨 控制器之間 調用方法地址?

  1. 在Home 模塊下, 有多個控制器, 如IndexController, AnnController,LoginController. 那麼在LoginController控制器的方法 checkLogin中,處理邏輯是: 獲取form傳過來的值, 而後查詢數據庫,若是有記錄結果, 說明登陸成功;
  2. 那麼成功後就要跳轉: $this->success('跳轉提示', '$jumpUrl跳轉地址', '等待時間$waitTime' ); 最重要的就是這裏的 跳轉地址了;
  3. 默認的跳轉地址, 如上所說, 調用的模板 的參考起始位置是::: 同一個控制器如, AnnController , 所對應的 View視圖目錄/控制器名稱目錄Ann/下的模板文件. , 老是在同一控制器對應的視圖View/ControllerName/目錄下的html頁面;
  4. 要得到 其餘/另外一 控制器的 方法路徑 頁面, 就要使用 A方法: A('Index/index');
  5. 要注意A方法和R方法的區別, 好像用R方法還不行???

用tp的where方法時, 條件一般用 $condition 或 $map 來表示, 支持 字符串 和 數組方式, 若是條件中, 有變量的話, 最好仍是用 數組的方式. 並且, 使用sprintf的方式, 是爲了 格式檢查, 增長額外的 安全性, 那麼這時, where方法就包含兩個參數了, 一個是 "格式字符串", 另外一個是 傳遞的 變量數組...: $M -> where('id=%d and username=%s and passwd=%s', array($id, $username, $passwd))


html中可使用 頁面中的 javascript的變量值.

調用success方法的時候, 自動會調用 ThinkPHP/Tpl/dispatch_jump.tpl, 並將你設置的success參數, 做爲模板變量, 傳遞到 ThinkPHP/Tpl/dispatch_jump.tpl 生成內容輸出. 同時, 若是你處理提交的頁面, 還調用了 display方法, 那麼對應的 方法的視圖html內容, 還會接着輸出.

對於Application來講, 咱們使用的是mvc模式, 提供的是View視圖目錄.HI

而對於Thinkphp來講, 他的目錄使用的是 模板 模板技術, 因此目錄是Tpl. 

即 應用程序只有View沒有Tpl, 而Thinkphp只有Tpl沒有View

ThinkPHP包含的內容:

根下包含的是:

  • Common是全局的 函數functions.php
  • Conf是全局 的配置目錄
  • Lang是全局的 語言包
  • Tpl是 全局的 模板目錄
  • Library 是核心的庫.

可是前面提到的那些, 都是跟 核心庫 平級的內容.
核心的Library庫目錄, 包括: 行爲Behavior(實際上就是面向切面的設計模式, 就是對於全部的類對象, 都是一致的 "行爲", 封裝起來的東西), 開源組織提供的庫Org(主要包括Net, Util工具類庫), Think提供的核心庫, 第三方開發商提供的類庫Vendor.


弄清楚thinkphp下的各類路徑PATH?

THINK_PATH, 是 ThinkPHP框架的路徑; 不是 Library/Think的路徑~
LIB_PATH, 是Thinkphp下的庫路徑, = THINK_PATH.'Library'.'/';
BEHAVIOR_PATH
CORE_PATH, 這個纔是Controller,Model, Session等支持mvc模式的類庫, 即 Library目錄下的 Think目錄!
VENDOR_PATH

thinkphp中的 "系統變量"? 

  1. 系統變量, 一般使用在 tp的模板中,
  2. 系統變量是指, $_GET, $_POST, $_SESSION 等, 一般在模板中, 以Think. 開頭, 如 Think.get.some_var, Think.post.some_var.
  3. 區分系統變量和系統變量的值: 系統變量是指系統變量的名稱, 一般用在 name屬性後面, 不帶$, 而在value屬性後面須要帶value值的時候, 就要使用系統變量的值: 就要加上 $, 即<empty name="Think.post.some_var" value="$Think.get.var2"> ....</else> ...</empty>
  4. 注意全部點模板標籤的否認, 都用的是 not, 而不是no, 如notempty, notpresent...
  5. 注意區分: present, defined, empty, define, assign等標籤的語義 區別, 和使用的場合:


如何用find測試 元素中是否包含某個 子元素, 從而來判斷用戶是否已經登陸 ? 

  1. 使用find方法, 可是要注意, find方法是 一個方法, 前面要用 對象, 即範圍對象來調用;
  2. find的返回值是一個 jquery 的" 對象", 因此不能用 if來 進行 真假測試!
  3. 再次, 證實了 firefox js控制檯/調試器的 強大威力. 用來排錯js 是很是強大的...

mysql 導出數據庫:


若是客戶端沒有使用ajax提交, 那麼在Controller中即便你調用了ajaxReturn, 也只是返回了數據, 也只是直接顯示在當前方法對應的html頁面中。
可使用login, logout或對應的一組: logon, logoff. 並且, login等寫在一塊兒的, 一般做爲名詞,分開寫的log in等一般做爲動詞...

==================================

$.post(url,[data],[callback],[type])

  1. 返回值: XMLHttpRequest 即一般使用的對象變量xhr.
  2. 經過遠程 HTTP(get、POST)請求"載入信息", 他的目的只是爲了(在頁面html已經載入了的狀況下,)而不從新刷新/從新載入當前頁面的狀況下,再次向遠程頁面請求 載入一些 額外的信息.(一般是和頁面中的一些jquery 點擊事件相結合使用)。

  3. 最重要的是,js方法中的缺省值跟C/C++等語言中的缺省值,使用方法是不一樣的, 後者必須按順序, 缺省值必須在最後。 而js的缺省值,是能夠不按順序的,若是有多個缺省值,前面的缺省值沒必要/不是必需要 寫出來的。

    這是由於,js函數的設計決定的, js函數的參數有不一樣的表達形式, 根據這些書寫形式,就能夠判斷parse出 是哪一個參數了。如圖css屬性值的設計同樣, 根據書寫形式就能夠判斷出是什麼屬性了.

$.post();

  1. 參數data,始終是一個obj, 老是用{}括起來的, 若是要傳遞數組,則使用{'arr[]': [1,2,3]} 的形式
    2.注意post和ajax方法的區別, post是直接使用參數, 而ajax是使用的 key:content 的方式
  2. 注意post的回調函數中的data,就是請求載入/遠程url返回的內容, 內容的格式根據你指定的格式類型

實際上, jquery對文檔dom的處理也是比較簡單的.

  1. 在元素內部的增長: append, prepend, appendTo, prependTo
  2. 在元素節點外邊的增長(或者說是插入): after,before, insertAfter, insertBefore
  3. 元素的清空和刪除: 從語義上也能區別: empty是把元素dom節點清空, 裏面沒有內容,刪除其子節點, 可是元素自己是存在的; 而remove,很明顯就是從文檔中, 刪除這個節點元素了。

若是用jquery來做ajax就很是簡單, 省略隱藏包裝了不少的細節:

  1. $.ajax()的參數形式, 更簡單, 有兩種: 一種是 $.ajax(url,[settings]);, 另外一種更直接, 就是一個settings, 把url都放入到settings中去了, 即: $.ajax([settings]);
  2. 完整的形式是$.ajax, 可是一般不用這個, 用得最多的仍是下面的三個:
  3. 一是load, 載入遠程的html代碼到當前節點元素: 也就是說, load的調用者,就是遠程請求內容之後要插入的地方, load的地址能夠是各類形式的:.html,.php,/..,{:U(...)}等均可以,還能夠用jquery選擇符來選擇部分html代碼返回.
  4. get和post, 這個就不說了

ajax返回的類型有: xml, html, script, json, text.用得較多的是後面的四種,xml用得比較少:
_ 純粹的文字,字符串, 用text?

  • 若是是網頁格式的, 用html
  • 若是是對象類型的,像key: content 類型的就是json格式
  • 若是是可執行腳本代碼的, 用script

load, 若是要傳遞參數, 默認的方式是Post!

$.ajax, 就使用1個參數, option/settings. 把url也融合進去.
注意區別 : type. dataType, data三個參數的區別, 比較容易混淆...

注意區分ajax的選項參數, 比較接近, 容易混淆
type和datatype:
type是指http 傳遞的方法, 是get仍是post?
dataType: 是指返回的數據類型text, html等等
而data: 則是要傳輸的數據, 可使用{key1: val1, key2: val2}的方式, 也可使用 url地址傳值的方式: data:"k1=v1&k2=v2" ,注意這裏使用的就是等號不是冒號了!
在寫完 url後, 立刻就是寫這三個類型的值: type, dataType, data.

使用Thinkphp的Verify類來進行驗證碼

  1. 使用方法是: 先new一個Verify的類對象, 而後調用它的entry方法,就輸出了
  2. 整個方法中, 就只有 entry方法是public的, 其餘的,像 _background, _writeNoise, _writeCurve等都是private的 , 只是被 entry所調用
  3. 配置參數, 是傳遞給new 對象時的構造函數的. 在new的時候, 會進行__set, __construct(該函數中, 會匯合 merge($this->config, $config), 其中 $this->config 是類對象 成員protected config 是默認的設置. 固然還有其餘的一些設置...如useImgBg, useZh,...
  4. 配置的時候, 能夠用 $config數組, 也能夠用動態設置 成員變量的方法. 即先new對象, 而後,設置這個對象的成員變量.是由於Verify類中, 有一個公共函數: public function __set($name, $value) 這樣就保證了在外部 用 $Verify -> attribute = value的形式時, 調用這個 public的魔法函數.

  5. 注意區別php和C++類在定義成員函數 上的不一樣, C++雖然也可能夠直接在類中聲明 並 定義 成員方法, 可是那一般只限於 inline內聯方法, 主要的仍是,先聲明, 而後在類的外部進行實現. 而php的成員方法/函數, 是不用聲明, 並且是在 類的內部 直接實現的.

  6. NOW_TIME: 是thinkphp中定義的 時間戳 常量, 表示當前的時間戳....

爲何要使用時間戳? 由於時間戳是秒數, 能夠用來進行 時間上的加減 運算, 進行比較, 從而能夠 判斷 事件是否過時等等, 好比在\Think\Verify中的 check()函數就是用時間戳的比較來判斷 驗證碼是否 過時了的.

獲取session中的 驗證碼: $secode=session[$key]; $secode['verify_time']....


因爲使用了mvc, 從而使得"視圖"和"控制器"分離, 即html頁面和php邏輯分離, 避免了html頁面夾雜php代碼的狀況.

php等支持對象的語言中, 雖然默認的訪問權限是public, 可是爲了嚴謹和效率, 應該明確的寫出 訪問權限是public仍是protected private等.無論是成員變量仍是成員函數都應該是這樣.

注意 Verify::check方法, 返回的是boolean,即驗證碼是否正確. 而entry方法, 返回的是void, 直接就生成繪製出了 驗證碼圖像.


其實thinkphp的架構仍是比較"簡單"的, 或者更準確的說, 是:很明晰清楚的:

  • Common, 是包含 functions.php, 主要是一些全局函數.如: C , M , U , A 等函數...
  • Conf, 是包含了系統的配置文件conventions.php, debug.php等..
  • Lang, 語言包, 把經常使用的, 提示/說明/警告等字符串用變量/配置名稱的方式,寫出來, 兩個做用: 便於修改, 便於在代碼中 用變量的方式來引用
  • Library, 庫, 這個是tp的核心, 包括: Behavior(切面編程), Org(開源組織寫的工具類,如Net, Image等), Think(tp寫的), Vendor(其餘第三方寫的類庫)
  • Tpl, 系統的一些 模板, 主要用於跳轉, 報錯, 異常等頁面定製, 如: jump_dispatch.tpl等...

Michigan: [misig2n],密歇根, 密執安州, 湖, 區.
Wisconsin: 威斯康星州, 威斯康辛州.
Philip Katz: 卡茲. zip算法的創始人.
PKzip就是卡茲zip
ARC收費壓縮->pkArc->幾周後 PKZip ->自由軟件戰勝商業公司的傳奇.
PKZIP創建和統治了DOS時代的壓縮標準。直到Windows的誕生,使用卡茲創造的壓縮算法的軟件Winzip的出現更使ZIP格式成爲Internet的傳輸標準,ZIP格式也成爲壓縮文檔的事實標準。
gzip是gnu下的linux的壓縮工具.
能夠調用imgageCreate(int x_size, int y_size)建立一個空白文件, 而後, 輸出imagePng(...), 實際上, 能夠直接使用 TP的 Library\Think\Image類來使用php的繪圖函數, 它把php的原生函數作了封裝..
可是要注意到是: 輸出image的時候, 要用header函數作類型聲明: Content-type: image/png...不然若是是text/html, 則不會輸出圖像, 而是輸出的圖像的二進制編碼亂碼.

winzip: 比winrar的壓縮速度快2倍, 可是不支持rar和iso格式...


php的_ construct 和 initialize 方法?

  1. _ construct是構造函數, 是php類自帶的; 而 initialize是 thinkphp框架中的, 只有tp框架纔有的,
  2. construct 前面是兩個下劃線, 而 initialize前面只有一個 下劃線
  3. php的類繼承, 不像java, c++, 子類會自動調用父類的構造器, php的子類不會自動 調用 父類的construct, 和 initialize.
  4. _initialize實際上就是 調用父類的 parent::__construct
  5. _initialize方法, 會在調用類的每一個方法時, 會自動調用 這個_initialize方法.
  6. php的子類能夠有本身的構造函數, 若是沒有, 不會自動調用父類的構造器, 若是要初始化父類的成員變量, 要顯示的調用parent::__construct(父類的參數...). 可是子類沒有_initialize, 它會自動調用父類的_initialize函數; 可是若是子類已經有本身的_initialize了, 就不會自動調用父類的初始化函數了, 若是要調用, 則要顯式的調用parent::_initaize()
class IndexAction extends BaseAction {

    public function _initialize(){ // 若是子類存在initialize,則不執行父類的內容
        parent::_initialize(); // 加上這一句,才執行父類的初始化函數
        echo "hello I am child";
    }

注意在tp中的跳轉, 有success和error, 可是,有時候,不必定 在錯誤/失敗的時候, 就必定要使用 error跳轉, 也可使用 success跳轉, 由於success能夠指定跳轉頁面的地址!

可是在用戶登陸/退出/check/註冊等頁面, 是不該該執行 權限檢查, 是不該該 繼承 session()檢查, 不該該有_initialize方法的, 由於第一次得要有機會. 就是 將幾個額外的方法, 放在另外一個類中, 這個類不是繼承自 有_initialize方法的類. 而是繼承自原始的Controller類. 也就是 , 繼承自不一樣的類... 注意在寫tp的Home/Controller中的類的時候, 並不必定全部的類, 都從基類Controller 繼承, 有的時候, 可能要寫一些 公共類, 公共權限的類, 不須要受權認證的類, 這個時候, 能夠直接從Controller繼承,如寫爲: PublicController 或 CommonController, 而後,其餘不須要受權的類都從這個CommonController, 而有的類須要認證受權的, 就寫一個認證受權的類, 如AuthController, 而後其餘類就從這個AuthController的類繼承...

在寫zen coding / emmet的時候, 它的寫法徹底就是參考 jquery的 選擇器的寫法來的, 包括: 標籤名,類, id, 屬性選擇器等, 這裏要說的是, 在寫inuput這樣的表單元素時, 要寫表單的類型, 能夠直接使用 input:text/password等形式, 而不是採用 [type=text]等的屬性樣式. 並且 emmet還會給你添加一個 id 和 name在開頭和結尾...

<p><input id="" type="text" name=""></p>     // input的屬性通常要寫的是這三個屬性, 並且順序是: id, type, name, 這三個是有講究的: 第一個id, 是供前臺js用的;
<p><input id="" type="password" name=""></p>    // 最後一個name是供後臺 post/get獲取表單值用的.

tp使用驗證碼的方法是:

  1. 先單獨的在類裏面, 寫一個方法, 生成 驗證碼 "圖片", 以下圖所示, 它是一個圖片, 並且, 有src地址的png圖片
  2. 而後在 想要 "引用" 圖片 的地方, 寫這個 src 地址, 而不是 在模板頁內 用 php標籤來 引用驗證碼, 即: 不是在 引用頁, 使用 <php new... entry.../php> 這種方式的
  3. 在tp3.2.3, 中, 生成驗證碼的方法 跟3.1 不一樣, 3.1是要 import('ORG.Util.Image'); 而後 調用 Image::buildImageVerify(...), 而3.2.3 , 則直接將Verify這個類, 放在了 TP\Library\Think這個namespace中, 直接就是一個 類: Verify, 經過這個 類的方法 entry來生成 驗證碼了, 在3.2.3中, 有Library\ORG\Util, 可是已經沒有 Image這個類了! 卻是在 \Think下, 有Image這個類, 提供對圖片的縮放/水印, 裁剪等操做...

  4. 最重要的是, 要了解 這個 模板 替換常量: _ _URL_ _ 和 _ _APP_ _

關於Behavior行爲擴展?

  1. behavior [bi'heivi2]
  2. 從3.2.3, 開始, 引入了 namespace命名空間.
  3. 全部的行爲擴展 命名規範(包括你本身寫的行爲擴展): 文件名是: ???Behavior.class.php, 好比: MyCustBehavior.class.php, 裏面的類必須是:
namespace Behavior;
class MyCustBehavior {
 // 全部的行爲擴展 的入口執行函數 必須是: 
    public function run (&$foo){

        ....
        // 一般在這裏引用, 類的private 函數或 protected 函數....
}

}
  1. 類的命名方法, 是有兩種: 一種是主謂 式, 一種是 動賓式, 如這裏的: ContentReplaceBehavior.class.php. 裏面的方法是: public function run(&$content){...$this->templateContentReplace($content)...

理解ContentReplaceBehavior中的 $replace = array(....) , 它的實質上, 是一些 URL 地址的 替換! 主要是用來 在 引用/ success/form表單的頁面跳轉/ 驗證碼等圖像地址引用時的 一些頁面地址..

包括了從 根網站 到 當前頁面 的地址, 的所有替換:
__ROOT__,
__APP__,
__PUBLIC__,
__MODULE__
__CONTROLLER__  這個controller的URL地址, 就等於 __URL___, 這裏記住了, 常常看到的__URL___就是 __CONTROLLER__ 當前控制器所在的 瀏覽器地址欄的地址URL
__SELF__, 這個self, 是對 __SELF__這個變量作了一次 htmlentities函數處理

所以, 使用得較多的是, __URL__, 固然也可使用__CONTROLLER__

關於驗證碼的資源文件, 都是在 \Think\Verify\目錄下的, 包括: 中文字體文件夾: zhttfs, 英文字體文件ttfs, 背景圖片文件夾: bgs, 默認的驗證碼使用的是, useNoise => true, useCurve => true, 默認的是使用噪點使用曲線, curve曲線使用的是 正弦曲線, 中文字體使用 zhttfs字體文件才能正常顯示!

注意, 3.2.3的驗證碼字符類型, 默認的就是從 codeSet=>'2345678abc..'中去獲取的, 沒有0, 1, 9 避免跟字母0, l等相混淆, 因此3.2.3 就沒有全是英文字符, 全是數字, 數字和英文字符混合的說法了...自動的就是 從數字和英文字符集中隨機抽取.... 若是使用中文, 就要設置, useZh => true, 那麼就會自動的從中文字符集中選取: zhSet=...

在全部的js中, 全部的form表單事件函數中, 只要"return false;" (對任意一個input表單控件, 都是能夠的), 就表示阻止瀏覽器的 默認行爲..., 如 onpaste ="return false; ondragenter =" return false;"就表示阻止粘貼, 阻止拖放文字... onclick = "submitClick(); return false;就表示阻止默認的提交行爲....這種用法具備 通用性...

要阻止在文本框, 密碼框等中輸入漢字, 只須要 禁用 輸入法就行了: style="ime-mode: disabled;"

參考: https://www.lidaren.com/archives/1240 http://www.jb51.net/web/78327.html
可是, 使用ime-mode: disabled; 是 css3 的用法, 有些瀏覽器是不兼容的, 如windows下的ff, 設置使用了 `style="-moz-ime-mode: disabled;" 都不能禁止輸入中文, 所以, 要將樣式表和js 結合起來使用:

相關文章
相關標籤/搜索