欢迎访问艾立兹站 Aliz- 专注建站教程与技术分享
您当前的位置:首页 > 建站教程 > 帝国 CMS 教程

帝国cms扩展变量新增选择多种字段类型修改方法

时间:2026-06-29 19:11:07  来源:阿里站  作者:SKY  阅读:

一、开发需求


帝国 CMS 扩展变量常用来制作全站配置:功能开关、分类 ID、联系方式、广告参数。 原生系统仅有两种输入框:单行文本、多行文本。 弊端非常明显:
  1. 无法设置可选项目,管理员随意填写内容容易造成参数错误;
  2. 没有下拉菜单与复选框,做后台配置项不够规范;
  3. 不能做多选配置,多个 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条评论
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
公众号二维码

扫码关注公众号
获取全套技术教程