教你快速搭建網(wǎng)站——PHPCMS二次開發(fā)

一渣刷、開發(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目錄剔蹋,即可打開安裝界面(如下圖所示)旅薄。

安裝首界面.png

第一步:同意許可協(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則訪問后臺管理頁面液荸。

三瞻佛、后臺功能

后臺首頁.png

1.我的面板

(1)修改個(gè)人信息

修改個(gè)人信息.png

其中Language語言一項(xiàng)脱篙,改完之后要刷新娇钱,則整個(gè)界面就改成其他語言。

(2)修改密碼

可以修改管理員登錄密碼绊困。

(3)生成首頁

點(diǎn)擊則可以生成首頁的靜態(tài)化html文件文搂,加快外界訪問速度。

2.設(shè)置

(1)站點(diǎn)管理

站點(diǎn)管理.png

點(diǎn)擊修改


站點(diǎn)管理修改.png

可以在此進(jìn)行修改網(wǎng)站相關(guān)設(shè)置秤朗。

(2)管理員管理

管理員管理.png

可以在此進(jìn)行管理員管理煤蹭。

1)口令卡

申請口令卡.png

點(diǎn)擊申請口令卡
口令卡申請成功.png

口令卡申請成功,一定要牢牢保存好口令卡圖片取视。
口令卡登錄.png

按照圖中所示硝皂,根據(jù)口令卡對照著輸入正確數(shù)字才能登陸。

(3)角色管理

phpcms中支持對用戶進(jìn)行角色管理作谭,如下圖稽物,角色管理中的權(quán)限分為管理權(quán)限和使用權(quán)限:


角色管理.png

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)模塊管理
模塊管理.png

通過管理操作中的禁止咪奖、卸載和安裝可以操作所列的這些模塊,操作完之后需要更新一下緩存酱床。
上圖所示的這些模塊就在項(xiàng)目目錄/phpcms/modules/中的各個(gè)目錄羊赵。

2)友情鏈接
①添加類別
友情鏈接之添加分類.png
②添加友情鏈接
友情鏈接之添加友情鏈接.png

該友情鏈接模塊還能夠通過進(jìn)行前臺申請,只有通過后臺管理員通過以后才會顯示在前臺的友情鏈接中扇谣。

4.內(nèi)容

(1)管理欄目

內(nèi)容之管理欄目.png

上圖展示了目前網(wǎng)站所有欄目的結(jié)構(gòu)昧捷。

1)添加類別
欄目管理之添加欄目.png

(2)模型管理

模型管理.png
1)添加模型

模型管理之添加模型.png

點(diǎn)擊字段管理可以更改字段相關(guān)屬性,還能夠添加你所需要的字段揍堕,修改字段的排序就可以更改其在模板中顯示的位置料身。
在此處設(shè)置好模型之后,在欄目管理中就可以使用了衩茸。

(3)采集管理及其使用方法

1)添加采集點(diǎn):上圖中采集頁面編碼是采集對象網(wǎng)站使用的是什么字符集編碼芹血。

采集管理之添加采集站點(diǎn).png

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)容如下圖所示。


采集測試.png

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)于在頁面上修改代碼。如下圖:


pc標(biāo)簽編輯.png
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)行簡單的編輯搂赋,如下圖:
添加碎片.png

然后進(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\目錄中拷入已有模塊中的installuninstall目錄,即可實(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ò)展”->“菜單管理”->“添加菜單”中添加菜單鳄炉,可以將新功能置于任何后臺菜單目錄之下杜耙,如圖:

phpcms截圖添加菜單.png

按照文本框后的提示將其全部填完,點(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')?>: &nbsp;&nbsp; <a href="?m=link&c=link"><?php echo L('all')?></a> &nbsp;&nbsp;
        <a href="?m=link&c=link&typeid=0">默認(rèn)分類</a>&nbsp;
        <?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>&nbsp;
        <?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)為例)顾瞪,如下圖:

語言包.png

每個(gè)英文包中都含有各個(gè)模塊的翻譯文件,如下圖:
翻譯文件.png

每個(gè)翻譯文件里裝的都是一個(gè)php數(shù)組(以友情鏈接模塊為例),如下圖:
語言翻譯文件內(nèi)容.png

自己創(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í)候,會自動將方法中的變量帶入到該模板中府喳。

控制器變量帶入到模板中去.png

假設(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
    }
}
?>

其后臺顯示效果如下圖所示:


后臺控制器變量的前段展示.png

4)增加功能子菜單
在后臺操作界面中點(diǎn)擊擴(kuò)展→菜單管理闻镶,找到相應(yīng)的菜單先巴,點(diǎn)擊其右邊的“添加子菜單”操作,在界面中設(shè)置要添加菜單的內(nèi)容并提交后即可添加模塊中的子菜單洛二。詳情如下圖所示:

添加子菜單1.png

添加子菜單2.png

界面中的方法名舱沧,就是后臺控制器類中的方法名,此處填寫的方法名為‘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";
    }
}
子菜單函數(shù)的輸出.png

若想使用如下圖所示的大按鈕(建議使用此方式),則需要加入下列代碼:


大按鈕圖.png
<?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))

創(chuàng)建后臺模塊測試表.png

添加100條數(shù)據(jù)
然后進(jìn)入www\dynews\phpcms\model目錄(以東亞新聞網(wǎng)為例)帽氓,即可見到如下圖所示的數(shù)據(jù)庫連接模型趣斤,其與數(shù)據(jù)庫表一一對應(yīng)(多出的一個(gè)表是新建的dy_news)。
數(shù)據(jù)庫連接模型(model).png

與model對應(yīng)的整個(gè)系統(tǒng)的數(shù)據(jù)表.png

(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')?>">&nbsp;&nbsp;<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>

最后后臺界面上顯示如下:


后臺遍歷結(jié)果.png
(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è)置好的添加菜單按鈕起惕,就可以彈出下面的界面了:


點(diǎn)擊添加內(nèi)容按鈕的效果.png

當(dāng)我們點(diǎn)擊“上傳圖片”之后嘀粱,則顯示form組建設(shè)置好的功能界面娃磺,如下圖所示:


點(diǎn)擊上傳圖片后的界面.png

我們根據(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)行添加操作茫叭,添加成功后如下圖所示:


添加成功.png
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')?>">&nbsp;&nbsp;<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)目班缰,如下圖所示:

利用架構(gòu)新建項(xiàng)目.png

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ù)庫:


利用phpmyadmin創(chuàng)建數(shù)據(jù)庫.png

在此庫里創(chuàng)建兩個(gè)必須的表茎芭,分別是記錄用戶信息的admin表和記錄登錄信息的session表揖膜,具體表結(jié)構(gòu)如下圖所示:


admin表結(jié)構(gòu).png
session表結(jié)構(gòu).png

(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\中卷胯。

站點(diǎn)移植需要拷貝的文件.png

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了诚些。如下圖所示:

多站點(diǎn)安裝時(shí)phpsso的選擇.png

注意:安裝時(shí)要選用新的數(shù)據(jù)庫,否則會安裝失敗皇型。
安裝完后诬烹,在后臺管理的PHPSSO->應(yīng)用設(shè)置中就出現(xiàn)了兩個(gè)站點(diǎn)之間的通信狀態(tài)助析,如下圖所示:
與新站點(diǎn)的通信狀態(tài).png

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開始安裝阁谆,安裝界面如下:

discuz安裝界面1.png

(5)安裝完之后訪問后臺要先在前臺登錄管理員賬號,然后點(diǎn)擊管理中心再登錄愉老,然后進(jìn)入后臺场绿,后臺如下圖所示。
discuz后臺首頁.png

3俺夕、Discuz!和phpcms的呼配調(diào)通

(1)discuz!的設(shè)置:

①點(diǎn)擊UCenter->應(yīng)用管理->添加應(yīng)用裳凸;
②填寫如下圖所示的值:


UCenter中添加應(yīng)用.png

(2)phpcms的設(shè)置:

①點(diǎn)擊phpsso->系統(tǒng)設(shè)置->UCenter配置
②填寫如下圖所示的值:


phpsso中的ucenter設(shè)置.png

(3)第(2)步之后第(1)步中的應(yīng)用自動通信成功贱鄙!

ucenter通信成功.png

這時(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ù)源引有,彈出如下圖所示界面:


添加外部數(shù)據(jù)源填寫的信息.png

②在模板中要展示帖子的地方貼上如下代碼瓣颅,即可調(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都選擇‘是’。

單個(gè)欄目生成靜態(tài)html.png

或者點(diǎn)擊內(nèi)容->管理欄目蛉谜,選擇批量編輯稚晚,將全部的目生成html和內(nèi)容頁生成html都選擇‘是’。
批量欄目生成靜態(tài)html.png

然后別忘了點(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類匾乓,可以搜索高洛峰老師以前的視頻來尋找捞稿。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。
  • 序言:七十年代末娱局,一起剝皮案震驚了整個(gè)濱河市彰亥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌衰齐,老刑警劉巖任斋,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異耻涛,居然都是意外死亡仁卷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門犬第,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锦积,“玉大人,你說我怎么就攤上這事歉嗓》峤椋” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵鉴分,是天一觀的道長哮幢。 經(jīng)常有香客問我,道長志珍,這世上最難降的妖魔是什么橙垢? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮伦糯,結(jié)果婚禮上柜某,老公的妹妹穿的比我還像新娘。我一直安慰自己敛纲,他們只是感情好喂击,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著淤翔,像睡著了一般翰绊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上旁壮,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天监嗜,我揣著相機(jī)與錄音,去河邊找鬼抡谐。 笑死裁奇,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的童叠。 我是一名探鬼主播框喳,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼厦坛!你這毒婦竟也來了五垮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤杜秸,失蹤者是張志新(化名)和其女友劉穎放仗,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撬碟,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡诞挨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了呢蛤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惶傻。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖其障,靈堂內(nèi)的尸體忽然破棺而出银室,到底是詐尸還是另有隱情,我是刑警寧澤励翼,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布蜈敢,位于F島的核電站,受9級特大地震影響汽抚,放射性物質(zhì)發(fā)生泄漏抓狭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一造烁、第九天 我趴在偏房一處隱蔽的房頂上張望否过。 院中可真熱鬧,春花似錦惭蟋、人聲如沸叠纹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽誉察。三九已至,卻和暖如春惹谐,著一層夾襖步出監(jiān)牢的瞬間持偏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工氨肌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鸿秆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓怎囚,卻偏偏與公主長得像卿叽,于是被迫代替她去往敵國和親桥胞。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容

  • phpcms二次開發(fā)流程 1.創(chuàng)建數(shù)據(jù)庫和數(shù)據(jù)庫表 2.創(chuàng)建模塊目錄 首先要在phpcms/modules目錄下創(chuàng)...
    任人漸疏_Must閱讀 1,920評論 0 0
  • 在如今互聯(lián)網(wǎng)發(fā)展迅速猛進(jìn)的大環(huán)境下考婴,網(wǎng)站已經(jīng)成為一個(gè)企業(yè)不可缺少的網(wǎng)絡(luò)媒介贩虾。但網(wǎng)站開發(fā)行業(yè)魚龍混雜,質(zhì)量參差不齊沥阱,...
    GavinHsueh閱讀 20,125評論 9 70
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險(xiǎn)厭惡者缎罢,不喜歡去冒險(xiǎn),但是人生放棄了冒險(xiǎn)考杉,也就放棄了無數(shù)的可能策精。 ...
    yichen大刀閱讀 6,049評論 0 4
  • 公元:2019年11月28日19時(shí)42分農(nóng)歷:二零一九年 十一月 初三日 戌時(shí)干支:己亥乙亥己巳甲戌當(dāng)月節(jié)氣:立冬...
    石放閱讀 6,879評論 0 2