dede,phpcms等内容模型的概念挺不錯的,可以自定義表的字段,可以滿足各種網站要顯示内容的需求。
比如我有一個文章表,基本字段都有,但是我還需要一個qq,如果去更改表,還得更改背景添加文章時候的表單,非常麻煩,是以就想了想,結合TP的架構,做了一個内容模型的例子,現在分享出來給大家。
這個例子也可以結合下載下傳功能,或者視訊站等功能,把自己做的cms打造成一個全面的cms。
流程如下:
1.必須有一個模型表,去儲存已經定義的模型,例子的sql語句如下
1
2
3
4
5
6
7
8
9
10
<code>DROP TABLE IF EXISTS `think_category`;</code>
<code>CREATE TABLE `think_category` (</code>
<code> </code><code>`id` int(3) NOT NULL AUTO_INCREMENT,</code>
<code> </code><code>`name` varchar(20) DEFAULT NULL,</code>
<code> </code><code>`addtable` varchar(20) DEFAULT NULL,</code>
<code> </code><code>`type` tinyint(1) DEFAULT </code><code>'2'</code><code>,</code>
<code> </code><code>`fields` text,</code>
<code> </code><code>`status` tinyint(1) DEFAULT </code><code>'1'</code><code>,</code>
<code> </code><code>PRIMARY KEY (`id`)</code>
<code>) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;</code>
這個表,name是代表内容模型的名稱,addtable是附加表,指明模型所需要依賴的表,type是模型的類型,1是系統模型,防止背景管理者不小心删除,2.是自由模型,可直接删除。fields是儲存關于模型的字段等詳細資訊。
現在先寫好前台樣式。
<a href="http://s3.51cto.com/wyfs02/M00/12/C1/wKiom1MNqHjyw6nAAADFfS8Bals598.jpg" target="_blank"></a>
在填寫模型以後則可以儲存到模型表category
至于插入資料庫的php代碼我就不寫了。太簡單了
2.在建立好内容模型以後,要做的就是編輯模型的字段,并且生成相應的表。
<a href="http://s3.51cto.com/wyfs02/M02/12/C1/wKiom1MNqQCi2UGlAAF1l4q10og773.jpg" target="_blank"></a>
添加了兩個模型軟體和圖檔集,然後下一步的操作是字段管理(包括建立字段,編輯字段,删除字段,以及生成模型)
<a href="http://s3.51cto.com/wyfs02/M02/12/C1/wKiom1MNqWmhJ6m3AAEsqr9Ob3c940.jpg" target="_blank"></a>
這是字段管理界面,先建立一個字段,假如我想建立一個qq的字段。 添加字段
<a href="http://s3.51cto.com/wyfs02/M02/12/C1/wKioL1MNqYXxB19XAAFa1sfUfwI163.jpg" target="_blank"></a>
表單提示字段是在背景添加文章裡面所顯示的字段,其中都有相應的說明,重要的幾個就是資料類型是在背景添加文章裡顯示不同的表單元素
在修改了相應的資料類型以後,背景裡添加文章等也會随之改變。假如我添加的字段是性别,那麼 用到的就是radio單選的表單。
點選儲存以後代碼
11
12
13
14
15
16
17
18
<code>function</code> <code>saveField(){</code>
<code> </code><code>$model</code><code>=M(</code><code>'Category'</code><code>);</code>
<code> </code><code>$map</code><code>[</code><code>'id'</code><code>]=</code><code>$_REQUEST</code><code>[</code><code>'id'</code><code>];</code>
<code> </code><code>$fields</code><code>=getField(</code><code>'Category'</code><code>, </code><code>$map</code><code>, </code><code>'fields'</code><code>);</code>
<code> </code><code>if</code> <code>(!</code><code>empty</code><code>(</code><code>$fields</code><code>)){</code>
<code> </code><code>$fields</code><code>=unserialize(</code><code>$fields</code><code>);</code>
<code> </code><code>}</code>
<code> </code><code>$fields</code><code>[]=</code><code>$_POST</code><code>;</code>
<code> </code><code>$strField</code><code>=serialize(</code><code>$fields</code><code>);</code>
<code> </code><code>$data</code><code>[</code><code>'fields'</code><code>]=</code><code>$strField</code><code>;</code>
<code> </code><code>if</code> <code>(</code><code>$model</code><code>->where(</code><code>$map</code><code>)->save(</code><code>$data</code><code>)){</code>
<code> </code><code>$ajax</code><code>[</code><code>'data'</code><code>]=</code><code>'儲存字段成功'</code><code>;</code>
<code> </code><code>$ajax</code><code>[</code><code>'url'</code><code>]=__URL__.</code><code>'/setField/id/'</code><code>.</code><code>$_REQUEST</code><code>[</code><code>'id'</code><code>];</code>
<code> </code><code>}</code><code>else</code><code>{</code>
<code> </code><code>$ajax</code><code>[</code><code>'data'</code><code>]=</code><code>'儲存字段失敗,請聯系管理者'</code><code>;</code>
<code> </code><code>die</code><code>(json_encode(</code><code>$ajax</code><code>));</code>
<code> </code><code>}</code>
這段代碼意思很簡單,就是把上面添加字段的表單儲存到相應模型的fields字段裡,友善以後調用處理,$fields=getField('Category', $map, 'fields'); 這個是擷取到此模型裡的fields字段裡的資料,因為字段不止一個,是以每次添加,都會更新fields裡的資料,serialize這個函數真的非常好用,可以把數組或者對象轉變成字元串儲存在資料庫中。
字段清單頁面的代碼
<code>function</code> <code>setField(){</code>
<code> </code><code>$fieldList</code><code>=unserialize(</code><code>$fields</code><code>);</code>
<code> </code><code>$this</code><code>->assign(</code><code>'fieldsList'</code><code>,</code><code>$fieldList</code><code>);</code>
<code> </code><code>$this</code><code>->display();</code>
擷取到指定模型的fields字段的資訊,然後unserialize把字元串再轉換為數組,顯示在頁面中
編輯字段代碼:
<code>function</code> <code>editField(){</code>
<code> </code><code>$fields</code><code>=unserialize(</code><code>$fields</code><code>);</code>
<code> </code><code>$field</code><code>=</code><code>$_REQUEST</code><code>[</code><code>'field'</code><code>];</code>
<code> </code><code>foreach</code> <code>(</code><code>$fields</code> <code>as</code> <code>$k</code><code>=></code><code>$v</code><code>){</code>
<code> </code><code>if</code> <code>(</code><code>$v</code><code>[</code><code>'field_name'</code><code>]==</code><code>$field</code><code>){</code>
<code> </code><code>$fields</code><code>=</code><code>$v</code><code>;</code>
<code> </code><code>}</code>
<code> </code><code>$this</code><code>->assign(</code><code>'fields'</code><code>,</code><code>$fields</code><code>);</code>
更新字段的代碼:
19
20
21
<code>function</code> <code>updateField(){</code>
<code> </code><code>$field</code><code>=</code><code>$_REQUEST</code><code>[</code><code>'old_field'</code><code>];</code>
<code> </code><code>$fields</code><code>[</code><code>$k</code><code>]=</code><code>$_POST</code><code>;</code>
<code> </code>
<code> </code><code>$data</code><code>[</code><code>'fields'</code><code>]=serialize(</code><code>$fields</code><code>);</code>
<code> </code><code>$ajax</code><code>[</code><code>'data'</code><code>]=</code><code>'編輯字段成功'</code><code>;</code>
<code> </code><code>$ajax</code><code>[</code><code>'data'</code><code>]=</code><code>'編輯失敗,請聯系管理者'</code><code>;</code>
删除字段的代碼:
<code>function</code> <code>deleteField(){</code>
<code> </code><code>if</code> <code>(</code><code>$v</code><code>[</code><code>'field_name'</code><code>]==</code><code>$_REQUEST</code><code>[</code><code>'field'</code><code>]){</code>
<code> </code><code>unset(</code><code>$fields</code><code>[</code><code>$k</code><code>]);</code>
<code> </code><code>$ajax</code><code>[</code><code>'data'</code><code>]=</code><code>'删除字段成功'</code><code>;</code>
<code> </code><code>$ajax</code><code>[</code><code>'data'</code><code>]=</code><code>'删除字段失敗,請聯系管理者'</code><code>;</code>
<code> </code>
完成以上以後,要做的就是生成最後所要使用的表。
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<code> </code><code>function</code> <code>createCategory(){</code>
<code> </code><code>//擷取模型表名以及字段</code>
<code> </code><code>$tableName</code><code>=getField(</code><code>'Category'</code><code>, </code><code>$map</code><code>, </code><code>'addtable'</code><code>);</code>
<code> </code><code>$tableName</code><code>=C(</code><code>'DB_PREFIX'</code><code>).</code><code>$tableName</code><code>;</code>
<code> </code><code>//如果表存在則删除</code>
<code> </code><code>if</code><code>(M()->query(</code><code>"show create table "</code><code>.</code><code>$tableName</code><code>)){</code>
<code> </code><code>M()->query(</code><code>"drop table "</code><code>.</code><code>$tableName</code><code>);</code>
<code> </code><code>$createSql</code><code>=</code><code>"CREATE TABLE `"</code><code>.</code><code>$tableName</code><code>."` (</code>
<code> </code><code>`id` int(7) unsigned zerofill NOT NULL AUTO_INCREMENT,</code>
<code> </code><code>`title` varchar(100) DEFAULT NULL,</code>
<code> </code><code>`content` text,</code>
<code> </code><code>`write` varchar(20) DEFAULT NULL,</code>
<code> </code><code>`sort` int(7) DEFAULT NULL,</code>
<code> </code><code>`view` int(7) DEFAULT NULL,</code>
<code> </code><code>`pics` varchar(200) DEFAULT NULL,</code>
<code> </code><code>`create_time` int(20) DEFAULT NULL,</code>
<code> </code><code>`flag` varchar(50) DEFAULT NULL,</code>
<code> </code><code>`info` text,</code>
<code> </code><code>`keywords` varchar(300) DEFAULT NULL,</code>
<code> </code><code>`nav_id` int(7) DEFAULT NULL,</code>
<code> </code><code>`source` varchar(50) DEFAULT NULL,";</code>
<code> </code><code>$sql</code><code>=</code><code>$this</code><code>->createSql(</code><code>$fields</code><code>);</code>
<code> </code><code>$createSql</code><code>.=</code><code>$sql</code><code>;</code>
<code> </code><code>$createSql</code><code>.="PRIMARY KEY (`id`)</code>
<code>) ENGINE=InnoDB DEFAULT CHARSET=utf8";</code>
<code> </code><code>if</code> <code>(M()->query(</code><code>$createSql</code><code>)===false){</code>
<code> </code><code>$ajax</code><code>[</code><code>'data'</code><code>]=</code><code>'建立資料表失敗,請聯系管理者'</code><code>;</code>
<code> </code><code>die</code><code>(json_encode(</code><code>$ajax</code><code>));</code>
<code> </code>
<code> </code><code>$ajax</code><code>[</code><code>'data'</code><code>]=</code><code>'生成模型成功'</code><code>;</code>
<code> </code><code>$ajax</code><code>[</code><code>'url'</code><code>]=__URL__.</code><code>'/setField/id/'</code><code>.</code><code>$_REQUEST</code><code>[</code><code>'id'</code><code>];</code>
<code> </code>
<code> </code><code>/*</code>
<code> </code><code>* 建立資料庫表的sql語句</code>
<code> </code><code>*/</code>
<code> </code><code>function</code> <code>createSql(</code><code>$fields</code><code>){</code>
<code> </code><code>foreach</code> <code>(</code><code>$fields</code> <code>as</code> <code>$v</code><code>){</code>
<code> </code><code>if</code> <code>(!</code><code>strpos</code><code>(</code><code>$v</code><code>[</code><code>'default'</code><code>], </code><code>','</code><code>)&&</code><code>$v</code><code>[</code><code>'default'</code><code>]!=</code><code>''</code><code>){</code>
<code> </code><code>$sql</code><code>.=</code><code>"`"</code><code>.</code><code>$v</code><code>[</code><code>'field_name'</code><code>].</code><code>"` "</code><code>.</code><code>$v</code><code>[</code><code>'type'</code><code>].</code><code>"("</code><code>.</code><code>$v</code><code>[</code><code>'length'</code><code>].</code><code>") default "</code><code>.</code><code>$v</code><code>[</code><code>'default'</code><code>].</code><code>','</code><code>;</code>
<code> </code><code>}</code><code>else</code><code>{</code>
<code> </code><code>$sql</code><code>.=</code><code>"`"</code><code>.</code><code>$v</code><code>[</code><code>'field_name'</code><code>].</code><code>"` "</code><code>.</code><code>$v</code><code>[</code><code>'type'</code><code>].</code><code>"("</code><code>.</code><code>$v</code><code>[</code><code>'length'</code><code>].</code><code>"),"</code><code>;</code>
<code> </code><code>return</code> <code>$sql</code><code>;</code>
邏輯方式就是先擷取到指定模型裡fiels裡的資料,然後拼接成sql語句,再結合包含基礎字段的sql語句,就可以生成一個自己需要的文章表。
接下來的操作也非常簡單,還是根據模型表裡的fields字段裡擷取到的資訊,生成對應的表單html代碼,然後顯示出來即可。
有時候,邏輯真的比技術更加重要。技術隻是基礎,邏輯思維才是技術提升的技巧。
本文轉自 3147972 51CTO部落格,原文連結:http://blog.51cto.com/a3147972/1363863,如需轉載請自行聯系原作者