溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

php內(nèi)容模型概念,方便新建各種類型表

發(fā)布時間:2020-07-03 07:42:05 來源:網(wǎng)絡(luò) 閱讀:1733 作者:AndyMac 欄目:web開發(fā)

   dede,phpcms等內(nèi)容模型的概念挺不錯的,可以自定義表的字段,可以滿足各種網(wǎng)站要顯示內(nèi)容的需求。

   比如我有一個文章表,基本字段都有,但是我還需要一個qq,如果去更改表,還得更改后臺添加文章時候的表單,非常麻煩,所以就想了想,結(jié)合TP的框架,做了一個內(nèi)容模型的例子,現(xiàn)在分享出來給大家。

   這個例子也可以結(jié)合下載功能,或者視頻站等功能,把自己做的cms打造成一個全面的cms。

   流程如下:

   1.必須有一個模型表,去保存已經(jīng)定義的模型,例子的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是代表內(nèi)容模型的名稱,addtable是附加表,指明模型所需要依賴的表,type是模型的類型,1是系統(tǒng)模型,防止后臺管理員不小心刪除,2.是自由模型,可直接刪除。fields是保存關(guān)于模型的字段等詳細(xì)信息。

   現(xiàn)在先寫好前臺樣式。

php內(nèi)容模型概念,方便新建各種類型表

在填寫模型以后則可以保存到模型表category

至于插入數(shù)據(jù)庫的php代碼我就不寫了。太簡單了


   2.在新建好內(nèi)容模型以后,要做的就是編輯模型的字段,并且生成相應(yīng)的表。

php內(nèi)容模型概念,方便新建各種類型表

   添加了兩個模型軟件和圖片集,然后下一步的操作是字段管理(包括新建字段,編輯字段,刪除字段,以及生成模型)

php內(nèi)容模型概念,方便新建各種類型表

這是字段管理界面,先新建一個字段,假如我想新建一個qq的字段。 添加字段

php內(nèi)容模型概念,方便新建各種類型表

表單提示字段是在后臺添加文章里面所顯示的字段,其中都有相應(yīng)的說明,重要的幾個就是數(shù)據(jù)類型是在后臺添加文章里顯示不同的表單元素

php內(nèi)容模型概念,方便新建各種類型表

在修改了相應(yīng)的數(shù)據(jù)類型以后,后臺里添加文章等也會隨之改變。假如我添加的字段是性別,那么 用到的就是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']='保存字段失敗,請聯(lián)系管理員';
        }
        die(json_encode($ajax));
    }


      這段代碼意思很簡單,就是把上面添加字段的表單保存到相應(yīng)模型的fields字段里,方便以后調(diào)用處理,$fields=getField('Category', $map, 'fields'); 這個是獲取到此模型里的fields字段里的數(shù)據(jù),因為字段不止一個,所以每次添加,都會更新fields里的數(shù)據(jù),serialize這個函數(shù)真的非常好用,可以把數(shù)組或者對象轉(zhuǎn)變成字符串保存在數(shù)據(jù)庫中。


     字段列表頁面的代碼

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把字符串再轉(zhuǎn)換為數(shù)組,顯示在頁面中

   編輯字段代碼:

   

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']='編輯失敗,請聯(lián)系管理員';
        }
        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']='刪除字段失敗,請聯(lián)系管理員';
        }
                                                                                        
        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']='創(chuàng)建數(shù)據(jù)表失敗,請聯(lián)系管理員';
            die(json_encode($ajax));
        }
                                                                          
        $ajax['data']='生成模型成功';
        $ajax['url']=__URL__.'/setField/id/'.$_REQUEST['id'];
        die(json_encode($ajax));
    }
                                                                      
    /*
     * 創(chuàng)建數(shù)據(jù)庫表的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里的數(shù)據(jù),然后拼接成sql語句,再結(jié)合包含基礎(chǔ)字段的sql語句,就可以生成一個自己需要的文章表。

     接下來的操作也非常簡單,還是根據(jù)模型表里的fields字段里獲取到的信息,生成對應(yīng)的表單html代碼,然后顯示出來即可。

    有時候,邏輯真的比技術(shù)更加重要。技術(shù)只是基礎(chǔ),邏輯思維才是技術(shù)提升的技巧。


php內(nèi)容模型概念,方便新建各種類型表

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI