天天看點

php内容模型概念,友善建立各種類型表

   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>-&gt;where(</code><code>$map</code><code>)-&gt;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>-&gt;assign(</code><code>'fieldsList'</code><code>,</code><code>$fieldList</code><code>);</code>

<code>        </code><code>$this</code><code>-&gt;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>=&gt;</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>-&gt;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()-&gt;query(</code><code>"show create table "</code><code>.</code><code>$tableName</code><code>)){</code>

<code>            </code><code>M()-&gt;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>-&gt;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()-&gt;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>)&amp;&amp;</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,如需轉載請自行聯系原作者