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是保存关于模型的字段等详细信息。
现在先写好前台样式。
在填写模型以后则可以保存到模型表category
至于插入数据库的php代码我就不写了。太简单了
2.在新建好内容模型以后,要做的就是编辑模型的字段,并且生成相应的表。
添加了两个模型软件和图片集,然后下一步的操作是字段管理(包括新建字段,编辑字段,删除字段,以及生成模型)
这是字段管理界面,先新建一个字段,假如我想新建一个qq的字段。 添加字段
表单提示字段是在后台添加文章里面所显示的字段,其中都有相应的说明,重要的几个就是数据类型是在后台添加文章里显示不同的表单元素
在修改了相应的数据类型以后,后台里添加文章等也会随之改变。假如我添加的字段是性别,那么 用到的就是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代码,然后显示出来即可。
有时候,逻辑真的比技术更加重要。技术只是基础,逻辑思维才是技术提升的技巧。