建立新模型不僅在織夢dedecms二次開發(fā)中常用到,有時候在仿站時也用到,雖然,建立模型比較簡單,但是模型里面的那十多項表單內(nèi)容確不好理解,今天就通過建立模型相關(guān)程序和數(shù)據(jù)庫知識詳細分析一下,以便給大家一個系統(tǒng)的了解,以后,我們建立新模型的時候就可以大膽的做了。
網(wǎng)上有很多關(guān)于建立新模型的教程,一般都是直接告訴我們怎么做,但是為什么這樣做?確沒有這樣的教程,本站建立的主要原因也是在此,通過分析程序來講解一些織夢功操作原理,這一點是與其它教程根本區(qū)別。在建立新模型前我們要對里面的每一項進行分析。
進入網(wǎng)站后臺,用箭頭表示下一步:核心→內(nèi)容模型→內(nèi)容模型管理→點增加新模型→進入創(chuàng)建模型界面,如下圖所示,
圖1
接下來我們就詳細分析這一界面每一項功能作用。
這個“新增內(nèi)容模型”界面用到的文件是http://www.dedebase.com/dede/mychannel_add.php,即根目錄下面dede(如果后臺路徑?jīng)]有改的話)文件夾下面的mychannel_add.php,這個php程序,對應(yīng)的模板文件是mychannel_add.htm,用到的數(shù)據(jù)庫表是dede_channeltype。
現(xiàn)在回到新增內(nèi)容模型界面:
第一項是:頻道ID,這個“頻道ID”并不是指這個模型id,它只是一個id號,這個頻道ID對應(yīng)的數(shù)據(jù)庫表字段是“id”,而模型id對應(yīng)的數(shù)據(jù)庫表字段是“nid”,這二個id是非常容易混淆的。為了區(qū)別這二個id,我們看一下內(nèi)容模型管理界面、數(shù)據(jù)庫表dede_channeltype(只截取表中有用的部分,其它忽略)和新增內(nèi)容模型部分截圖三張圖對比如下。
圖21
圖22
圖23
在圖21中的“id號”、“識別id”分別與圖22中的字段“id”、“nid”對應(yīng),即id號和表中字段id同一個id,識別id和表中字段nid(nid是模型id)是一個id。上面提到的“頻道ID”就是id號,也就是圖22中字段“id”,而圖23中第二項“名字標識”才是模型id,即對應(yīng)表字段nid。這二者非常容易混淆。
我是如何分清的呢?我們這樣來分析圖21和圖23,只不過都是數(shù)據(jù)庫表字段,在模板里的不同的叫法吧了,這二張圖里面的名字在圖22對應(yīng)表里都有,這些對應(yīng)我們通過模板mychannel_add.htm來找。打開這個模板,找到從61行開始向下看,我截取一部分圖如下所示。
我們找到:name="id",value="<?php echo $newid; ?>" 這個name="id"就是數(shù)據(jù)庫表dede_channeltype里面對應(yīng)的id,后面value 里面的變量$newid就是你在后臺填寫的唯一數(shù)字,也就是圖23第一項,你在后面那個方框里寫的數(shù)字。
我們再看:name="nid" type="text" id="nid" value="ch<?php echo $newid; ?>" 這個name="nid"就是數(shù)據(jù)庫表dede_channeltype里面對應(yīng)的模型id,即nid,后面value 里面的變量$newid就是你在后臺填寫的唯一數(shù)字,也就是圖23
第二項名字標識,你在后面那個方框里寫的數(shù)字。只不過在$newid前面強制加上了ch。
以下各項與數(shù)據(jù)庫表dede_channeltype一一對應(yīng)。與上面二個的分析完全一樣,這里些對應(yīng)不一一分析了,留給大家作練習用,希望大家自己分析一下,這樣可以學習不少東西。
我們再回到第一項,下面有段說明是“數(shù)字,創(chuàng)建后不可更改,并具有唯一性。”,這里講的唯一性,指的是你寫的這個數(shù)值不能與其它模型重復,如文章的id號是1,商品的id號是6,分類信息的id號-8,在這里填寫的頻道id不能與這些id號重復,必須保持唯一性。
像id,nid都是通過模板mychannel_add.htm,收集數(shù)據(jù),然后,通過這些字段,把收集到的數(shù)據(jù)插入到數(shù)據(jù)庫,這一過程如何實現(xiàn)的呢?
當用戶(或管理員或信息發(fā)布員)填寫好數(shù)據(jù)后,當點擊保存后,模板里面的這些字段如id,nid等,收集value后面的數(shù)據(jù)庫,然后,通過<form>里面的action="mychannel_add.php",這個mychannel_add.php文件,把數(shù)據(jù)插入到數(shù)據(jù)庫里面的。
在mychannel_add.php這個文件中,首先初始化一下,然后,檢查收集到的數(shù)據(jù)如第一項id的數(shù)據(jù)是不是數(shù)字,不是就退出;第二項nid是不是“英文字母或與數(shù)字混合字符串”,不是就退出;第三項附加表addtable,是不是空,是空就退出程序,否則程序就向下運行,程序運行到$trueTable2 = str_replace("dede_",$cfg_dbprefix,$addtable);這一句,意思就是用用戶填寫的前綴即$cfg_dbprefix($cfg_dbprefix是用來收集用戶填寫的前綴)替換附加表$addtable里面的dede_這個前綴。
程序接著向下運行,走到38行,這一行用來判斷,如果你選的模型是獨立模型,那么,id就變成負數(shù)了,這一行就是用來實現(xiàn)這一功能的。接下來41行就是用來檢查你的頻道id,頻道名稱標識,附加表是不是已經(jīng)存在于數(shù)據(jù)庫,也就是檢查唯一性。
接下來程序,繼續(xù)向下運行,創(chuàng)建附加表,在創(chuàng)建附加表前,先判斷一下是不是在數(shù)據(jù)庫里已經(jīng)存在,若表不存在或刪除了表,就創(chuàng)建附加表,接著判斷一下,這個表是不是獨立模型,若是就創(chuàng)建附加表,否則就創(chuàng)建獨立模型表。到目前程序已經(jīng)運行到第104行。
接下來程序判斷是否為系統(tǒng)模型,如果不是系統(tǒng)模型,就設(shè)置一下字段,接下來用mysql語言insert into 把收集到的數(shù)據(jù)插入到數(shù)據(jù)庫中,程序結(jié)束,模型建好了。以下分析程序過程就是新增模型的建立過程。
我們回到圖1找到第四項“附加表”,在這一行最后,有一個復選框,當我們選中的時候,點擊存在完后,這個mychannel_add.php文件中程序運行到53行,即if(!$istb || $isdel==1)這一句后面的$isdel==1這句,這句的作用就是當我們選中后,這個判斷就起作用了,如果你先中,當數(shù)據(jù)庫中已經(jīng)存在表了,那么,程序就會刪除原來的表再重新建一個表,若在圖1中沒有選中,則$isdel==1不起來用。
第五項“模型性質(zhì)”:這個你選擇的是什么模型,程序會通過變量$issystem來判斷,例如我們分析程序創(chuàng)建附加表時,有一句判斷if($issystem != -1),這句用來判斷你選中的不是獨立模型,接著向下創(chuàng)建附加表。注意:獨立模型和系統(tǒng)模型,自動模型區(qū)別是,獨立模型不使用主表dede_archives,但系統(tǒng)強制創(chuàng)建字段aid,typeid,senddate,title, mid, channel,為什么會這樣強制創(chuàng)建這些字段呢,大家想一下,不管什么表,你發(fā)布一篇內(nèi)容,這篇內(nèi)容必須有標題吧,必須有欄目吧,這個欄目肯定屬于某一模型吧所以程序會強制創(chuàng)建必須要的字段,至于像發(fā)布時間要不要無所謂,對,但是我們往往會需要發(fā)布時間,所以,也在強制創(chuàng)建立的字段。
我們在建立織夢模型時,到底用自動模型還是系統(tǒng)模型,還是獨立模型?這個具體問題,具體分析,系統(tǒng)模型建立了就不能刪除了,是固定死的,而自己模型可以刪除,這二個的話我建立用自動模型,對于獨立模型,如果你站很小直內(nèi)容不多的話,獨立的可以選擇因為,其它二個模型要分表有一些不必要的操作,小站用不了白白浪費,但是如果大站,建議一定要分表,而且這樣可以減少服務(wù)器負擔??傊话憔W(wǎng)站直接用織夢默認的自動模型,對于其它地方的東西如果沒有原則問題,那么直接用織夢默認的就行。
剩下的都是與會員有關(guān)的選項,這些選擇今天不作分析,這些會在分析會員模塊的時候詳細分析或者在作織夢二次開發(fā)的時候,詳細分析。
總結(jié):對于以上分析,您需要最基本的html和php程序知識。這個教程用到的表有:主表dede_archives,模型表dede_channeltype;用到的文件有:mychannel_add.php,mychannel_add.htm,還用到一些數(shù)據(jù)庫知識,大家可以細細的研究一下這二個文件,特別是他們的對應(yīng)關(guān)系,以及通過模板文件收集到的數(shù)據(jù)是如何插入到數(shù)據(jù)庫里面的等。多分析一些你會發(fā)現(xiàn)不知不覺進步神速。