dede,phpcms等內容模型的概念挺不錯的,能夠自定義表的字段,能夠知足各類網站要顯示內容的需求。php
好比我有一個文章表,基本字段都有,可是我還須要一個qq,若是去更改表,還得更改後臺添加文章時候的表單,很是麻煩,因此就想了想,結合TP的框架,作了一個內容模型的例子,如今分享出來給你們。html
這個例子也能夠結合下載功能,或者視頻站等功能,把本身作的cms打形成一個全面的cms。ajax
流程以下:sql
1.必須有一個模型表,去保存已經定義的模型,例子的sql語句以下數據庫
DROP TABLE IF EXISTS `think_category`; CREATE TABLE `think_category` ( `id` int(3) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, `addtable` varchar(20) DEFAULT NULL, `type` tinyint(1) DEFAULT '2', `fields` text, `status` tinyint(1) DEFAULT '1', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
這個表,name是表明內容模型的名稱,addtable是附加表,指明模型所須要依賴的表,type是模型的類型,1是系統模型,防止後臺管理員不當心刪除,2.是自由模型,可直接刪除。fields是保存關於模型的字段等詳細信息。json
如今先寫好前臺樣式。數組
在填寫模型之後則能夠保存到模型表category框架
至於插入數據庫的php代碼我就不寫了。太簡單了ide
2.在新建好內容模型之後,要作的就是編輯模型的字段,而且生成相應的表。函數
添加了兩個模型軟件和圖片集,而後下一步的操做是字段管理(包括新建字段,編輯字段,刪除字段,以及生成模型)
這是字段管理界面,先新建一個字段,假如我想新建一個qq的字段。 添加字段
表單提示字段是在後臺添加文章裏面所顯示的字段,其中都有相應的說明,重要的幾個就是數據類型是在後臺添加文章裏顯示不一樣的表單元素
在修改了相應的數據類型之後,後臺裏添加文章等也會隨之改變。假如我添加的字段是性別,那麼 用到的就是radio單選的表單。
點擊保存之後代碼
function saveField(){ $model=M('Category'); $map['id']=$_REQUEST['id']; $fields=getField('Category', $map, 'fields'); if (!empty($fields)){ $fields=unserialize($fields); } $fields[]=$_POST; $strField=serialize($fields); $data['fields']=$strField; if ($model->where($map)->save($data)){ $ajax['data']='保存字段成功'; $ajax['url']=__URL__.'/setField/id/'.$_REQUEST['id']; }else{ $ajax['data']='保存字段失敗,請聯繫管理員'; } die(json_encode($ajax)); }
這段代碼意思很簡單,就是把上面添加字段的表單保存到相應模型的fields字段裏,方便之後調用處理,$fields=getField('Category', $map, 'fields'); 這個是獲取到此模型裏的fields字段裏的數據,由於字段不止一個,因此每次添加,都會更新fields裏的數據,serialize這個函數真的很是好用,能夠把數組或者對象轉變成字符串保存在數據庫中。
字段列表頁面的代碼
function setField(){ $model=M('Category'); $map['id']=$_REQUEST['id']; $fields=getField('Category', $map, 'fields'); $fieldList=unserialize($fields); $this->assign('fieldsList',$fieldList); $this->display(); }
獲取到指定模型的fields字段的信息,而後unserialize把字符串再轉換爲數組,顯示在頁面中
編輯字段代碼:
function editField(){ $model=M('Category'); $map['id']=$_REQUEST['id']; $fields=getField('Category', $map, 'fields'); $fields=unserialize($fields); $field=$_REQUEST['field']; foreach ($fields as $k=>$v){ if ($v['field_name']==$field){ $fields=$v; } } $this->assign('fields',$fields); $this->display(); }
更新字段的代碼:
function updateField(){ $model=M('Category'); $map['id']=$_REQUEST['id']; $fields=getField('Category', $map, 'fields'); $fields=unserialize($fields); $field=$_REQUEST['old_field']; foreach ($fields as $k=>$v){ if ($v['field_name']==$field){ $fields[$k]=$_POST; } } $data['fields']=serialize($fields); if ($model->where($map)->save($data)){ $ajax['data']='編輯字段成功'; $ajax['url']=__URL__.'/setField/id/'.$_REQUEST['id']; }else{ $ajax['data']='編輯失敗,請聯繫管理員'; } die(json_encode($ajax)); }
刪除字段的代碼:
function deleteField(){ $model=M('Category'); $map['id']=$_REQUEST['id']; $fields=getField('Category', $map, 'fields'); $fields=unserialize($fields); foreach ($fields as $k=>$v){ if ($v['field_name']==$_REQUEST['field']){ unset($fields[$k]); } } $data['fields']=serialize($fields); if ($model->where($map)->save($data)){ $ajax['data']='刪除字段成功'; $ajax['url']=__URL__.'/setField/id/'.$_REQUEST['id']; }else{ $ajax['data']='刪除字段失敗,請聯繫管理員'; } die(json_encode($ajax)); }
完成以上之後,要作的就是生成最後所要使用的表。
function createCategory(){ //獲取模型表名以及字段 $model=M('Category'); $map['id']=$_REQUEST['id']; $fields=getField('Category', $map, 'fields'); $fields=unserialize($fields); $tableName=getField('Category', $map, 'addtable'); $tableName=C('DB_PREFIX').$tableName; //若是表存在則刪除 if(M()->query("show create table ".$tableName)){ M()->query("drop table ".$tableName); } $createSql="CREATE TABLE `".$tableName."` ( `id` int(7) unsigned zerofill NOT NULL AUTO_INCREMENT, `title` varchar(100) DEFAULT NULL, `content` text, `write` varchar(20) DEFAULT NULL, `sort` int(7) DEFAULT NULL, `view` int(7) DEFAULT NULL, `pics` varchar(200) DEFAULT NULL, `create_time` int(20) DEFAULT NULL, `flag` varchar(50) DEFAULT NULL, `info` text, `keywords` varchar(300) DEFAULT NULL, `nav_id` int(7) DEFAULT NULL, `source` varchar(50) DEFAULT NULL,"; $sql=$this->createSql($fields); $createSql.=$sql; $createSql.="PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8"; if (M()->query($createSql)===false){ $ajax['data']='建立數據表失敗,請聯繫管理員'; die(json_encode($ajax)); } $ajax['data']='生成模型成功'; $ajax['url']=__URL__.'/setField/id/'.$_REQUEST['id']; die(json_encode($ajax)); } /* * 建立數據庫表的sql語句 */ function createSql($fields){ foreach ($fields as $v){ if (!strpos($v['default'], ',')&&$v['default']!=''){ $sql.="`".$v['field_name']."` ".$v['type']."(".$v['length'].") default ".$v['default'].','; }else{ $sql.="`".$v['field_name']."` ".$v['type']."(".$v['length']."),"; } } return $sql; }
邏輯方式就是先獲取到指定模型裏fiels裏的數據,而後拼接成sql語句,再結合包含基礎字段的sql語句,就能夠生成一個本身須要的文章表。
接下來的操做也很是簡單,仍是根據模型表裏的fields字段裏獲取到的信息,生成對應的表單html代碼,而後顯示出來便可。
有時候,邏輯真的比技術更加劇要。技術只是基礎,邏輯思惟纔是技術提高的技巧。