◆段尊敬
PHPCMS萬能字段的設(shè)計與開發(fā)
◆段尊敬
(山東輕工職業(yè)學院 山東 255300)
萬能字段在PHPCMS模型表單設(shè)計中表現(xiàn)出強大的靈活性和可擴展性,但是設(shè)計比較復雜且缺少官方指南。本文由淺入深詳細講述了萬能字段的設(shè)計方法,重點說明了其參數(shù)表單內(nèi)容中HTML組件、JavaScript的編寫和自定義函數(shù),依據(jù)本文的設(shè)計思路,開發(fā)者能夠設(shè)計出符合各類用戶需求的組合型Web表單“輸入域”,從而拓展模型表單的輸入功能。
PHPCMS;Web表單;萬能字段;自定義函數(shù)
PHPCMS是一款基于PHP的開源網(wǎng)站管理軟件(簡稱CMS),它采用模塊化設(shè)計,含有文章展示、文件下載、圖片展示、視頻播放等常用功能,它既可以設(shè)計政府、企事業(yè)單位網(wǎng)站,也可以設(shè)計視頻、音樂和書籍等展示網(wǎng)站,具有功能強大、方便易用的特點。
PHPCMS通過自定義模型、自定義標簽和自定義字段表現(xiàn)出強大的靈活性和可擴展性。在自定義字段中,以萬能字段最為靈活,它允許開發(fā)者自定義PHP函數(shù),并將多個HTML組件和JavaScript代碼邏輯耦合,形成組合型Web表單“輸入域”(例如多級聯(lián)動下拉框),由于萬能字段設(shè)計復雜且沒有官方指南,本文將詳細闡述其設(shè)計和使用方法。
假定一個教師管理系統(tǒng)要求上傳學院所有教師的個人信息,每篇教師信息包括姓名、所屬院系、個人簡介等屬性,待填寫的教師信息頁面稱為教師信息表單。首先在后臺的“模型管理”添加一個Teacher模型,在模型中為教師各個屬性添加自定義字段,下面以“所屬院系”為例講述萬能字段的設(shè)計和使用。
PHPCMS預定義了可用的自定義字段類型,例如:選項、單行文本、多行文本、編輯器等,如圖1所示。
最簡易的方法是將“所屬院系”設(shè)置為單行文本類型,當編輯信息表單的時候,管理員手動輸入“所屬院系”的文本值,這樣設(shè)計存在以下問題:
(1)輸入易出錯:手動輸入文本費時費力,出錯的可能性很大。
(2)數(shù)據(jù)不一致:如果某院系名稱發(fā)生了變更,管理員不可能同時知曉,有的輸入新名稱,有的輸入舊名稱,這就造成數(shù)據(jù)不一致。
為了解決上述兩個問題,可以將“所屬院系”設(shè)計成靜態(tài)萬能字段,所謂靜態(tài)是指僅含有HTML和JS代碼,不含有PHP動態(tài)腳本。
假設(shè)學校僅有信息工程系、電子工程系、藝術(shù)設(shè)計系等三個院系,教師只能屬于其中一個,顯然應將萬能字段設(shè)計為SELECT組件,每個院系名稱作為OPTION選項,管理員選擇了某個OPTION,它的value就作為SELECT的值保存到數(shù)據(jù)庫中。
在Teacher模型中定義一個萬能字段,字段名為zy_teacher_dep,如圖2所示。
(1)相關(guān)參數(shù)表單:可以包含HTML組件、JS代碼和自定義函數(shù),圖中僅包含三個院系的SELECT組件。
(2)字段類型:選擇“字符VARCHAR”,表示保存到數(shù)據(jù)庫的數(shù)據(jù)類型為VARCHAR。
(3)作為基本信息:選擇“是”,表示本字段在文章編輯頁面的左側(cè)顯示。
(4)作為萬能字段的附屬字段:選擇“否”。
圖2 參數(shù)設(shè)置
(1)創(chuàng)建數(shù)據(jù)保存字段:在表單上創(chuàng)建萬能字段時,PHPCMS會在模型數(shù)據(jù)表teacher_data中創(chuàng)建一個同名字段,用于保存用戶提交的字段值。
(2)“字符長度取值范圍”最小值設(shè)為3:目的是讓管理員必須選擇院系,如果沒有選擇,默認項“無”的value長度小于3,表單無法提交。
(3)參數(shù)表單中INPUT組件的name必須和字段名一致:本例中SELECT組件的name必須是"info[zy_teacher_dep]",否則PHPCMS無法將字段值保存到表teacher_data的zy_teacher_dep字段中。
(4)附屬字段含義:如果本字段是作為其他萬能字段的一部分,那么應將“作為萬能字段的附屬字段”設(shè)為“是”。本例中的zy_teacher_dep字段不屬于其他萬能字段。
設(shè)置完畢后,后臺編輯文章就可以使用zy_teacher_dep字段了,如圖3所示。
圖3 運行結(jié)果
保存教師信息后,查看Teacher模型的teacher_data表,會發(fā)現(xiàn)多了一個VARCHAR類型的zy_teacher_dep字段,它是PHPCMS依據(jù)自定義字段名稱建立的,用于保存zy_teacher_dep字段的值。
上述萬能字段構(gòu)造了一個SELECT組件,所有管理員都使用這個組件選擇院系,解決了數(shù)據(jù)不同步的問題,但是存在以下問題:
(1)僅使用了靜態(tài)HTML代碼,沒有使用PHP動態(tài)腳本,無法鏈接數(shù)據(jù)庫。
(2)所選院系能夠保存進數(shù)據(jù)庫,但是打開文章修改的時候,無法顯示已選院系。
一般說來,學校的院系數(shù)據(jù)保存在基礎(chǔ)數(shù)據(jù)庫中,如果院系名稱發(fā)生變更,由運維人員及時修改,其他應用程序只要從基礎(chǔ)數(shù)據(jù)庫讀取即可,這是解決數(shù)據(jù)同步的最好方案,PHPCMS萬能字段可以調(diào)用自定義函數(shù)實現(xiàn)數(shù)據(jù)庫遠程讀寫。
自定義函數(shù)的格式規(guī)定:{FUNC(函數(shù)名~~參數(shù))},函數(shù)代碼寫在extention.func.php文件中;參數(shù)表示傳遞給自定義函數(shù)的變量,通常寫成{FIELD_VALUE},它表示萬能字段在數(shù)據(jù)表同名字段中的存儲值(如果有的話),PHPCMS在調(diào)用自定義函數(shù)的時候會自動讀??;函數(shù)名和參數(shù)之間用~~分隔。
注意:自定義函數(shù)一定要先在extention.func.php中定義好才能在萬能字段表單中使用,否則會出錯。
zy_college字段表單內(nèi)容改為:
此函數(shù)讀取了院系數(shù)據(jù)組成多個
管理員在后臺添加文章時,將執(zhí)行modulescontentcontent.php中的add方法,它調(diào)用$content_form類的get方法讀取表單中每個字段的已保存值。對萬能字段而言,則是執(zhí)行omnipotent目錄下form.inc.php的omnipotent方法,此方法讀取數(shù)據(jù)庫中萬能字段的值,作為參數(shù)傳入并調(diào)用my_dep_for_video_model自定義函數(shù),返回動態(tài)生成的SELECT組件,最后在教師信息表單上呈現(xiàn)出來。
為了闡述組合型萬能字段,先拓展教師管理系統(tǒng)的表單功能,假定在教師管理系統(tǒng)中,管理員為每名教師推薦一名學生作為技能大賽培養(yǎng)對象,推薦時先選定某個班級,再選定此班級里的某名學生。這就要求設(shè)計一個萬能字段包括兩個SELECT組件,第一個組件包含可選的班級列表,第二個組件包含被選擇班級的學生列表,這個萬能字段實際上是個二級聯(lián)動下拉列表,從功能上看是個“輸入域”。
(1)添加萬能字段class_name表示可選的班級,作為萬能字段的附屬字段設(shè)為“是”。
(2)添加萬能字段students_in_class表示可選的姓名,作為萬能字段的附屬字段設(shè)為“是”。
(3)添加萬能字段good_student,它是前面兩個萬能字段的邏輯組合,作為萬能字段的附屬字段設(shè)為“否”。
(4)students_in_class表單內(nèi)容:
(5)good_student表單內(nèi)容:{class_name}的{students_in_class}同學
(6)class_name表單內(nèi)容:
class_name字段的表單最后一行調(diào)用了自定義函數(shù)my_get_class,它和my_dep_for_video_model函數(shù)功能類似,不同的是此SELECT組件含有onchange方法,參數(shù)是管理員選中的OPTION選項的value,如下:
當后臺打開教師信息表單的時候,class_name字段先調(diào)用my_get_class方法,它讀取基礎(chǔ)數(shù)據(jù)庫中的可選班級,生成一個包含可選班級的SELECT組件顯示在表單上。當管理員選擇班級的時候,將執(zhí)行onchange方法中的ajax語句,調(diào)用自定義的xxx.php頁面,此頁面接收被選中的班級value,在數(shù)據(jù)庫中檢索這個班級的所有學生姓名并返回一個name=info[students_in_class]的SELECT組件,如果返回成功,將這個SELECT組件呈現(xiàn)在id為stu_this_class的div中供管理員選擇,圖4是運行結(jié)果。
圖4 運行結(jié)果
class_name和students_in_class既是萬能字段,又是good_student的附屬字段,good_student用于在表單上顯示這兩個字段的邏輯組合。打開Teacher模型的teacher_data表,會發(fā)現(xiàn)表中一共創(chuàng)建了3個新字段:class_name、students_in_class、good_student,當提交教師信息表單后,前兩個字段分別保存被推薦學生的班級名稱和學生姓名,good_student字段其實沒有用處。
至此,組合型萬能字段設(shè)計結(jié)束,從功能上看,萬能字段就是PHP、JavaScript和多個HTML的Input元素構(gòu)建的邏輯輸入域,能夠在表單上呈現(xiàn)個性化、符合用戶需求的HTML輸入功能并實現(xiàn)數(shù)據(jù)的讀寫,其靈活性僅受限于開發(fā)者對PHP、JavaScript和HTML的應用水平。根據(jù)本文的設(shè)計思路,可以設(shè)計出更加復雜靈活的萬能字段,足以滿足絕大多數(shù)用戶的需求。