一渣刷、開發(fā)模式
現(xiàn)在的開發(fā)模式主要分為兩種:
1.二次開發(fā):
如果已經(jīng)有一個(gè)產(chǎn)品,和要開發(fā)的項(xiàng)目比較相似矗烛,就使用二次開發(fā)辅柴。
在已經(jīng)存在的產(chǎn)品上改動, 即使不做任何改動也能使用高诺,改動時(shí)根據(jù)需求碌识。
2.框架開發(fā):
如果沒有現(xiàn)有的產(chǎn)品可改,就選擇一個(gè)好的框架進(jìn)行自主框架開發(fā)虱而。
新產(chǎn)品=50%功能+一些實(shí)用的類庫+ 自己補(bǔ)充的新產(chǎn)品
二筏餐、下載安裝
1.下載
登錄phpcms官網(wǎng):http://www.phpcms.cn 即可找到下載入口。下載時(shí)推薦下載UTF-8字符集版本的牡拇。
2.安裝
下載后解壓魁瞪,即可見到兩個(gè)目錄,其中install_package目錄內(nèi)的文件為需要安裝的文件惠呼,readme里的文件為幫助文檔和.htaccess文件(做偽靜態(tài)時(shí)的規(guī)則)导俘。
將install_package內(nèi)的所有文件和目錄拷貝到項(xiàng)目目錄內(nèi),然后通過瀏覽器訪問項(xiàng)目目錄中的install目錄剔蹋,即可打開安裝界面(如下圖所示)旅薄。
第一步:同意許可協(xié)議
第二步:運(yùn)行環(huán)境檢測
如果運(yùn)行環(huán)境中有哪些沒開啟,表格最后一列就表現(xiàn)為×泣崩,需要通過調(diào)整開啟少梁。若設(shè)備未聯(lián)網(wǎng),最后一行DNS解析則表現(xiàn)為×矫付,但不影響在本機(jī)安裝凯沪。
第三步:選擇模塊
注意PHPSSO設(shè)置中必須選擇一項(xiàng)才能進(jìn)行下一步。
第四步:文件權(quán)限設(shè)置
表格所列出的文件和目錄都需要可寫才行买优。
第五步:賬號設(shè)置
第六步:系統(tǒng)安裝
第七步:安裝完成
安裝完成后妨马,要把項(xiàng)目中的install目錄刪掉挺举,系統(tǒng)默認(rèn)是在安裝完后自動刪掉的,如果沒刪烘跺,要手動刪掉湘纵。
瀏覽器訪問項(xiàng)目目錄下/index.php則訪問前臺頁面,訪問項(xiàng)目目錄下/admin.php則訪問后臺管理頁面液荸。
三瞻佛、后臺功能
1.我的面板
(1)修改個(gè)人信息
其中Language語言一項(xiàng)脱篙,改完之后要刷新娇钱,則整個(gè)界面就改成其他語言。
(2)修改密碼
可以修改管理員登錄密碼绊困。
(3)生成首頁
點(diǎn)擊則可以生成首頁的靜態(tài)化html文件文搂,加快外界訪問速度。
2.設(shè)置
(1)站點(diǎn)管理
點(diǎn)擊修改
可以在此進(jìn)行修改網(wǎng)站相關(guān)設(shè)置秤朗。
(2)管理員管理
可以在此進(jìn)行管理員管理煤蹭。
1)口令卡
點(diǎn)擊申請口令卡
口令卡申請成功,一定要牢牢保存好口令卡圖片取视。
按照圖中所示硝皂,根據(jù)口令卡對照著輸入正確數(shù)字才能登陸。
(3)角色管理
phpcms中支持對用戶進(jìn)行角色管理作谭,如下圖稽物,角色管理中的權(quán)限分為管理權(quán)限和使用權(quán)限:
1)管理權(quán)限:通過點(diǎn)擊圖中的‘權(quán)限設(shè)置’來設(shè)置角色在哪個(gè)站點(diǎn)的后臺能參與哪些管理,如‘設(shè)置’折欠、‘模塊’贝或、‘內(nèi)容’等…
2)欄目權(quán)限:通過點(diǎn)擊圖中的‘欄目權(quán)限’來設(shè)置角色在哪個(gè)站點(diǎn)的前臺能對哪些欄目進(jìn)行哪些操作。
3)成員管理:管理注冊的用戶锐秦。
3.模塊
(1)模塊管理
1)模塊管理
通過管理操作中的禁止咪奖、卸載和安裝可以操作所列的這些模塊,操作完之后需要更新一下緩存酱床。
上圖所示的這些模塊就在項(xiàng)目目錄/phpcms/modules/
中的各個(gè)目錄羊赵。
2)友情鏈接
①添加類別
②添加友情鏈接
該友情鏈接模塊還能夠通過進(jìn)行前臺申請,只有通過后臺管理員通過以后才會顯示在前臺的友情鏈接中扇谣。
4.內(nèi)容
(1)管理欄目
上圖展示了目前網(wǎng)站所有欄目的結(jié)構(gòu)昧捷。
1)添加類別
(2)模型管理
1)添加模型
點(diǎn)擊字段管理可以更改字段相關(guān)屬性,還能夠添加你所需要的字段揍堕,修改字段的排序就可以更改其在模板中顯示的位置料身。
在此處設(shè)置好模型之后,在欄目管理中就可以使用了衩茸。
(3)采集管理及其使用方法
1)添加采集點(diǎn):上圖中采集頁面編碼是采集對象網(wǎng)站使用的是什么字符集編碼芹血。
i序列網(wǎng)址:在網(wǎng)址類型選擇序列網(wǎng)址之后,在其下面的文本框中,輸入列表頁的URL幔烛,并將代表分頁的數(shù)字用通配符
(*)
來代替(可以點(diǎn)擊測試看看采集的網(wǎng)址是否正確)啃擦,還可以在下面設(shè)置采集頁面的數(shù)量和“步”的大小。ii網(wǎng)址配置:通過設(shè)置采集網(wǎng)址的規(guī)則饿悬,如采集的url中必須包含什么和不能包含什么令蛉,來控制過濾采集的URL以符合自己需要的標(biāo)準(zhǔn)。
iiiBase設(shè)置:有的網(wǎng)站使用了Base(<base href="www.baidu.com">)狡恬,有的則沒有珠叔,Base則是將網(wǎng)址中公共的前段部分提取出來,然后自動加到頁面中的a標(biāo)簽的跳轉(zhuǎn)URL的前面弟劲,即基礎(chǔ)部分網(wǎng)址祷安,如果目標(biāo)網(wǎng)站設(shè)置了Base則需要在這里設(shè)置填寫,沒設(shè)置Base則不用理會此項(xiàng)兔乞。
iiii獲取網(wǎng)址: 在網(wǎng)頁源代碼中尋找要獲取連接部分汇鞭,通過填寫獲取部分前后的唯一代碼來進(jìn)行該部分的定位。
iiiii內(nèi)容規(guī)則:內(nèi)容規(guī)則則是通過選取被采集網(wǎng)站中的html源代碼庸追,進(jìn)行內(nèi)容的選取霍骄,選取方式就是尋找兩邊獨(dú)特的html代碼,將被采取的內(nèi)容區(qū)域飆升
[內(nèi)容]
標(biāo)簽淡溯。過濾中填寫的內(nèi)容读整,不會采集到內(nèi)容當(dāng)中。iiiiii提交:點(diǎn)擊提交即可提交此采集點(diǎn)血筑。
2)采集管理:
1)測試:點(diǎn)擊列表中某一條的測試绘沉,可以測試該采集點(diǎn)的獲取的內(nèi)容如下圖所示。
2)采集網(wǎng)址:點(diǎn)擊采集網(wǎng)址豺总,則可以將上述測試中的內(nèi)容全部采集到车伞。
3)采集內(nèi)容:采集網(wǎng)址完成之后,要采集內(nèi)容才能將內(nèi)容采集到喻喳。
4)內(nèi)容發(fā)布:點(diǎn)擊之后另玖,可以將選中的條目導(dǎo)入相應(yīng)的欄目之中,然后將采集到的東西歸類到相應(yīng)的本站數(shù)據(jù)庫字段中表伦,點(diǎn)擊提交即可谦去。
四、模板引擎
1.phpcms的模板
模板目錄在項(xiàng)目目錄/phpcms/templates/
中蹦哼,里面的目錄就是模板鳄哭。
default目錄是默認(rèn)模板,default目錄中的目錄都是各個(gè)模塊纲熏。在templates目錄中新建目錄即為創(chuàng)建一套前臺模板妆丘,在目錄中創(chuàng)建模塊目錄锄俄,在模塊目錄中新建頁面,前臺模板中需要但是沒有創(chuàng)建的頁面勺拣,系統(tǒng)會自動從default目錄相應(yīng)的位置繼承奶赠。
建好頁面之后,要將default中的config.php粘貼到新建的模板目錄中药有,然后根據(jù)自己的目錄結(jié)構(gòu)來修改該config.php毅戈,這個(gè)文件中的文件結(jié)構(gòu)根據(jù)default中的結(jié)構(gòu)建立即可,在此修改后愤惰,還可以根據(jù)后臺中的界面菜單->模板風(fēng)格中進(jìn)行設(shè)置苇经。
注意:需要修改項(xiàng)目目錄/caches/configs/system.php
文件,將“是否允許在線編輯模板”的值改為1羊苟,才能通過后臺編輯模板文件塑陵。
模板中的頁面:
1.index.html——首頁感憾;
2.category.html——頻道頁蜡励;
3.list.html——列表頁;
4.show.html——內(nèi)容頁阻桅;
2.phpcms模板引擎語法
(1)phpcms模板引擎支持在模板html文件中寫php代碼(不推薦使用)凉倚。
(2)使用{php
}
定界符,可以在其中直接書寫php語法的語句(推薦使用)嫂沉。
(3)使用{}
定界符之中可以直接調(diào)用phpcms對應(yīng)后端中的常量和變量并顯示輸出(常用的常量請參考PHPCMS V9手冊)稽寒。
(4)使用{}
定界符可以在其中調(diào)用絕大部分的php函數(shù)和phpcms自帶函數(shù),在處理完變量和常量后再輸出(不推薦使用php函數(shù)而推薦使用系統(tǒng)函數(shù))趟章。
(5)if判斷
舉例:如果$num的值為1或者0杏糙,就輸出aaaaa,如果等于2就輸出bbbbb蚓土,否則就輸出ccccc宏侍。
{php $num=1}
{if $num==1 || $num==0}
aaaaa<br/>
{elseif $num==2}
bbbbb<br/>
{else}
ccccc<br/>
{/if}
(6)數(shù)組遍歷
循環(huán)只有一種,就是遍歷數(shù)組:
假設(shè)后臺一個(gè)數(shù)組:$data = array("1"=>1,"2"=>2,"3"=>3,"4"=>4,"5"=>5,"6"=>6,"7"=>7,"8"=>8,"9"=>9);
蜀漆,將其遍歷谅河。
{loop $data $k $r}
{$k}=========>{$r}<br/>
{/loop}
注:loop標(biāo)簽中有一個(gè)默認(rèn)$n的變量(不顯示,可以直接用)确丢,用于循環(huán)計(jì)數(shù)绷耍。
(7)pc標(biāo)簽
{pc:模塊名 action='獲取的內(nèi)容操作' [參數(shù)1='參數(shù)1值' [參數(shù)2='參數(shù)2值' [...] ] ] [return='變量名(默認(rèn)是data)']}
{$變量名(對其操作)}
{/pc}
所有有pc標(biāo)簽的地方,在后臺=>界面=>相應(yīng)模板=>點(diǎn)擊[可視化]=>修改鲜侥,可以在彈出的頁面上點(diǎn)擊獲取想要的內(nèi)容褂始,在此修改相當(dāng)于在頁面上修改代碼。如下圖:
1)get模塊
{pc:get sql='sql語句' }
{$變量名(對其操作)[參數(shù)1='參數(shù)1值' [參數(shù)2='參數(shù)2值' [...]]] }
{/pc}
2)碎片
{pc:block pos='碎片名'}
{/pc}
進(jìn)入后臺描函,現(xiàn)在模板相應(yīng)頁面的可視化界面中點(diǎn)擊“添加碎片”崎苗,進(jìn)行簡單的編輯搂赋,如下圖:然后進(jìn)入后臺=>內(nèi)容=>碎片管理们豌,即可看到在頁面中添加的碎片蚌堵,并對其進(jìn)行管理冷尉。
(8)template標(biāo)簽
{temlplate "模板名1" [,"模板名2" [,"模板名3" [,...]]}
該標(biāo)簽可以將頁面中共同的部分直接引入到本頁面中退唠。
五空盼、實(shí)戰(zhàn)
1误算、模板的導(dǎo)入
(1)按照項(xiàng)目目錄下phpcms目錄下templates目錄下的default目錄的結(jié)構(gòu)創(chuàng)建一個(gè)目錄并重命名蛤织,然后按照default目錄中的config.php的格式雪营,創(chuàng)建一個(gè)config.php文件胰伍,并修改其中目錄路徑有關(guān)的地方(也可以在后臺→設(shè)置→站點(diǎn)管理中設(shè)置)齿诞。
以東亞新聞網(wǎng)為例,其目模板的結(jié)構(gòu)為:
dynews
|-phpcms
|-templates
|-default
|-config.php
|-content
|-……
|-index.html
|-dynews
|-config.php
|-content
|-……
(2)將靜態(tài)資源(如js骂租、css和圖片等)打包存入項(xiàng)目目錄下的statics目錄中祷杈,這樣比較好管理不同模板的靜態(tài)資源。以東亞新聞網(wǎng)為例:
dynews
|-statics
|-css
|-js
|-images
|-dynews
|-css
|-js
|-img
|-fonts
|-……
(3)進(jìn)入后臺渗饮,在設(shè)置→站點(diǎn)管理中切換模板風(fēng)格設(shè)置但汞。設(shè)置完之后更新緩存,然后頁面即可切換過來互站。
2私蕾、模板內(nèi)容基本信息的替換
(1)兼容設(shè)置
<!--[if IE 8 ]><html class="ie ie8" lang="en"> <![endif]-->
<!--[if (gte IE 9) | !(IE)]><!-->
<html class="not-ie" lang="zh-CN">
<!--<![endif]-->
以上文本放在<!DOCTYPE html>
下,意思為:如果是ie8瀏覽器胡桃,就加載<html class="ie ie8" lang="en">
踩叭,如果ie版本大于ie9,或者非ie瀏覽器翠胰,就加載<html class="not-ie" lang="zh-CN">
.
(2)head頭部分使用模板引擎加載
按照缺省模板中相同的部分容贝,粘貼過來。
標(biāo)題:
<title>{if isset($SEO['title']) && !empty($SEO['title'])}{$SEO['title']}{/if}{$SEO['site_title']}</title>
以上文本的意思:如果后臺設(shè)置了$SEO的標(biāo)題并且標(biāo)題不為空之景,就使用這個(gè)標(biāo)題斤富,否則就使用網(wǎng)站標(biāo)題。
關(guān)鍵詞:
<meta name="keywords" content="{$SEO['keyword']}">
描述:
<meta name="description" content="{$SEO['description']}">
css闺兢、js文件的引入:
<!-- 常規(guī)情況下是用:-->
<link href="{CSS_PATH}bootstrap.min.css" rel="stylesheet">
<!-- 但是本案例在{CSS_PATH}的上一級目錄中又新建了目錄茂缚,
因此直接使用網(wǎng)站根目錄來獲取路徑:-->
<link href="{WEB_PATH}statics/dynews/css/bootstrap.min.css" rel="stylesheet">
<!-- 推薦使用第二種方法,js文件與css原理相同 -->
搜索框的代碼:
<form action="{APP_PATH}index.php" method="get" target="_blank">
<div class="input-group">
<input type="hidden" name="m" value="search"/>
<input type="hidden" name="c" value="index"/>
<input type="hidden" name="a" value="init"/>
<input type="hidden" name="typeid" value="{$typeid}" id="typeid"/>
<input type="hidden" name="siteid" value="{$siteid}" id="siteid"/>
<input type="text" class="form-control text" name="q" id="q" placeholder="Search for...">
<span class="input-group-btn">
<button class="btn btn-default" type="submit">檢索</button>
</span>
</div><!-- /input-group -->
</form>
導(dǎo)航欄的遍歷:
<div class="menu1 .container-fluid">
<div class="menuState row">
<ul>
<!-- 使用pc標(biāo)簽獲取欄目數(shù)組 -->
<!-- action="category"表示獲取內(nèi)容欄目列表的值
siteid是站點(diǎn)id
catid="0"是欄目id為0屋谭,即最根層欄目
num="12"表示獲取12個(gè)值組成數(shù)組賦給默認(rèn)值$data -->
{pc:content action="category" siteid="1" catid="0" num="12"}
<!-- 將$data依靠$v遍歷出來 -->
{loop $data $v}
<div class="col-xs-1 col-sm-1 col-md-1 col-lg-1">
<li>
<a target="_blank" href="{$v['url']}">{$v['catname']}</a>
</li>
</div>
{/loop}
{/pc}
<ul>
</div>
</div>
<div class="menu2 .container-fluid">
<div class="menuType row">
<ul>
{pc:content action="category" siteid="1" catid="0" num="18"}
{loop $data $v}
<!-- 因?yàn)閺慕?jīng)濟(jì)頻道是從13個(gè)開始脚囊,所以遍歷的時(shí)候加上判斷,只有在catid大于等于13的時(shí)候才顯示 -->
{if $n>=13}
<div class="col-xs-2 col-sm-2 col-md-2 col-lg-2">
<li>
<a target="_blank" href="{$v['url']}">{$v['catname']}</a>
</li>
</div>
{/if}
{/loop}
{/pc}
<ul>
</div>
</div>
注:subcat()
這個(gè)pc函數(shù)桐磁,傳入一個(gè)catid悔耘,就能將子類的catid都取出來,返回一個(gè)數(shù)組我擂。
首頁焦點(diǎn)圖的遍歷:
<!-- 頭條圖片 -->
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12" id="topline">
<!-- 此處可以使用頁面可視化進(jìn)行設(shè)置衬以,在推薦欄位處后的下拉選項(xiàng)選擇“首頁焦點(diǎn)圖推薦” -->
{pc:content action="position" posid="1" order="id DESC" num="5"}
<article class="jq22-container">
<ul class="hiSlider hiSlider2">
{loop $data $r}
<li class="hiSlider-item">
<a href="{$r['url']}" target="_blank">
<img src="{thumb($r['thumb'],671,300)}" alt="{$r['title']}">
</a>
</li>
{/loop}
</ul>
</article>
{/pc}
</div>
注:thumb()
這個(gè)pc函數(shù)缓艳,有三個(gè)參數(shù),第一個(gè)參數(shù)是縮略圖地址看峻,第二個(gè)參數(shù)是指定的寬度阶淘,第三個(gè)參數(shù)是指定的高度,返回一個(gè)指定寬高的縮略圖地址互妓。
六溪窒、項(xiàng)目建設(shè)理論
1、項(xiàng)目的組成
項(xiàng)目由多個(gè)模塊組成冯勉;
模塊采用MVC架構(gòu)澈蚌;
MVC中最重要的就是控制器;
控制器中包含若干操作灼狰;
2宛瞄、操作
可以理解為操作系統(tǒng)中的郵件菜單中的功能,它是用戶在系統(tǒng)中要執(zhí)行的動作交胚,例如添加份汗、修改、刪除和查看等承绸。每個(gè)操作都由步驟組成裸影。
3、phpcms的主入口文件
phpcms的整個(gè)項(xiàng)目都只訪問一個(gè)文件军熏,這個(gè)文件就是主入口文件。通過參數(shù)來判斷你要訪問的是哪個(gè)模塊和做的哪個(gè)操作卷扮。
域名參數(shù)組成:
http://域名/index.php/m=模塊名&c=控制器類&a=操作(事件)名&id=XXX
模塊文件的目錄:
X:\項(xiàng)目名\phpcms\modules\
該目錄下荡澎,每個(gè)文件夾是一個(gè)模塊。每個(gè)文件夾中都有php類文件(.php文件)晤锹,每個(gè)類文件摩幔,或者說每個(gè)類都是一個(gè)控制器。類中的每個(gè)方法就是一個(gè)操作(或事件)鞭铆。
通常來說或衡,每個(gè)模塊中,控制前臺的類文件都起名為index.php
,控制后臺的類的文件名稱和模塊名相同车遂。
當(dāng)我們訪問網(wǎng)站的首頁時(shí)封断,雖然在地址欄中只是訪問了index.php
,但實(shí)際上訪問的全稱是index.php/m=content&c=index&a=init
這個(gè)事件舶担。
這種自動跳轉(zhuǎn)在X:\項(xiàng)目名\caches\configs\route
這個(gè)文件中做了定義坡疼,定義規(guī)則如下:
路由配置文件
默認(rèn)配置為default如下:
'default'=>array(
'm'=>'phpcms',
'c'=>'index',
'a'=>'init',
'data'=>array(
'POST'=>array(
'catid'=>1
),
'GET'=>array(
'contentid'=>1
)
)
)
基中“m”為模型,“c”為控制器,“a”為事件衣陶,“data”為其他附加參數(shù)柄瑰。
data為一個(gè)二維數(shù)組闸氮,可設(shè)置POST和GET的默認(rèn)參數(shù)。POST和GET分別對應(yīng)PHP中的$_POST和$_GET兩個(gè)超全局變量教沾。在程序中您可以使用$_POST['catid']來得到data下面POST中的數(shù)組的值蒲跨。
data中的所設(shè)置的參數(shù)等級比較低。如果外部程序有提交相同的名字的變量授翻,將會覆蓋配置文件中所設(shè)置的值财骨。如:
外部程序POST了一個(gè)變量catid=2那么你在程序中使用$_POST取到的值是2,而不是配置文件中所設(shè)置的1藏姐。
4隆箩、前后臺模塊控制器的控制
(1)對后臺模塊的訪問控制
模塊目錄中,凡是后臺類文件中必須做到兩點(diǎn):
1.最開始要寫上這條代碼:
defined('IN_PHPCMS') or exit('No permission resources.');
其意思為:用戶必須通過主入口來訪問此控制器類文件羔杨,直接訪問此文件是不行的捌臊。即通過地址欄輸入http://域名/phpcms/modules/模塊目錄名/后臺類控制器文件名
來訪問就會返回No permission resources.這個(gè)信息。
IN_PHPCMS
這個(gè)變量在base.php文件中已經(jīng)定義為true
只有通過主入口文件兜材,才能加載base.php文件理澎,才不會返回No permission resources.這個(gè)信息。
2.要繼承admin
這個(gè)類曙寡,此admin類為admin模塊目錄下的classes目錄下的admin.class.php文件糠爬,因此要在文件第二行寫上這條代碼:
pc_base::load_app_class('admin','admin',0);
表示引入admin
模塊中的admin
類。
(2)base.php詳解
base.php中的類名為‘pc_base’,其中定義的靜態(tài)方法均用pc_base::方法名()
來調(diào)用举庶,下面就詳細(xì)講解一下這個(gè)類中常用的幾個(gè)靜態(tài)方法:
1)pc_base::load_app_class()
加載應(yīng)用中的類执隧,這些類通常只在模塊當(dāng)中加載。
它有3個(gè)參數(shù):
①類名:其所加載的是X:\項(xiàng)目名\phpcms\modules\
目錄中每個(gè)模塊目錄下的classes
目錄中的類户侥。
②模塊名:如果不寫的話镀琉,缺省加載本模塊中的類。
③是否初始化類:如果不寫的話蕊唐,缺省是初始化創(chuàng)建對象付給變量的屋摔,如果寫0
或者false
,就是只加載替梨,相當(dāng)于引入文件钓试。
2)pc_base::load_sys_class()
加載系統(tǒng)中的類,這些類是phpcms的系統(tǒng)類副瀑,里面的方法都是全局函數(shù)弓熏,在項(xiàng)目中的任何地方都可以使用。
它有3個(gè)參數(shù):
①類名:其所加載的是X:\項(xiàng)目名\phpcms\libs\classes
中的類目錄中每個(gè)模塊目錄下的classes
目錄中的類俗扇。
②擴(kuò)展路徑名:硝烂??铜幽?滞谢?串稀??狮杨?母截??橄教?清寇??
③是否初始化類:如果不寫的話护蝶,缺省是初始化創(chuàng)建對象付給變量的华烟,如果寫0
或者false
,就是只加載持灰,相當(dāng)于引入文件盔夜。
3)pc_base::load_app_func()
加載應(yīng)用函數(shù)庫。
它有兩個(gè)參數(shù):
①函數(shù)庫名:其所加載的是X:\項(xiàng)目名\phpcms\modules\
目錄中每個(gè)模塊目錄下的functions
目錄中的函數(shù)庫堤魁。
②模塊名:如果不寫的話喂链,缺省加載本模塊中的函數(shù)庫。
4)pc_base::load_sys_func()
加載系統(tǒng)函數(shù)庫妥泉。
它有兩個(gè)參數(shù):
①函數(shù)庫名:其所加載的是X:\項(xiàng)目名\phpcms\libs\
目錄中每個(gè)模塊目錄下的functions
目錄中的函數(shù)庫椭微。
②擴(kuò)展路徑名:?盲链?蝇率??匈仗?瓢剿??悠轩??攻泼?火架??忙菠?何鸡。
(3)模塊的安裝和卸載
1)簡潔辦法
只要在X:\項(xiàng)目名\phpcms\modules\
目錄中拷入已有模塊中的install
和uninstall
目錄,即可實(shí)現(xiàn)自建模塊的安裝和卸載功能牛欢。
2)土辦法
在該phpcms項(xiàng)目的數(shù)據(jù)庫中骡男,找到module
表,在表中插入一條數(shù)據(jù)傍睹,模塊名一定要和創(chuàng)建的模塊目錄名相同隔盛,插入之后犹菱,刷新后臺,即顯示自己創(chuàng)建的模塊已經(jīng)安裝吮炕。
注意:用這個(gè)方法會出現(xiàn)一個(gè)Hash錯(cuò)誤腊脱,需要點(diǎn)擊“擴(kuò)展”->“菜單管理”后,在面板中點(diǎn)擊自己添加的模塊然后龙亲?陕凹??(視頻中未說明)
(4)后臺模塊的配置
進(jìn)入后臺“擴(kuò)展”->“菜單管理”->“添加菜單”中添加菜單鳄炉,可以將新功能置于任何后臺菜單目錄之下杜耙,如圖:
按照文本框后的提示將其全部填完,點(diǎn)擊提交后更新緩存即可安裝寫好模塊的功能拂盯。會在左邊欄最下方顯示佑女。
5、通過前臺模塊加載模板
前臺模板在templates目錄下磕仅,當(dāng)前網(wǎng)站正在使用的模板目錄下(以東亞新聞網(wǎng)為例)珊豹,添加相應(yīng)要使用的使用目錄,比如加一個(gè)test測試目錄榕订。
dynews
|-phpcms
|-templates
|-default
|-config.php
|-content
|-……
|-index.html
|-dynews
|-config.php
|-content
|-test
|-demo.html
|-……
該test目錄中放入要使用的模板文件(html文件)店茶,其文件名為“demo.html”若模塊想調(diào)用該模板,則需要在控制器類文件(php文件)的相應(yīng)方法中寫入下面這行代碼:
include templae("test","demo");
調(diào)用此控制器中的該方法即可顯示demo模板劫恒。
6贩幻、通過后臺模塊加載模板
而后臺的模板則需要在模塊目錄下建立一個(gè)templates
目錄,該目錄下的模板文件一定是.tpl.php
格式两嘴。以東亞新聞網(wǎng)為例丛楚,在其后臺目錄www/dynews/phpcms/modules
中創(chuàng)建一個(gè)test
模塊,那么它的模板文件就在其templates
目錄下憔辫,假設(shè)其模板文件為list.tpl.php
趣些,在后臺控制器類文件的相應(yīng)方法中寫入這行代碼:
include $this->admin_tpl("list");//該方法默認(rèn)調(diào)用本模塊下的模板目錄里的文件
若想調(diào)用其他模塊中的模板,則需要使用第二個(gè)參數(shù):
include $this->admin_tpl("link_list","link");//第二個(gè)參數(shù)為模塊名贰您,此為調(diào)用友情鏈接模塊中的templates下的link_list.tpl.php模板坏平。
(1)后臺模板結(jié)構(gòu)分析(以友情鏈接中的link_list.tpl.php為例)
1)頭三行請不要?jiǎng)樱?/p>
<?php
defined('IN_ADMIN') or exit('No permission resources.');//認(rèn)證用
$show_dialog = 1;
include $this->admin_tpl('header', 'admin');//保持后臺默認(rèn)同意風(fēng)格
?>
2)下面即一個(gè)列表
<div class="pad-lr-10">
<table width="100%" cellspacing="0" class="search-form">
<tbody>
<tr>
<td><div class="explain-col">
<?php echo L('all_linktype')?>: <a href="?m=link&c=link"><?php echo L('all')?></a>
<a href="?m=link&c=link&typeid=0">默認(rèn)分類</a>
<?php
if(is_array($type_arr)){
foreach($type_arr as $typeid => $type){
?><a href="?m=link&c=link&typeid=<?php echo $typeid;?>"><?php echo $type;?></a>
<?php }}?>
</div>
</td>
</tr>
</tbody>
</table>
<form name="myform" id="myform" action="?m=link&c=link&a=listorder" method="post" >
<div class="table-list">
<table width="100%" cellspacing="0">
<thead>
<tr>
<th width="35" align="center"><input type="checkbox" value="" id="check_box" onclick="selectall('linkid[]');"></th>
<th width="35" align="center"><?php echo L('listorder')?></th>
<th><?php echo L('link_name')?></th>
<th width="12%" align="center"><?php echo L('logo')?></th>
<th width="10%" align="center"><?php echo L('typeid')?></th>
<th width='10%' align="center"><?php echo L('link_type')?></th>
<th width="8%" align="center"><?php echo L('status')?></th>
<th width="12%" align="center"><?php echo L('operations_manage')?></th>
</tr>
</thead>
<tbody>
<!-- 下面的代碼請先忽略
<?php
if(is_array($infos)){
foreach($infos as $info){
?>
<tr>
<td align="center" width="35"><input type="checkbox" name="linkid[]" value="<?php echo $info['linkid']?>"></td>
<td align="center" width="35"><input name='listorders[<?php echo $info['linkid']?>]' type='text' size='3' value='<?php echo $info['listorder']?>' class="input-text-c"></td>
<td><a href="<?php echo $info['url'];?>" title="<?php echo L('go_website')?>" target="_blank"><?php echo new_html_special_chars($info['name'])?></a> </td>
<td align="center" width="12%"><?php if($info['linktype']==1){?><?php if($info['passed']=='1'){?><img src="<?php echo $info['logo'];?>" width=83 height=31><?php } else echo $info['logo'];}?></td>
<td align="center" width="10%"><?php echo $type_arr[$info['typeid']];?></td>
<td align="center" width="10%"><?php if($info['linktype']==0){echo L('word_link');}else{echo L('logo_link');}?></td>
<td width="8%" align="center"><?php if($info['passed']=='0'){?><a
href='?m=link&c=link&a=check&linkid=<?php echo $info['linkid']?>'
onClick="return confirm('<?php echo L('pass_or_not')?>')"><font color=red><?php echo L('audit')?></font></a><?php }else{echo L('passed');}?></td>
<td align="center" width="12%"><a href="###"
onclick="edit(<?php echo $info['linkid']?>, '<?php echo new_addslashes(new_html_special_chars($info['name']))?>')"
title="<?php echo L('edit')?>"><?php echo L('edit')?></a> | <a
href='?m=link&c=link&a=delete&linkid=<?php echo $info['linkid']?>'
onClick="return confirm('<?php echo L('confirm', array('message' => new_addslashes(new_html_special_chars($info['name']))))?>')"><?php echo L('delete')?></a>
</td>
</tr>
<?php
}
}
?>
-->
</tbody>
</table>
</div>
①小插曲:上面代碼列表中的<?php echo L('logo')?>
L("英文")
為一個(gè)語言函數(shù),使用<?php echo L('英文')?>
這個(gè)代碼是為了軟件國際化使用锦亦。此處和語言包相關(guān)舶替。后臺操作語言的選擇在第三章后臺功能——我的面板——修改個(gè)人信息——Language中修改。此處的language文件杠园,在www\dynews\phpcms\languages目錄中(此處以東亞新聞網(wǎng)為例)顾瞪,如下圖:
每個(gè)英文包中都含有各個(gè)模塊的翻譯文件,如下圖:
每個(gè)翻譯文件里裝的都是一個(gè)php數(shù)組(以友情鏈接模塊為例),如下圖:
自己創(chuàng)建了一個(gè)模塊之后陈醒,若想做國際化惕橙,也可以在相應(yīng)的語言包目錄(languages)下,新建相應(yīng)模塊的語言翻譯文件孵延,以相同的方式創(chuàng)建數(shù)組吕漂,在模板中也使用代碼
<?php echo L('英文')?>
,即可調(diào)用自己的語言包進(jìn)行自動翻譯尘应,代碼中的‘英文’就是語言翻譯文件中數(shù)組的鍵惶凝。L()
函數(shù)詳解:該函數(shù)有三個(gè)參數(shù),第一個(gè)參數(shù)就是翻譯文件中數(shù)組的鍵犬钢;
第二個(gè)參數(shù)苍鲜,忘了QAQ;
第三個(gè)函數(shù)就是模塊名玷犹,若想調(diào)用其他模塊的語言翻譯文件混滔,輸入模塊名即可,該參數(shù)有兩個(gè)特性:第一歹颓,默認(rèn)為本模塊坯屿,第二,如果之前調(diào)用這個(gè)函數(shù)選擇了其他模塊巍扛,那么這次調(diào)用傳入此參數(shù)則默認(rèn)與之前調(diào)用的模塊相同领跛。
注意:若不想做國際化,則可以忽略此代碼撤奸,直接在
<?php echo L('英文')?>
處吠昭,寫中文即可!
3)后臺控制器類數(shù)據(jù)傳送到前端
<?php
if(is_array($infos)){
foreach($infos as $info){
?>
<tr>
<td align="center" width="35"><input type="checkbox" name="linkid[]" value="<?php echo $info['linkid']?>"></td>
<td align="center" width="35"><input name='listorders[<?php echo $info['linkid']?>]' type='text' size='3' value='<?php echo $info['listorder']?>' class="input-text-c"></td>
<td><a href="<?php echo $info['url'];?>" title="<?php echo L('go_website')?>" target="_blank"><?php echo new_html_special_chars($info['name'])?></a> </td>
<td align="center" width="12%"><?php if($info['linktype']==1){?><?php if($info['passed']=='1'){?><img src="<?php echo $info['logo'];?>" width=83 height=31><?php } else echo $info['logo'];}?></td>
<td align="center" width="10%"><?php echo $type_arr[$info['typeid']];?></td>
<td align="center" width="10%"><?php if($info['linktype']==0){echo L('word_link');}else{echo L('logo_link');}?></td>
<td width="8%" align="center"><?php if($info['passed']=='0'){?><a
href='?m=link&c=link&a=check&linkid=<?php echo $info['linkid']?>'
onClick="return confirm('<?php echo L('pass_or_not')?>')"><font color=red><?php echo L('audit')?></font></a><?php }else{echo L('passed');}?></td>
<td align="center" width="12%"><a href="###"
onclick="edit(<?php echo $info['linkid']?>, '<?php echo new_addslashes(new_html_special_chars($info['name']))?>')"
title="<?php echo L('edit')?>"><?php echo L('edit')?></a> | <a
href='?m=link&c=link&a=delete&linkid=<?php echo $info['linkid']?>'
onClick="return confirm('<?php echo L('confirm', array('message' => new_addslashes(new_html_special_chars($info['name']))))?>')"><?php echo L('delete')?></a>
</td>
</tr>
<?php
}
}
?>
此處即為對數(shù)組$infos
的遍歷胧瓜,$infos
是控制器類的方法中的變量(如下圖)矢棚,當(dāng)方法調(diào)用該模板的時(shí)候,會自動將方法中的變量帶入到該模板中府喳。
假設(shè)后臺控制器類中的$infos
變量如下代碼所示:
<?php
defined('IN_PHPCMS') or exit('No permission resources.');//限制訪問
pc_base::load_app_class('admin','admin',0);//加載admin模塊中的admin類蒲肋,因?yàn)橄旅嬉^承此類
class test extends admin {
function init(){
$title = "aaaaa";
$info = array(
array("id"=>1, "name"=>"11111", "age"=>10, "sex"=>"男", "email"=>"aaaa@bbb.com"),
array("id"=>1, "name"=>"11111", "age"=>10, "sex"=>"男", "email"=>"aaaa@bbb.com"),
array("id"=>1, "name"=>"11111", "age"=>10, "sex"=>"男", "email"=>"aaaa@bbb.com"),
array("id"=>1, "name"=>"11111", "age"=>10, "sex"=>"男", "email"=>"aaaa@bbb.com"),
array("id"=>1, "name"=>"11111", "age"=>10, "sex"=>"男", "email"=>"aaaa@bbb.com"),
array("id"=>1, "name"=>"11111", "age"=>10, "sex"=>"男", "email"=>"aaaa@bbb.com"),
);
include $this->admin_tpl('init');
}
}
則在后臺模板中如下遍歷:
<?php
if(is_array($infos)){
foreach($infos as $info){
?>
<tr>
<td align="center" width="35"><input type="checkbox" name="linkid[]" value="<?php echo $info['linkid']?>"></td>
<td align="center" width="35"><?php echo $info['id']?></td>
<td align="center" width="35"><?php echo $info['name']?></td>
<td align="center" width="35"><?php echo $info['age']?></td>
<td align="center" width="35"><?php echo $info['sex']?></td>
<td align="center" width="35"><?php echo $info['email']?></td>
</tr>
<?php
}
}
?>
其后臺顯示效果如下圖所示:
4)增加功能子菜單
在后臺操作界面中點(diǎn)擊擴(kuò)展→菜單管理闻镶,找到相應(yīng)的菜單先巴,點(diǎn)擊其右邊的“添加子菜單”操作,在界面中設(shè)置要添加菜單的內(nèi)容并提交后即可添加模塊中的子菜單洛二。詳情如下圖所示:
界面中的方法名舱沧,就是后臺控制器類中的方法名,此處填寫的方法名為‘a(chǎn)dd’偶洋,若在后臺控制器類中編寫方法
add()
(如下代碼所示)并輸出一行字符的話熟吏,則可看到下圖的顯示:
<?php
defined('IN_PHPCMS') or exit('No permission resources.');//限制訪問
pc_base::load_app_class('admin','admin',0);//加載admin模塊中的admin類,因?yàn)橄旅嬉^承此類
class test extends admin {
function init(){
$title = "aaaaa";
$infos = array(
array("id"=>1, "name"=>"11111", "age"=>10, "sex"=>"男", "email"=>"aaaa@bbb.com"),
array("id"=>1, "name"=>"11111", "age"=>10, "sex"=>"男", "email"=>"aaaa@bbb.com"),
array("id"=>1, "name"=>"11111", "age"=>10, "sex"=>"男", "email"=>"aaaa@bbb.com"),
array("id"=>1, "name"=>"11111", "age"=>10, "sex"=>"男", "email"=>"aaaa@bbb.com"),
array("id"=>1, "name"=>"11111", "age"=>10, "sex"=>"男", "email"=>"aaaa@bbb.com"),
array("id"=>1, "name"=>"11111", "age"=>10, "sex"=>"男", "email"=>"aaaa@bbb.com"),
);
include $this->admin_tpl('init');
}
//子菜單所指向的方法
function add(){
echo "aaaaaa";
}
}
若想使用如下圖所示的大按鈕(建議使用此方式),則需要加入下列代碼:
<?php
defined('IN_PHPCMS') or exit('No permission resources.');//限制訪問
pc_base::load_app_class('admin','admin',0);//加載admin模塊中的admin類牵寺,因?yàn)橄旅嬉^承此類
class test extends admin {
function init(){
$title = "aaaaa";
$infos = array(
array("id"=>1, "name"=>"11111", "age"=>10, "sex"=>"男", "email"=>"aaaa@bbb.com"),
array("id"=>1, "name"=>"11111", "age"=>10, "sex"=>"男", "email"=>"aaaa@bbb.com"),
array("id"=>1, "name"=>"11111", "age"=>10, "sex"=>"男", "email"=>"aaaa@bbb.com"),
array("id"=>1, "name"=>"11111", "age"=>10, "sex"=>"男", "email"=>"aaaa@bbb.com"),
array("id"=>1, "name"=>"11111", "age"=>10, "sex"=>"男", "email"=>"aaaa@bbb.com"),
array("id"=>1, "name"=>"11111", "age"=>10, "sex"=>"男", "email"=>"aaaa@bbb.com"),
);
//操作界面中添加大按鈕的代碼
$show_validator = $show_scroll = true;
$big_menu = array('javascript:window.top.art.dialog({id:\'add\',iframe:\'?m=link&c=link&a=add\', title:\'添加XXX\', width:\'700\', height:\'450\'}, function(){var d = window.top.art.dialog({id:\'add\'}).data.iframe;var form = d.document.getElementById(\'dosubmit\');form.click();return false;}, function(){window.top.art.dialog({id:\'add\'}).close()});void(0);', "添加XXX");
include $this->admin_tpl('init');
}
function add(){
echo "aaaaaa";
}
}
將代碼中原本用L()
函數(shù)的地方替換成自己需要的東西即可悍引。
(2)創(chuàng)建如下圖所示的數(shù)據(jù)表(學(xué)習(xí)測試用,并不嚴(yán)謹(jǐn))
添加100條數(shù)據(jù)
然后進(jìn)入
www\dynews\phpcms\model
目錄(以東亞新聞網(wǎng)為例)帽氓,即可見到如下圖所示的數(shù)據(jù)庫連接模型趣斤,其與數(shù)據(jù)庫表一一對應(yīng)(多出的一個(gè)表是新建的dy_news)。(3)創(chuàng)建model
根據(jù)此目錄中其他文件的命名規(guī)則黎休,創(chuàng)建test_model.class.php
文件浓领,寫入以下代碼:
<?php
defined('IN_PHPCMS') or exit('No permission resources.');//防止用戶通過前臺訪問
pc_base::load_sys_class('model', '', 0);//加載model.class.php這個(gè)文件的類
class test_model extends model {
function __construct() {
$this->db_config = pc_base::load_config('database');//加載caches\config目錄里的database.php配置文件
$this->db_setting = 'default';//選擇數(shù)據(jù)庫服務(wù)器,服務(wù)器信息就在上面的database.php中設(shè)置势腮,添加數(shù)據(jù)庫服務(wù)器只要增加數(shù)組內(nèi)容即可
$this->table_name = 'test';//此處表名不用寫表前綴
parent::__construct();//繼承model里的父類方法
}
}
(4)控制器類中加載model联贩,連接數(shù)據(jù)庫
在控制器類中增加構(gòu)造方法,加載對應(yīng)的表的model捎拯,代碼如下:
<?php
defined('IN_PHPCMS') or exit('No permission resources.');//限制訪問
pc_base::load_app_class('admin','admin',0);//加載admin模塊中的admin類泪幌,因?yàn)橄旅嬉^承此類
class test extends admin {
function __construct(){
$this->db = pc_base::load_model("test_model");//將model創(chuàng)建成了對象賦值給$this->db,通過此對象即可實(shí)現(xiàn)數(shù)據(jù)庫操作。
}
function init(){
include $this->admin_tpl('init');
}
}
$this->db
對象可以使用www\dynews\phpcms\libs\classes
目錄下model.class.php
這個(gè)類所有的方法!比如使用下面的listinfo()
方法:
<?php
defined('IN_PHPCMS') or exit('No permission resources.');//限制訪問
pc_base::load_app_class('admin','admin',0);//加載admin模塊中的admin類署照,因?yàn)橄旅嬉^承此類
class test extends admin {
function __construct(){
$this->db = pc_base::load_model("test_model");
}
function init(){
$page = isset($_GET['page']) ? intval($_GET['page']):1;//獲取從前臺傳過來的分頁信息
$infos = $this->db->listinfo('', 'id desc', $page, 10);////使用db對象中的listinfo分頁方法祸泪,按id倒序,每次顯示10條
$pages = $this->db->pages;//獲取分頁按鈕信息
include $this->admin_tpl('init');
}
}
前臺代碼如下:
<?php
defined('IN_ADMIN') or exit('No permission resources.');
$show_dialog = 1;
include $this->admin_tpl('header', 'admin');
?>
<div class="pad-lr-10">
<form name="myform" id="myform" action="?m=link&c=link&a=listorder" method="post" >
<div class="table-list">
<table width="100%" cellspacing="0">
<thead>
<tr>
<th width="35" align="center"><input type="checkbox" value="" id="check_box" onclick="selectall('testid[]');"></th>
<th width="35" align="center">編號</th>
<th>姓名</th>
<th width="12%" align="center">年齡</th>
<th width="10%" align="center">性別</th>
<th width='10%' align="center">郵箱</th>
<th width="8%" align="center">添加時(shí)間</th>
<th width="12%" align="center"><?php echo L('operations_manage')?></th>
</tr>
</thead>
<tbody>
<?php
/*
在這里遍歷用listinfo查詢出來的數(shù)據(jù)
*/
if(is_array($infos)){
foreach($infos as $info){
?>
<tr>
<td align="center" width="35"><input type="checkbox" name="linkid[]" value="<?php echo $info['linkid']?>"></td>
<td align="center" width="35"><?php echo $info['id']?></td>
<td align="center" width="35"><?php echo $info['name']?></td>
<td align="center" width="35"><?php echo $info['age']?></td>
<td align="center" width="35"><?php echo $info['sex']?></td>
<td align="center" width="35"><?php echo $info['email']?></td>
<td align="center" width="35"><?php echo date("Y-m-d H:i:s",$info['ptime'])?></td>
</tr>
<?php
}
}
?>
</tbody>
</table>
</div>
<div class="btn">
<input name="dosubmit" type="submit" class="button"
value="<?php echo L('listorder')?>"> <input type="submit" class="button" name="dosubmit" onClick="document.myform.action='?m=link&c=link&a=delete'" value="<?php echo L('delete')?>"/></div>
<div id="pages"><?php echo $pages?></div><!-- 此處就是分頁信息 -->
</form>
</div>
最后后臺界面上顯示如下:
(5)“添加信息”子菜單
在后臺控制器類的init
方法中加入以下代碼:
$big_menu = array('javascript:window.top.art.dialog({id:\'add\',iframe:\'?m=test&c=test&a=add\', title:\''."添加內(nèi)容".'\', width:\'700\', height:\'450\'}, function(){var d = window.top.art.dialog({id:\'add\'}).data.iframe;var form = d.document.getElementById(\'dosubmit\');form.click();return false;}, function(){window.top.art.dialog({id:\'add\'}).close()});void(0);', "添加內(nèi)容");
/*?后面的參數(shù)意思如下
*m是模塊名
*c是類名
*a是方法名
*title是層的標(biāo)題
*width是層的寬
*height是層的高
*js函數(shù)的最后一個(gè)參數(shù)是按鈕顯示內(nèi)容
*/
即可添加大按鈕式的子菜單建芙,這種菜單是彈出一個(gè)層没隘,來進(jìn)行信息的填寫額升略。具體設(shè)置參考上面的增加功能子菜單部分品嚣。
此插件的名稱為“artDialog”翰撑,感性趣的話可以學(xué)習(xí)一下。
之后要在類中編寫和a方法名相同的函數(shù)逝撬。
(6)編寫后臺功能函數(shù)/方法和模板
1)增
我們在前面已經(jīng)介紹了如何增加功能子菜單,在增加子菜單的時(shí)候需要填寫一個(gè)方法名乓土,當(dāng)時(shí)我們填寫的是add
方法宪潮,現(xiàn)在我們來完善這個(gè)方法溯警。完善之前我們先介紹一下系統(tǒng)中的form類,我們將使用該類進(jìn)行圖片上傳的講解狡相。
form類簡介
phpcms/lib/classes/
下的form.class.php這個(gè)類是一個(gè)很好用的類梯轻,加入你想要加入新聞編輯器,只要調(diào)用該類中的editor方法即可尽棕,想要加入上傳圖片喳挑,只要調(diào)用image方法,日歷組件等等滔悉,各種組件都有。
該類是一個(gè)系統(tǒng)類日戈,使用之前必須使用pc_base::load_sys_class("form",'', 0);
代碼加載進(jìn)來弯屈。如下代碼所示:
<?php
defined('IN_PHPCMS') or exit('No permission resources.');//限制訪問
pc_base::load_app_class('admin','admin',0);//加載admin模塊中的admin類,因?yàn)橄旅嬉^承此類
class test extends admin {
function __construct(){
$this->db = pc_base::load_model("test_model");
}
function init(){
$page = isset($_GET['page']) ? intval($_GET['page']):1;
$infos = $this->db->listinfo('', 'id desc', $page, 10);
$pages = $this->db->pages;
$big_menu = array('javascript:window.top.art.dialog({id:\'add\',iframe:\'?m=test&c=test&a=add\', title:\''."添加內(nèi)容".'\', width:\'700\', height:\'450\'}, function(){var d = window.top.art.dialog({id:\'add\'}).data.iframe;var form = d.document.getElementById(\'dosubmit\');form.click();return false;}, function(){window.top.art.dialog({id:\'add\'}).close()});void(0);', "添加內(nèi)容");
include $this->admin_tpl('init');
}
function add(){
pc_base::load_sys_class("form",'', 0);
include $this->admin_tpl('add');
}
}
除此之外诀豁,我們還要準(zhǔn)備好add的模板,如下代碼所示:
<?php
defined('IN_ADMIN') or exit('No permission resources.');
include $this->admin_tpl('header','admin');
?>
<script type="text/javascript">
<!--
$(function(){
$.formValidator.initConfig({formid:"myform",autotip:true,onerror:function(msg,obj){window.top.art.dialog({content:msg,lock:true,width:'200',height:'50'}, function(){this.close();$(obj).focus();})}});
$("#link_name").formValidator({onshow:"<?php echo L("input").L('link_name')?>",onfocus:"<?php echo L("input").L('link_name')?>"}).inputValidator({min:1,onerror:"<?php echo L("input").L('link_name')?>"});
$("#link_url").formValidator({onshow:"<?php echo L("input").L('url')?>",onfocus:"<?php echo L("input").L('url')?>"}).inputValidator({min:1,onerror:"<?php echo L("input").L('url')?>"}).regexValidator({regexp:"^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&]*([^<>])*$",onerror:"<?php echo L('link_onerror')?>"})
})
//-->
</script>
<div class="pad_10">
<form action="?m=test&c=test&a=add" method="post" name="myform" id="myform">
<table cellpadding="2" cellspacing="1" class="table_form" width="100%">
<tr>
<td width="500">用戶名稱:</td>
<td><input type="text" name="test[name]" id="test_name"
size="15" class="input-text"></td>
</tr>
<tr>
<td>用戶年齡:</td>
<td><input type="text" name="test[age]" id="test_age"
size="15" class="input-text"></td>
</tr>
<tr>
<td>用戶性別:</td>
<td><input type="text" name="test[sex]" id="test_sex"
size="15" class="input-text"></td>
</tr>
<tr>
<td>用戶e-mail:</td>
<td><input type="text" name="test[email]" id="test_email"
size="15" class="input-text"></td>
</tr>
<tr id="logolink">
<td>上傳頭像:</td>
<td><?php echo form::images('test[logo]', 'logo', '', 'test')?></td>
</tr>
<tr>
<th></th>
<td><input type="hidden" name="forward" value="?m=test&c=test&a=add"> <input
type="submit" name="dosubmit" id="dosubmit" class="dialog"
value=" 添加 "></td>
</tr>
</table>
</form>
</div>
</body>
</html>
上面的JS代碼是JQuery的formValidator驗(yàn)證插件吨岭,可以百度了解一下。其就是做表單組件內(nèi)容驗(yàn)證的歪赢,你想驗(yàn)證哪個(gè)表單組件,就將其id名寫成哪個(gè)組件的id,例如,我們要驗(yàn)證姓名悦污,就填寫test_name即可:
<script type="text/javascript">
<!--
$(function(){
$.formValidator.initConfig({formid:"myform",autotip:true,onerror:function(msg,obj){window.top.art.dialog({content:msg,lock:true,width:'200',height:'50'}, function(){this.close();$(obj).focus();})}});
$("#test_name").formValidator({onshow:"請輸入用戶名",onfocus:"請正確輸入用戶名"}).inputValidator({min:1,onerror:"用戶名輸入有誤"});
/*
$("#link_url").formValidator({onshow:"<?php echo L("input").L('url')?>",onfocus:"<?php echo L("input").L('url')?>"}).inputValidator({min:1,onerror:"<?php echo L("input").L('url')?>"}).regexValidator({regexp:"^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&]*([^<>])*$",onerror:"<?php echo L('link_onerror')?>"})
*/
})
//-->
</script>
代碼中的.formValidator
中的onshow
是一開始顯示的驗(yàn)證提示踏枣,onfocus
是獲取焦點(diǎn)之后的驗(yàn)證提示瘾婿,.inputValidator
中的min
是允許輸入的最小字符數(shù)煮嫌,onerror
是低于最小字符數(shù)之后的錯(cuò)誤提示恳邀。除此之外還可以在后面進(jìn)行.
連貫操作進(jìn)行進(jìn)一步驗(yàn)證笋颤,可以參考注視的部分,或者百度自行學(xué)習(xí)。
若要顯示這個(gè)插件的驗(yàn)證信息,需要在控制器的方法中加入$show_validator = $show_scroll = $show_header = true;
代碼,如下所示:
function add(){
if(isset($_POST['dosubmit'])){
print_r($_POST['dosubmit']));
}else{
$show_validator = $show_scroll = $show_header = true;
pc_base::load_sys_class("form",'', 0);
include $this->admin_tpl('add');
}
}
做完以上工作之后,我們再點(diǎn)擊我們設(shè)置好的添加菜單按鈕起惕,就可以彈出下面的界面了:
當(dāng)我們點(diǎn)擊“上傳圖片”之后嘀粱,則顯示form組建設(shè)置好的功能界面娃磺,如下圖所示:
我們根據(jù)是否有表單提交傳過來的內(nèi)容,來確定添加按鈕顯示的界面,若有表單提交的內(nèi)容瞻赶,則進(jìn)行后臺的數(shù)據(jù)操作,若無提交內(nèi)容豆混,則展示表單界面鸵鸥,代碼如下:
function add(){
if(isset($_POST['dosubmit'])){
$_POST['test']['ptime'] = SYS_TIME;//SYS_TIME是系統(tǒng)常量摊崭,獲取當(dāng)前時(shí)間
$lastid=$this->db->insert($_POST['test']);
if($lastid){
showmessage('添加成功',HTTP_REFERER);//該函數(shù)
}else{
showmessage('添加失敗','?m=test&c=test&a=init');
}
}else{
$show_validator = $show_scroll = $show_header = true;//加了這行代碼,上面的驗(yàn)證插件才能顯示
pc_base::load_sys_class("form",'', 0);
include $this->admin_tpl('add');
}
}
一下是insert方法和showmessage函數(shù)的詳解:
/**
* 執(zhí)行添加記錄操作
* @param $data 要增加的數(shù)據(jù),參數(shù)為數(shù)組。數(shù)組key為字段值唱较,數(shù)組值為數(shù)據(jù)取值
* @param $return_insert_id 是否返回新建ID號
* @param $replace 是否采用 replace into的方式添加數(shù)據(jù)
* @return boolean
*/
final public function insert($data, $return_insert_id = false, $replace = false) {
return $this->db->insert($data, $this->table_name, $return_insert_id, $replace);
}
/**
* 提示信息頁面跳轉(zhuǎn)汉形,跳轉(zhuǎn)地址如果傳入數(shù)組峰搪,頁面會提示多個(gè)地址供用戶選擇,默認(rèn)跳轉(zhuǎn)地址為數(shù)組的第一個(gè)值侦高,時(shí)間為5秒侧馅。
* showmessage('登錄成功', array('默認(rèn)跳轉(zhuǎn)地址'=>'http://www.phpcms.cn'));
* @param string $msg 提示信息
* @param mixed(string/array) $url_forward 跳轉(zhuǎn)地址
* @param int $ms 跳轉(zhuǎn)等待時(shí)間
*/
function showmessage($msg, $url_forward = 'goback', $ms = 1250, $dialog = '', $returnjs = '') {
if(defined('IN_ADMIN')) {
include(admin::admin_tpl('showmessage', 'admin'));
} else {
include(template('content', 'message'));
}
exit;
}
如此一來罗晕,即可進(jìn)行添加操作茫叭,添加成功后如下圖所示:
2)改
我們在初始化的模板init.tpl.php文件中,增加“修改”操作。增加代碼如下所示:
<?php
defined('IN_ADMIN') or exit('No permission resources.');
$show_dialog = 1;
include $this->admin_tpl('header', 'admin');
?>
<div class="pad-lr-10">
<form name="myform" id="myform" action="?m=link&c=link&a=listorder" method="post" >
<div class="table-list">
<table width="100%" cellspacing="0">
<thead>
<tr>
<th width="35" align="center"><input type="checkbox" value="" id="check_box" onclick="selectall('testid[]');"></th>
<th width="35" align="center">編號</th>
<th>姓名</th>
<th width="12%" align="center">年齡</th>
<th width="10%" align="center">性別</th>
<th width='10%' align="center">郵箱</th>
<th width="8%" align="center">添加時(shí)間</th>
<th width="12%" align="center">操作</th>
</tr>
</thead>
<tbody>
<?php
if(is_array($infos)){
foreach($infos as $info){
?>
<tr>
<td align="center" width="35"><input type="checkbox" name="linkid[]" value="<?php echo $info['linkid']?>"></td>
<td align="center" width="35"><?php echo $info['id']?></td>
<td align="center" width="35"><?php echo $info['name']?></td>
<td align="center" width="35"><?php echo $info['age']?></td>
<td align="center" width="35"><?php echo $info['sex']?></td>
<td align="center" width="35"><?php echo $info['email']?></td>
<td align="center" width="35"><?php echo date("Y-m-d H:i:s",$info['ptime'])?></td>
<!-- 此處為新增代碼 -->
<td align="center" width="12%"><a href="###"
onclick="edit(<?php echo $info['linkid']?>, '<?php echo new_addslashes(new_html_special_chars($info['name']))?>')"
title="<?php echo L('edit')?>"><?php echo L('edit')?></a> | <a
href='?m=link&c=link&a=delete&linkid=<?php echo $info['linkid']?>'
onClick="return confirm('<?php echo L('confirm', array('message' => new_addslashes(new_html_special_chars($info['name']))))?>')"><?php echo L('delete')?></a>
</td>
<!-- 此處為新增代碼over -->
</tr>
<?php
}
}
?>
</tbody>
</table>
</div>
<div class="btn">
<input name="dosubmit" type="submit" class="button"
value="<?php echo L('listorder')?>"> <input type="submit" class="button" name="dosubmit" onClick="document.myform.action='?m=link&c=link&a=delete'" value="<?php echo L('delete')?>"/></div>
<div id="pages"><?php echo $pages?></div>
</form>
</div>
<script type="text/javascript">
function edit(id, name) {
window.top.art.dialog({id:'edit'}).close();
window.top.art.dialog({title:'<?php echo L('edit')?> '+name+' ',id:'edit',iframe:'?m=link&c=link&a=edit&linkid='+id,width:'700',height:'450'}, function(){var d = window.top.art.dialog({id:'edit'}).data.iframe;var form = d.document.getElementById('dosubmit');form.click();return false;}, function(){window.top.art.dialog({id:'edit'}).close()});
}
function checkuid() {
var ids='';
$("input[name='linkid[]']:checked").each(function(i, n){
ids += $(n).val() + ',';
});
if(ids=='') {
window.top.art.dialog({content:"<?php echo L('before_select_operations')?>",lock:true,width:'200',height:'50',time:1.5},function(){});
return false;
} else {
myform.submit();
}
}
//向下移動
function listorder_up(id) {
$.get('?m=link&c=link&a=listorder_up&linkid='+id,null,function (msg) {
if (msg==1) {
//$("div [id=\'option"+id+"\']").remove();
alert('<?php echo L('move_success')?>');
} else {
alert(msg);
}
});
}
</script>
</body>
</html>
新增部分的操作功能的代碼,調(diào)用了其下方的js代碼中的edit函數(shù),這個(gè)函數(shù)還是調(diào)用了artDialog這個(gè)組件悄泥。
我們將代碼做一些微調(diào),調(diào)整一下組件中的title、域名中的m、c、a檐春、id和width骨望、height的值邻遏,這些都是可以調(diào)整的,調(diào)整后如下:
function edit(id, name) {
window.top.art.dialog({id:'edit'}).close();
window.top.art.dialog({title:'修改內(nèi)容 '+name+' ',id:'edit',iframe:'?m=test&c=test&a=mod&id='+id,width:'700',height:'300'}, function(){var d = window.top.art.dialog({id:'edit'}).data.iframe;var form = d.document.getElementById('dosubmit');form.click();return false;}, function(){window.top.art.dialog({id:'edit'}).close()});
}
模板中的html代碼也要根據(jù)上面的調(diào)整做出修改,修改后如下:
<td align="center" width="12%"><a href="###"
onclick="edit(<?php echo $info['id']?>, '<?php echo new_addslashes(new_html_special_chars($info['name']))?>')"
title="修改內(nèi)容">修改</a> | <a
href='?m=link&c=link&a=delete&linkid=<?php echo $info['linkid']?>'
onClick="return confirm('<?php echo L('confirm', array('message' => new_addslashes(new_html_special_chars($info['name']))))?>')"><?php echo L('delete')?></a>
</td>
修改完成后,點(diǎn)擊修改即可彈出彈框。然后我們再編輯mod的模板和控制器方法。
接下來我們先設(shè)置mod的模板,mod的模板基本上和add的模板一樣,不同的地方有以下幾點(diǎn):
1.表單提交到的控制器需要改,包括form中的action要改成?m=test&c=test&a=mod&id=
,以及隱藏的input中value的值?m=test&c=test&a=mod
.
2.給每個(gè)input中都假如默認(rèn)值value=XXX"
,此默認(rèn)值是修改之前的值,具體怎么獲取后面會講到。
模板的整體頁面代碼如下:
<?php
include $this->admin_tpl('header','admin');
?>
<div class="pad_10">
<form action="?m=test&c=test&a=mod&id=<?php echo $id; ?>" method="post" name="myform" id="myform">
<table cellpadding="2" cellspacing="1" class="table_form" width="100%">
<tr>
<td width="500">用戶名稱:</td>
<td><input type="text" name="test[name]" id="test_name"
size="15" class="input-text" value="<?php echo $name; ?>"></td>
</tr>
<tr>
<td>用戶年齡:</td>
<td><input type="text" name="test[age]" id="test_age"
size="15" class="input-text" value="<?php echo $age; ?>"></td>
</tr>
<tr>
<td>用戶性別:</td>
<td><input type="text" name="test[sex]" id="test_sex"
size="15" class="input-text" value="<?php echo $sex; ?>"></td>
</tr>
<tr>
<td>用戶e-mail:</td>
<td><input type="text" name="test[email]" id="test_email"
size="15" class="input-text" value="<?php echo $email; ?>"></td>
</tr>
<tr id="logolink">
<td>上傳頭像:</td>
<td><?php echo form::images('test[logo]', 'logo', $info['logo'], 'test')?></td>
</tr>
<tr>
<th></th>
<td><input type="hidden" name="forward" value="?m=test&c=test&a=mod"> <input
type="submit" name="dosubmit" id="dosubmit" class="dialog"
value=" 添加 "></td>
</tr>
</table>
</form>
</div>
</body>
</html>
然后我們來編寫mod控制器方法,此方法主要邏輯同add一樣,我們根據(jù)是否有表單提交傳過來的內(nèi)容扼睬,來確定添加按鈕顯示的界面军俊,若有表單提交的內(nèi)容,則進(jìn)行后臺的數(shù)據(jù)操作,若無提交內(nèi)容,則展示表單界面,代碼如下:
function mod(){
if(isset($_POST['dosubmit'])){
if($this->db->update($_POST['test'],array('id'=>$_GET['id']))){
showmessage("修改成功");
}else{
showmessage("修改失敗");
}
}else{
//$show_validator = $show_scroll = $show_header = true;//此處暫時(shí)不做前端表單驗(yàn)證
pc_base::load_sys_class('form', '', 0);
//解出鏈接內(nèi)容
$info = $this->db->get_one(array('id'=>$_GET['id']));//這是db類中獲取一條數(shù)據(jù)的方法
extract($info); //此方法可以將數(shù)組轉(zhuǎn)成變量拓售,變量名是數(shù)組中的鍵,變量值是數(shù)組中的值
include $this->admin_tpl('mod');
}
}
上述代碼中用到了db對象中的get_one、update方法和extract函數(shù),extract是php函數(shù)边锁,請自行百度则拷,以下是錢兩種方法的詳細(xì)解釋:
/**
* 獲取單條記錄查詢
* @param $where 查詢條件
* @param $data 需要查詢的字段值[例`name`,`gender`,`birthday`]
* @param $order 排序方式 [默認(rèn)按數(shù)據(jù)庫默認(rèn)方式排序]
* @param $group 分組方式 [默認(rèn)為空]
* @return array/null 數(shù)據(jù)查詢結(jié)果集,如果不存在宣旱,則返回空
*/
final public function get_one($where = '', $data = '*', $order = '', $group = '') {
if (is_array($where)) $where = $this->sqls($where);
return $this->db->get_one($data, $this->table_name, $where, $order, $group);
}
/**
* 執(zhí)行更新記錄操作
* @param $data 要更新的數(shù)據(jù)內(nèi)容组力,參數(shù)可以為數(shù)組也可以為字符串,建議數(shù)組笼蛛。
* 為數(shù)組時(shí)數(shù)組key為字段值惋戏,數(shù)組值為數(shù)據(jù)取值
* 為字符串時(shí)[例:`name`='phpcms',`hits`=`hits`+1]棕孙。
* 為數(shù)組時(shí)[例: array('name'=>'phpcms','password'=>'123456')]
* 數(shù)組的另一種使用array('name'=>'+=1', 'base'=>'-=1');程序會自動解析為`name` = `name` + 1, `base` = `base` - 1
* @param $where 更新數(shù)據(jù)時(shí)的條件,可為數(shù)組或字符串
* @return boolean
*/
final public function update($data, $where = '') {
if (is_array($where)) $where = $this->sqls($where);
return $this->db->update($data, $this->table_name, $where);
}
我們用get_one方法,根據(jù)傳過來的id獲取單條記錄,將記錄中的每一項(xiàng)變成變量同步到模板中,在模板中的input中的value中用echo輸出顯示,就可以顯示默認(rèn)值。我們用update方法,根據(jù)id來更新數(shù)據(jù)庫中的記錄,根據(jù)他返回的布爾值進(jìn)行進(jìn)一步操作。
3)刪
刪除操作則和修改很類似,先修改一下新增的“刪除”操作的a標(biāo)簽的href随珠,將其指向到我們自己的刪除控制器中,代碼如下:
<a href='?m=test&c=test&a=del&id=<?php echo $info['id']?>' onClick="return confirm('你確定要?jiǎng)h除嗎?')">刪除</a>
然后編寫我們的del方法,代碼如下:
function del(){
$id=intval($_GET['id']);
if($id<1 && $id!=0){
return false;
}
$result = $this->db->delete(array('id'=>$id));
if($result){
showmessage('刪除成功','?m=test&c=test&a=init');
}else {
showmessage('刪除失敗','?m=test&c=test&a-init');
}
}
在這里,我們用到了db的delete方法蜻展,具體用法如下:
/**
* 執(zhí)行刪除記錄操作
* @param $where 刪除數(shù)據(jù)條件,不充許為空喉誊。
* @return boolean
*/
final public function delete($where) {
if (is_array($where)) $where = $this->sqls($where);
return $this->db->delete($this->table_name, $where);
}
根據(jù)刪除的結(jié)果做操作,這里我們讓他返回初始頁面纵顾。
7施逾、在線升級下的操作
若我們想在已有功能上添加新的功能遭居,我們需要在控制器目錄下新建個(gè)文件颅湘,文件名一定要用my_
開頭寥殖,后面跟著原控制器的名字霹俺,這樣系統(tǒng)可以自動識別該文件并自動集成原控制器牌柄。但是該文件中的類必須繼承原控制器的類敦捧,文件中的類代碼如下(以友情鏈接為例):
class MY_link extends Link{
function __construct() {
parent::__construct();
}
//……your code
}
注意:
(1)在繼承了原控制器的類之后,如果要重寫構(gòu)造方法,在第一行一定要寫上parent::__construct();
代碼,否則原控制器的構(gòu)造方法會被完全覆蓋甫煞。這個(gè)在任何繼承中都要注意。
(2)如果你寫的一個(gè)類中的方法希停,不希望它被繼承嗤谚,就在方法前面加上final
關(guān)鍵字子寓。
七己儒、PMPCMS框架
1.新建
將項(xiàng)目中的phpsso_server
目錄中的所有目錄和文件復(fù)制一份,在網(wǎng)站根目錄中新建一個(gè)新的項(xiàng)目鹰祸,并粘貼進(jìn)去冤灾,即可使用PHPCMS的框架再建立一個(gè)項(xiàng)目班缰,如下圖所示:
2.配置
需要修改的配置文件全都在www\v9\caches\configs
目錄中踢步。
(1)system.php
將此文件修改成如下所示:
<?php
return array(
//網(wǎng)站路徑
'web_path' => '/v9/',
//Session配置
'session_storage' => 'mysql',//如果要使用文件方式進(jìn)行存儲,此處改為'file'
'session_ttl' => 1800,
'session_savepath' => CACHE_PATH.'sessions/',
'session_n' => 0,
//Cookie配置
'cookie_domain' => '', //Cookie 作用域
'cookie_path' => '/', //Cookie 作用路徑
'cookie_pre' => 'xBgtT_', //Cookie 前綴衷佃,同一域名下安裝多套系統(tǒng)時(shí)诅愚,請修改Cookie前綴
'cookie_ttl' => 0, //Cookie 生命周期大渤,0 表示隨瀏覽器進(jìn)程
'js_path' => 'http://localhost/v9/statics/js/', //CDN JS
'css_path' => 'http://localhost/v9/statics/css/', //CDN CSS
'img_path' => 'http://localhost/v9/statics/images/', //CDN img
'upload_path' => PHPCMS_PATH.'uploadfile/', //上傳文件路徑
'app_path' => 'http://localhost/v9/',//動態(tài)域名配置地址
'charset' => 'utf-8', //網(wǎng)站字符集
'timezone' => 'Etc/GMT-8', //網(wǎng)站時(shí)區(qū)(只對php 5.1以上版本有效)藻肄,Etc/GMT-8 實(shí)際表示的是 GMT+8
'debug' => 1, //是否顯示調(diào)試信息
'admin_log' => 0, //是否記錄后臺操作日志
'errorlog' => 0, //是否保存錯(cuò)誤日志
'gzip' => 1, //是否Gzip壓縮后輸出
'auth_key' => 'cGre2NgmfYLbVhbWLPeG', // //Cookie密鑰
'lang' => 'zh-cn', //網(wǎng)站語言包
'admin_founders' => '1', //網(wǎng)站創(chuàng)始人ID,多個(gè)ID逗號分隔
'execution_sql' => 0, //EXECUTION_SQL
//UCenter配置開始
'ucuse'=>'0',//是否開啟UC
'uc_api'=>'http://localhost/comsenz/uc',//Ucenter api 地址
'uc_ip'=>'',//Ucenter api IP
'uc_dbhost'=>'localhost',//Ucenter 數(shù)據(jù)庫主機(jī)名
'uc_dbuser'=>'root',//Ucenter 數(shù)據(jù)庫用戶名
'uc_dbpw'=>'root',//Ucenter 數(shù)據(jù)庫密碼
'uc_dbname'=>'ucenter',//Ucenter 數(shù)據(jù)庫名
'uc_dbtablepre'=>'uc_',//Ucenter 數(shù)據(jù)庫表前綴
'uc_dbcharset'=>'gbk',//Ucenter 數(shù)據(jù)庫字符集
'uc_appid'=>'',//應(yīng)用id(APP ID)
'uc_key'=>'',//Ucenter 通信密鑰
);
?>
phpcms所用的框架毁兆,將用戶會話信息(session)存到了數(shù)據(jù)庫中浙滤,這是目前中大型網(wǎng)站通用的方法,因?yàn)槭褂梦募鎯Φ脑捚椋嗟脑挷槐阌诠芾矸睦啊R虼爽F(xiàn)在通常使用緩存數(shù)據(jù)庫進(jìn)行存儲。
(2)創(chuàng)建項(xiàng)目數(shù)據(jù)庫
利用phpmyadmin創(chuàng)建一個(gè)新的數(shù)據(jù)庫:
在此庫里創(chuàng)建兩個(gè)必須的表茎芭,分別是記錄用戶信息的admin表和記錄登錄信息的session表揖膜,具體表結(jié)構(gòu)如下圖所示:
(3)database.php
在此文件中配置這些項(xiàng):
<?php
return array (
'default' => array (
'hostname' => 'localhost',
'port' => 3306,
'database' => 'myv9',
'username' => 'root',
'password' => '',
'tablepre' => 'v9_',
'charset' => 'utf8',
'type' => 'mysqli',
'debug' => true,
'pconnect' => 0,
'autoconnect' => 0
)
);
?>
配置完之后退出系統(tǒng)重新登錄,在“管理員設(shè)置->添加管理員”中增加管理員梅桩,則可在admin中顯示新建的信息壹粟。
(4)創(chuàng)建model
在www\v9\phpcms\model
中,根據(jù)創(chuàng)建的數(shù)據(jù)庫 宿百,創(chuàng)建(/保留)admin_model.class.php和session_model.class.php趁仙。
(5)創(chuàng)建(修改)控制器
在www\v9\phpcms\modules
中創(chuàng)建(/保留)admin目錄,創(chuàng)建(/保留)index.php文件垦页,里面有個(gè)right方法雀费,此方法只保留include $this->admin_tpl('right');
這個(gè)代碼。
(6)創(chuàng)建(修改)前臺模板
登錄首頁的模板分為兩塊痊焊,一塊是左邊菜單欄盏袄,其模板文件為www\v9\phpcms\modules\admin\templates\index.tpl.php
,另一塊是右邊的內(nèi)容區(qū)域,其模板文件為www\v9\phpcms\modules\admin\templates\right.tpl.php
,可以對這兩個(gè)文件進(jìn)行編輯修改薄啥,調(diào)整顯示的內(nèi)容貌矿。例如我們在\index.tpl.php模板中添加hello模塊,具體代碼如下(html中添加注釋的部分):
<?php defined('IN_ADMIN') or exit('No permission resources.');?>
<!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=<?php echo CHARSET?>" />
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
<title><?php echo L('phpsso')?></title>
<link href="<?php echo CSS_PATH?>reset.css" rel="stylesheet" type="text/css" />
<link href="<?php echo CSS_PATH?>system.css" rel="stylesheet" type="text/css" />
<style>
#loading{position:absolute;left:600px;display:none}
</style>
<script language="javascript" type="text/javascript" src="<?php echo JS_PATH?>jquery.min.js"></script>
</head>
<body scroll="no">
<div id="loading"><div class="msg lf"><p class="attention"><?php echo L('loading');?><span id="loadsecond"></span>...</p></div></div>
<div class="header">
<div class="logo lf"><span class="invisible"><?php echo L('phpsso')?></span></div>
<div class="lf">
<div class="log white cut_line"><?php echo L('hellow')?> <?php echo $userinfo['username']?> <?php if($userinfo['issuper']) echo '['.L('subminiature_tube').']'?><span>|</span><a href="?m=admin&c=password&a=init" target="right_iframe">[<?php echo L('account_setting')?>]</a><span>|</span><a href="?m=admin&c=login&a=logout">[<?php echo L('logout')?>]</a></div>
</div>
</div>
<div id="content" class="content-on">
<div class="col-left left_menu">
<div>
<a href="/"><h3 class="f14"><?php echo L('manage_center')?></h3></a>
<ul>
<li class="menuli" onclick="menu_show(this);"><a hidefocus="true" style="outline:none" href="?m=admin&c=password&a=init" target="right_iframe"><?php echo L('account_setting')?></a></li>
<li class="menuli" onclick="menu_show(this);"><a hidefocus="true" style="outline:none" href="?m=admin&c=administrator&a=init" target="right_iframe"><?php echo L('admin_manage')?></a></li>
<!-- 此處為歡迎模塊(開始) -->
<li class="menuli" onclick="menu_show(this);"><a hidefocus="true" style="outline:none" href="?m=hello&c=hello&a=init" target="right_iframe">歡迎模塊</a></li>
<!-- 此處為歡迎模塊(結(jié)束) -->
</ul>
</div>
<a hidefocus="true" style="outline:none" href="javascript:;" id="openClose" class="open" title="<?php echo L('spread_or_closed')?>"><span class="hidden"><?php echo L('expand')?></span></a>
</div>
<div class="col-auto mr8">
<div class="crumbs"><?php echo L('local')?><span id="local"></span></div>
<div class="col-1">
<div class="content">
<iframe name="right_iframe" id="right_iframe" src="?m=admin&c=index&a=right" frameborder="false" scrolling="auto" style="overflow-x:hidden;border:none" width="100%" height="auto" allowtransparency="true" onload="showloading()"></iframe>
</div>
</div>
</div>
</div>
<script type="text/javascript">
//clientHeight-0; 空白值 iframe自適應(yīng)高度
function windowW(){
if($(window).width()<940){
$('.header').css('width',940+'px');
$('#content').css('width',940+'px');
$('body').attr('scroll','');
$('body').css('overflow','');
}
}
windowW();
$(window).resize(function(){
if($(window).width()<940){
windowW();
}else{
$('.header').css('width','auto');
$('#content').css('width','auto');
$('body').attr('scroll','no');
$('body').css('overflow','hidden');
}
});
window.onresize = function(){
var heights = document.documentElement.clientHeight-120;document.getElementById('right_iframe').height = heights;
var openClose = $("#right_iframe").height()+39;
$("#openClose").height(openClose);$("#content").height(openClose);
}
window.onresize();
//左側(cè)開關(guān)
$("#openClose").toggle(
function () {
$(".left_menu").addClass("left_menu_on");
$(this).addClass("close");
$("#content").addClass("content-off")
},
function () {
$(".left_menu").removeClass("left_menu_on");
$(this).removeClass("close");
$("#content").removeClass("content-off")
}
);
function menu_show(obj) {
$('.menuli').removeClass('on fb blue');
$(obj).addClass('on fb blue');
}
function span_local(name) {
$('#local').html(name);
}
if(top.location != self.location) {
top.location=self.location;
}
var read;
function showloading(type) {
if(type) {
$('#loadsecond').html('');
$('#loading').show();
//second = 1;
//read = setInterval(readsecond, 1000);
} else {
$('#loading').fadeOut("slow");
//if(read) clearInterval(read);
}
}
function readsecond() {
$('#loadsecond').html('('+second+')');
second++;
}
</script>
</body>
</html>
然后再建立相應(yīng)的控制器罪佳。
(7)創(chuàng)建控制器
控制器的創(chuàng)建和編寫請參考第六章第四節(jié)逛漫。
(8)配置默認(rèn)首頁
進(jìn)入系統(tǒng)后默認(rèn)的界面,此配置請參考第六章第三節(jié)赘艳。
3酌毡、調(diào)用系統(tǒng)庫的類和函數(shù)
參考第六章第四節(jié)第1克握、2小節(jié),此處以sso模塊中的form.class.php
這個(gè)文件的類進(jìn)行講解枷踏。
3.1菩暗、調(diào)用form中的文本編輯器,代碼如下:
<?php
defined('IN_PHPCMS') or exit('No permission resources.');
pc_base::load_app_class('admin','admin',0);
pc_base::load_sys_class('form','',0);
class hello {
function init(){
echo '<textarea id="content"></textarea>';
echo form::editor('content','full','hello');
}
}
3.2旭蠕、調(diào)用form中的圖片上傳插件停团,代碼如下:
<?php
defined('IN_PHPCMS') or exit('No permission resources.');
pc_base::load_app_class('admin','admin',0);
pc_base::load_sys_class('form','',0);
class hello {
function init(){
echo form::images('logo');
}
}
3.3、調(diào)用form中的日歷插件掏熬,代碼如下:
<?php
defined('IN_PHPCMS') or exit('No permission resources.');
pc_base::load_app_class('admin','admin',0);
pc_base::load_sys_class('form','',0);
class hello {
function init(){
echo form::date('starttime');
}
}
3.4佑稠、調(diào)用form中的驗(yàn)證碼插件,代碼如下:
<?php
defined('IN_PHPCMS') or exit('No permission resources.');
pc_base::load_app_class('admin','admin',0);
pc_base::load_sys_class('form','',0);
class hello {
function init(){
echo form::checkcode();
}
}
具體實(shí)現(xiàn)請見第六章第6節(jié)第6小節(jié)form類詳解旗芬。
4舌胶、模塊移植
4.1、拷貝模塊目包
將原項(xiàng)目名\phpcms\modules\
目錄中的模塊疮丛,拷貝到現(xiàn)項(xiàng)目名\phpcms\modules\
中幔嫂。
4.2、拷貝數(shù)據(jù)庫
將數(shù)據(jù)庫中原模塊對應(yīng)的的數(shù)據(jù)庫表誊薄,挪到現(xiàn)模塊對應(yīng)的數(shù)據(jù)庫中履恩。注:若使用數(shù)據(jù)庫文件拷貝的方式,要拷貝對應(yīng)的frm
呢蔫、MYD
切心、MYI
三個(gè)文件,且在拷貝之前要停止數(shù)據(jù)庫服務(wù)咐刨。
4.3昙衅、拷貝數(shù)據(jù)庫連接模型
將原項(xiàng)目名\\phpcms\model
目錄中的模塊對應(yīng)的數(shù)據(jù)庫連接模型扬霜,拷貝到現(xiàn)項(xiàng)目名\phpcms\model
中定鸟。
4、如何使用前臺模板
phpcms中的sso的小型框架著瓶,目前沒有整合前臺模板联予,你可以自己把smarty模板加入進(jìn)去。
八材原、站點(diǎn)移植
如何將此站點(diǎn)從現(xiàn)服務(wù)器移植到一個(gè)新的服務(wù)器上沸久。
1、拷貝原應(yīng)用
先將現(xiàn)項(xiàng)目目錄下的所有文件和目錄全部拷貝到新服務(wù)器的項(xiàng)目目錄下余蟹。例如原項(xiàng)目目錄為dynews\
,新項(xiàng)目目錄為dynews2\
,則將dynews\
下的文件和目錄(如下圖所示)全部拷貝到dynews2\
中卷胯。
2、拷貝數(shù)據(jù)庫
將原有的數(shù)據(jù)庫所有的表都拷貝到新的數(shù)據(jù)庫服務(wù)器中威酒。
小插曲:做個(gè)本機(jī)域名
在windows系統(tǒng)中窑睁,C:\WINDOWS\system32\drivers\etc
下的hosts文件里最后加上一行代碼:
127.0.0.1 你的域名
注意挺峡,上面的“你的域名”一定是要沒有注冊過的域名。
這樣設(shè)置過之后就可以通過域名訪問本機(jī)了担钮。
3橱赠、修改配置文件的域名
修改新項(xiàng)目/caches/configs/system.php
里面所有和域名有關(guān)的,把以前的老域名修改為新域名就可以了箫津。
例如本項(xiàng)目總將所有的/dynews/
改為/dynews2/
,所有的/localhost/
都改為/www.dazuiwoniu.com/
4狭姨、修改后臺設(shè)置的站點(diǎn)
進(jìn)行后臺設(shè)置->站點(diǎn)管理 對相應(yīng)的站點(diǎn)的域名進(jìn)行修改。此項(xiàng)目中苏遥,將“站點(diǎn)域名”這一項(xiàng)由原來的http://localhost/dynews/
改為http://www.dazuiwoniu.com/dynews2
饼拍。修改完成后,刪掉項(xiàng)目目錄中的index.html文件暖眼,然后點(diǎn)擊內(nèi)容->管理欄目惕耕,點(diǎn)擊其中的更新欄目緩存,最后點(diǎn)擊更新緩存诫肠。
5司澎、修改附件地址
進(jìn)入內(nèi)容->附件管理->附件地址替換。把附件地址批量的替換為新的地址栋豫。然后更新緩存挤安。
6、更新文章URL地址
內(nèi)容->批量更新URL 丧鸯。把所有的文章的地址都更新一下蛤铜。
7、生成全站
把全站都生成一次丛肢。
九围肥、和Discuz!整合
1、PHPSSO的作用
(1)統(tǒng)一多個(gè)phpcms站點(diǎn)的用戶蜂怎,例如一個(gè)網(wǎng)站穆刻,在北京、上海杠步、西安氢伟、武漢等地機(jī)房都搭建了站點(diǎn),但他們幾個(gè)站點(diǎn)的用戶卻只有一個(gè)統(tǒng)一的用戶幽歼,這個(gè)時(shí)候就只要有一個(gè)站點(diǎn)安裝了PHPSSO就可以讓這幾個(gè)站點(diǎn)使用一套用戶就行了朵锣。下面進(jìn)行演示:
1)重新安裝一個(gè)站點(diǎn),但不要用全新安裝模式甸私,這樣就不會安裝PHPSSO了诚些。如下圖所示:
注意:安裝時(shí)要選用新的數(shù)據(jù)庫,否則會安裝失敗皇型。
安裝完后诬烹,在后臺管理的PHPSSO->應(yīng)用設(shè)置中就出現(xiàn)了兩個(gè)站點(diǎn)之間的通信狀態(tài)助析,如下圖所示:
2)設(shè)置
如果phpsso中的應(yīng)用列表中有記錄顯示通訊失敗的話,就要對此條目進(jìn)行編輯,點(diǎn)擊操作一欄中的“編輯”,詳細(xì)內(nèi)容中的“通信密鑰”中的值一定要和你要同步的站點(diǎn)中的“設(shè)置”->“PHPSSO配置”里的“加密密鑰的值相同”绞幌。
**注意:出現(xiàn)通信不成功有可能是以下幾種狀況:
①phpsso中應(yīng)用設(shè)置里的應(yīng)用ID與設(shè)置中的phpsso配置中的應(yīng)用ID不對應(yīng)酪耳。
②c:windows\systyem32\drivers\etc\hosts
文件中沒有綁定127.0.0.1 localhost(將# 127.0.0.1 localhost 前面的#號去掉)。
③把phpcms\modules\member\classes\client.class.php 361行
$fp = @fsockopen(($ip ? $ip : $host), $port, $errno, $errstr, $timeout);
改成:
$fp = stream_socket_client("tcp://".($ip ? $ip : $host).":".$port, $errno, $errstr, $timeout);
這樣就可以解決fsockopen pfsockopen兩個(gè)函數(shù)禁用的問題。
④修改php.ini,加上一行:allow_url_include = On;
。
⑤找到\phpcms\modules\member\classes\client.class.php文件脑沿;找到$return_arr = explode("\n", $return);
,上面還有官方的注釋“//部分虛擬主機(jī)返回?cái)?shù)值有誤马僻,暫不確定原因庄拇,過濾返回?cái)?shù)據(jù)格式”【碌耍看來已經(jīng)發(fā)現(xiàn)問題措近,就是沒有正確解決,修改為$return_arr = explode("\r\n\r\n", $return);
然后更新全站緩存女淑。
⑥如果以上方法都不管用瞭郑,那就重新安裝一下分站點(diǎn)。**
2鸭你、Discuz!的安裝
(1)去官網(wǎng)下載Discuz!的安裝包屈张。
(2)新建discuz!的數(shù)據(jù)庫。
(3)將discuz!安裝包中upload目錄中的所有文件拷貝到網(wǎng)站根目錄的新域名目錄下袱巨。
(4)訪問http://localhost/域名/install
開始安裝阁谆,安裝界面如下:
(5)安裝完之后訪問后臺要先在前臺登錄管理員賬號,然后點(diǎn)擊管理中心再登錄愉老,然后進(jìn)入后臺场绿,后臺如下圖所示。
3俺夕、Discuz!和phpcms的呼配調(diào)通
(1)discuz!的設(shè)置:
①點(diǎn)擊UCenter->應(yīng)用管理->添加應(yīng)用裳凸;
②填寫如下圖所示的值:
(2)phpcms的設(shè)置:
①點(diǎn)擊phpsso->系統(tǒng)設(shè)置->UCenter配置
②填寫如下圖所示的值:
(3)第(2)步之后第(1)步中的應(yīng)用自動通信成功贱鄙!
這時(shí)在phpcms和discuz劝贸!中注冊,在另一個(gè)系統(tǒng)中也能直接登錄了逗宁。
4映九、Discuz!和phpcms的同步登錄退出
詳情請見手冊中的“整合文檔->整合Discuz!”瞎颗,或者“常見問題->應(yīng)用間同步登錄問題”這一項(xiàng)件甥。
5捌议、phpcms調(diào)用Discuz!的帖子
(1)添加數(shù)據(jù)源
①點(diǎn)擊phpcms后臺->模塊->數(shù)據(jù)源->外部數(shù)據(jù)源->添加外部數(shù)據(jù)源引有,彈出如下圖所示界面:
②在模板中要展示帖子的地方貼上如下代碼瓣颅,即可調(diào)用論壇中的帖子:
{pc:get sql="SELECT * FROM pre_forum_thread" cache="3600" page="$page" dbsource="discuz" return="data"}
<ul>
{loop $data $key $val}
<li><a href="http://localhost/discuz/forum.php?mod=viewthread&tid={$val[tid]}">{$val[subject]}</a></li>
{/loop}
</ul>
{if $pages}<div class=page>{$pages}</div>{/if}
{/pc}
其中dbsource
就是前面設(shè)置的數(shù)據(jù)源名,鏈接中的$val[tid]
是discuz帖子中的唯一id譬正。
如此一來宫补,在頁面上即可調(diào)用論壇的數(shù)據(jù)。
十曾我、其他細(xì)節(jié)
1.頁面靜態(tài)化
①點(diǎn)擊內(nèi)容->管理欄目粉怕,選擇一個(gè)欄目,點(diǎn)擊修改抒巢,點(diǎn)擊生成HTML設(shè)置tab贫贝,將欄目生成html和內(nèi)容頁生成html都選擇‘是’。
或者點(diǎn)擊內(nèi)容->管理欄目蛉谜,選擇批量編輯稚晚,將全部的目生成html和內(nèi)容頁生成html都選擇‘是’。
然后別忘了點(diǎn)擊批量更新URL型诚、批量更新欄目頁蜈彼、批量更新內(nèi)容頁和更新緩存。
②如果設(shè)置完之后地址是靜態(tài)的了但是訪問不了俺驶,那我們就要更改阿帕奇的配置文件了幸逆。打開阿帕奇的httpd.conf文件,找到
#LoadModule rewrite_module modules/mod_rewrite.so
暮现,將其開啟(把前面的#去掉)还绘,再把一開始下載的phpcms壓縮包里的readme目錄下的.htaccess
文件拷貝到項(xiàng)目目錄中,之后重啟web服務(wù)器栖袋。
2.主程序與web目錄程序分離
如果有黑客攻擊了網(wǎng)站根目錄(www目錄)拍顷,那么他只能攻擊www目錄下的目錄和文件,所以我們把網(wǎng)站的主程序部分(項(xiàng)目目錄中的phpcms目錄)拷貝到服務(wù)器別的目錄中塘幅,就不會被攻擊到了昔案,會使網(wǎng)站更安全。詳情請見手冊中的高級應(yīng)用于部署->主程序與web目錄分離一項(xiàng)电媳。
3.Sphinx做全文索引
詳情請見手冊中的高級應(yīng)用于部署->Sphinx全文索引教程踏揣。建議先學(xué)習(xí)Sphinx。
4.高洛峰自創(chuàng)的Ajax類
搜索一下高洛峰自己寫的Ajax類匾乓,可以搜索高洛峰老師以前的視頻來尋找捞稿。