php内容模型概念,方便新建各种类型表

简介:

   dede,phpcms等内容模型的概念挺不错的,可以自定义表的字段,可以满足各种网站要显示内容的需求。

   比如我有一个文章表,基本字段都有,但是我还需要一个qq,如果去更改表,还得更改后台添加文章时候的表单,非常麻烦,所以就想了想,结合TP的框架,做了一个内容模型的例子,现在分享出来给大家。

   这个例子也可以结合下载功能,或者视频站等功能,把自己做的cms打造成一个全面的cms。

   流程如下:

   1.必须有一个模型表,去保存已经定义的模型,例子的sql语句如下

1
2
3
4
5
6
7
8
9
10
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是保存关于模型的字段等详细信息。

   现在先写好前台样式。

wKiom1MNqHjyw6nAAADFfS8Bals598.jpg

在填写模型以后则可以保存到模型表category

至于插入数据库的php代码我就不写了。太简单了


   2.在新建好内容模型以后,要做的就是编辑模型的字段,并且生成相应的表。

wKiom1MNqQCi2UGlAAF1l4q10og773.jpg

   添加了两个模型软件和图片集,然后下一步的操作是字段管理(包括新建字段,编辑字段,删除字段,以及生成模型)

wKiom1MNqWmhJ6m3AAEsqr9Ob3c940.jpg

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

wKioL1MNqYXxB19XAAFa1sfUfwI163.jpg

表单提示字段是在后台添加文章里面所显示的字段,其中都有相应的说明,重要的几个就是数据类型是在后台添加文章里显示不同的表单元素

wKioL1MNqeGgEADxAACc0T0ndJE890.jpg

在修改了相应的数据类型以后,后台里添加文章等也会随之改变。假如我添加的字段是性别,那么 用到的就是radio单选的表单。

点击保存以后代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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这个函数真的非常好用,可以把数组或者对象转变成字符串保存在数据库中。


     字段列表页面的代码

1
2
3
4
5
6
7
8
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把字符串再转换为数组,显示在页面中

   编辑字段代码:

   

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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();
     }

   更新字段的代码:

   

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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 ));
     }


 删除字段的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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 ));
     }

完成以上以后,要做的就是生成最后所要使用的表。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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
     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代码,然后显示出来即可。

    有时候,逻辑真的比技术更加重要。技术只是基础,逻辑思维才是技术提升的技巧。










本文转自 3147972 51CTO博客,原文链接:http://blog.51cto.com/a3147972/1363863,如需转载请自行联系原作者
目录
相关文章
|
7月前
|
前端开发 网络协议 测试技术
探索PHP的异步编程模型:从React到Swoole
在Web开发领域,PHP一直以简单易用著称。然而,随着互联网应用对性能和并发处理能力的不断追求,传统的同步阻塞式编程模型已逐渐暴露出局限性。本文将深入探讨PHP中的异步编程模型,从早期的React到现代的Swoole,分析其原理、优势及应用场景,并通过实例展示如何利用这些工具提升PHP应用的性能和响应速度。文章旨在为PHP开发者提供一种全新的视角,帮助他们在构建高性能Web应用时做出更合理的技术选择。
91 0
|
4月前
|
设计模式 PHP 开发者
PHP中的面向对象编程:核心概念与实践
本文旨在深入探讨PHP中面向对象编程的核心概念及其在实际开发中的应用。通过详细阐述类、对象、继承、多态等OOP基本原则,并结合实际案例,帮助读者理解如何在PHP项目中运用这些原则来提高代码的重用性、可维护性和扩展性。此外,文章还将探讨面向对象设计模式在PHP中的应用,以及如何避免常见的OOP陷阱。
|
5月前
|
机器学习/深度学习 PHP 开发者
探索PHP中的面向对象编程构建你的首个机器学习模型:以Python和scikit-learn为例
【8月更文挑战第30天】在PHP的世界中,面向对象编程(OOP)是一块基石,它让代码更加模块化、易于管理和维护。本文将深入探讨PHP中面向对象的魔法,从类和对象的定义开始,到继承、多态性、封装等核心概念,再到实战中如何应用这些理念来构建更健壮的应用。我们将通过示例代码,一起见证PHP中OOP的魔力,并理解其背后的设计哲学。
|
4月前
|
存储 PHP 开发者
PHP中的面向对象编程:掌握OOP的核心概念
在PHP的海洋中,面向对象编程(OOP)是一艘强大的船,它让开发者能够以更加组织和高效的方式构建应用程序。本文将带你领略OOP的魅力,从类与对象的创建到继承、封装、多态等高级特性的应用,我们将一步步深入探索PHP的OOP世界。无论你是初学者还是有一定经验的开发者,这篇文章都将成为你技能提升的助推器。
|
7月前
|
安全 前端开发 测试技术
安全开发-PHP应用&模版引用&Smarty渲染&MVC模型&数据联动&RCE安全&TP框架&路由访问&对象操作&内置过滤绕过&核心漏洞
安全开发-PHP应用&模版引用&Smarty渲染&MVC模型&数据联动&RCE安全&TP框架&路由访问&对象操作&内置过滤绕过&核心漏洞
PHP的高端技术和概念
PHP的高端技术和概念
|
监控 安全 应用服务中间件
PHP实现IO复用模型(multiplexing)
在 I/O 多路复用模型中,会用到 select 或 poll 函数, 这两个函数也会使进程阻塞,但是和阻塞 I/O 所不同的是,这两个函数可以同时阻塞多个 I/O 操作,而且可以同时对多个读操作、多个写操作的 I/O 函数进行检测,直到有数据可读或可写时,才真正调用 I/O 操作函数。
138 0
PHP实现IO复用模型(multiplexing)
|
Java PHP
PHP简单实现Reactor模型
在BIO线程模型中,为了解决同步阻塞的问题,采用了多线程的方式处理并发,即经典的connection per thread,每一个连接用一个线程处理。虽然在单个线程内仍然是阻塞的,但在整体上看是可以同时处理多个连接请求的
PHP简单实现Reactor模型
|
缓存 PHP
PHP实现IO非阻塞模型(no-blocking)
非阻塞IO发出read请求后发现数据没准备好,会继续往下执行,此时应用程序会不断轮询polling内核询问数据是否准备好,当数据没有准备好时,内核立即返回EWOULDBLOCK错误。直到数据被拷贝到应用程序缓冲区,read请求才获取到结果。并且你要注意!这里最后一次 read 调用获取数据的过程,是一个同步的过程,是需要等待的过程。这里的同步指的是**内核态的数据拷贝到用户程序的缓存区这个过程**。
161 0
php-获取txt文件内容并转换成数组
php-获取txt文件内容并转换成数组
133 0
php-获取txt文件内容并转换成数组