帝国cms扩展变量新增选择多种字段类型修改方法
时间:2026-06-29 19:11:07 来源:阿里站 作者:SKY 阅读:
一、开发需求
帝国 CMS 扩展变量常用来制作全站配置:功能开关、分类 ID、联系方式、广告参数。 原生系统仅有两种输入框:单行文本、多行文本。 弊端非常明显:
- 无法设置可选项目,管理员随意填写内容容易造成参数错误;
- 没有下拉菜单与复选框,做后台配置项不够规范;
- 不能做多选配置,多个 ID 只能手动用逗号填写。
本次二次开发目标: 给扩展变量新增两种字段类型:下拉单选框、复选多选框,支持自定义选项内容,勾选的值自动用英文逗号拼接保存,不用改动主程序架构。
二、提前准备:给数据表新增两个字段
打开 phpmyadmin,执行下面 SQL 语句,给 phome_enewsvar 数据表追加字段,用来存储字段类型和选项列表。
sql
ALTER TABLE `phome_enewsvar` ADD `vartype` VARCHAR(20) NOT NULL DEFAULT 'text';
ALTER TABLE `phome_enewsvar` ADD `varoption` TEXT NOT NULL;
执行完成后刷新数据表,确认字段创建成功。
三、修改第一处:新增扩展变量页面 AddVar.php
文件路径:/e/admin/AddVar.php
1. 增加字段类型选择下拉 在变量内容输入框上方,插入字段类型选择下拉菜单,同时增加选项填写文本域。 可选类型包含:单行文本、多行文本、下拉单选、复选多选。
2.JS 动态切换表单控件 通过 JS 监听字段类型切换,自动隐藏和显示对应的输入框。 文本类型展示单行输入框; 多行文本展示文本域; 下拉与多选类型自动调出选项填写框。
选项填写规则:一行一条,格式为:值 | 显示文字 示例: 1 | 启用 0 | 关闭
3. 后端接收数据并写入数据库 原生 SQL 语句只保存变量名称、标题、内容。 我们需要在 insert 语句内追加 vartype、varoption 两个字段,把字段类型和选项内容一起入库。
4. 处理复选框数据逻辑 复选框提交时是数组格式,后端自动把数组转为逗号分隔字符串,存入 varvalue 字段,避免直接入库出现 Array 报错。
四、修改第二处:编辑扩展变量页面 EditVar.php
文件路径:/e/admin/EditVar.php
1. 同步复制下拉选择、选项文本域与 JS 切换代码,保持和新增页面一致。 2. 读取数据库中已经保存的字段类型与选项,实现表单数据自动回填。 3. 自动渲染下拉选项和复选框项目,并且自动勾选已经选中的项。 4. 更新 SQL 语句,在 update 语句中同步更新 vartype 与 varoption 字段。
关键处理: 复选框表单提交为数组,必须用 implode 函数拼接成字符串,否则保存数据会直接显示 Array。
五、完整代码分段说明(粘贴到文章代码块,不会打乱页面布局)
1. 远程图片下载公共函数(写入 connect.php)
php
运行
function getRemoteImage($remote_url,$save_path){
$dir=dirname($save_path);
if(!file_exists($dir)) mkdir($dir,0777,true);
$ch=curl_init($remote_url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
$data=curl_exec($ch);
curl_close($ch);
if(!$data) return false;
file_put_contents($save_path,$data);
return true;
}
2. 前端切换 JS 脚本
把 JS 单独放进代码区块,不要散落在正文段落中,防止编辑器解析 HTML 标签。
javascript
运行
function ChangeVarType(){
var type = document.getElementById('vartype').value;
document.getElementById('text_tr').style.display='none';
document.getElementById('textarea_tr').style.display='none';
document.getElementById('select_tr').style.display='none';
document.getElementById('checkbox_tr').style.display='none';
document.getElementById('varoption_tr').style.display='none';
if(type=='text'){
document.getElementById('text_tr').style.display='';
}else if(type=='textarea'){
document.getElementById('textarea_tr').style.display='';
}else if(type=='select'){
document.getElementById('varoption_tr').style.display='';
document.getElementById('select_tr').style.display='';
}else if(type=='checkbox'){
document.getElementById('varoption_tr').style.display='';
document.getElementById('checkbox_tr').style.display='';
}
}
3. 保存时处理复选数组代码
php
运行
if(is_array($_POST['varvalue'])){
$varvalue=implode(',',$_POST['varvalue']);
}else{
$varvalue=hRepPostStr($_POST['varvalue'],1);
}
六、前台模板调用方法
1. 单行文本、下拉单选变量,直接输出即可
plaintext
<?=$public_r['add_变量名']?>
2. 复选多选变量(逗号分隔字符串,循环遍历)
php
运行
<?php
$arr=explode(',',$public_r['add_变量名']);
foreach($arr as $v){
echo $v;
}
?>
七、缓存更新步骤
修改扩展变量保存之后,一定要进入后台:系统→数据更新→更新全站缓存,重建 public.php 缓存文件,否则模板读取不到最新变量值。
八、常见错位与报错解决方案
1. 保存后内容变成 Array 原因:复选框没有将数组转为字符串,检查 EditVar.php 的数据处理代码。 2. 切换类型表单无变化 解决方案:JS 代码单独放在代码框,不要嵌入正文,清除浏览器缓存。 3. 网页发布后页面整体错位 核心解决办法: 不要直接粘贴<table> <tr>表格 HTML 到正文! 所有表单 HTML 代码全部放入【代码块】,正文只用文字描述步骤,不直接插入 HTML 表格标签。富文本编辑器一旦解析 table 标签,就会和网站全局 CSS 冲突,造成整页排版错乱。
4. 字段保存为空 核对 SQL 语句是否包含 vartype、varoption 两个字段,确认数据表字段已经建立完成。
九、后续拓展
按照这套开发逻辑,还可以继续给扩展变量增加日期选择、图片上传、富文本编辑器等字段,只需要新增类型选项,再增加对应的表单控件即可,架构不用改动。
本文来源:www.aliz.cn 阿里站,转载必须保留原文链接。
本文配套模板、静态源码可前往艾立兹素材库alisucai.com下载
发表评论
共有0条评论