official_website/app/form/controller/FormList.php

570 lines
24 KiB
PHP
Raw Normal View History

2024-12-02 13:57:08 +08:00
<?php
/**
* @Descripttion : FOXCMS 是一款高效的 PHP 多端跨平台内容管理系统
* @Author : FoxCMS Team
* @Date : 2023/6/26 19:17
* @version : V1.08
* @copyright : ©2021-现在 贵州黔狐科技股份有限公司 版权所有
* @LastEditTime : 2023/6/26 19:17
*/
namespace app\form\controller;
use app\admin\util\Field;
use app\admin\util\TableUtil;
use app\common\controller\AdminApplyBase;
use app\common\model\AuthRule;
use app\common\model\FormField;
use app\common\model\FormList as FormListModal;
use think\facade\Cache;
use think\facade\Db;
use think\facade\View;
// 自定义表单
class FormList extends AdminApplyBase
{
public function initialize()
{
parent::initialize();
$action = $this->request->action();
if ($action == "add" || $action == "edit") {
$pmtList = Db::name('plugin_mail_template')->where([['status', '=', 1], ['type', '=', 2]])->select();
if ($action == "add") {
$pmt = [];
if (sizeof($pmtList) > 0) {
$pmt = $pmtList[0];
foreach ($pmtList as $pm) {
if ($pm['is_default'] == 1) {
$pmt = $pm;
break;
}
}
}
View::assign("pmt", $pmt);
}
View::assign("pmtList", $pmtList);
$pmc = Db::name('plugin_mail_config')->find();
$mail_config = 1; //配置
$mail_config_url = url('/email/PluginMailConfig/index') . "?columnId=42&apply_plugin_id=6&id=4";
if (
empty($pmc['smtp_url']) || empty($pmc['smtp_port'])
|| empty($pmc['send_account']) || empty($pmc['auth_code'])
) {
$mail_config = 0;
$mail_config_url = "";
}
View::assign("mail_config_url", $mail_config_url);
View::assign("mail_config", $mail_config);
}
}
public function index()
{
$param = $this->request->param();
if ($this->request->isAjax()) {
$model = new FormListModal();
if (empty($param["currentPage"])) {
$param["currentPage"] = 1;
}
if (empty($param["pageSize"])) {
$param["pageSize"] = 100;
}
$condition = array();
if (array_key_exists('keyword', $param) && !empty($param['keyword'])) {
array_push($condition, ['table_name|name', 'like', '%' . $param['keyword'] . '%']);
}
$list = $model->where($condition)->order('id desc')->paginate(['page' => $param['currentPage'], 'list_rows' => $param['pageSize']]);
foreach ($list as $formItem) {
$formItem['formTotal'] = Db::table($formItem['table_name'])->count();
$formItem['viewCount'] = Db::table($formItem['table_name'])->where("is_view", 1)->count();
}
$this->success("查询成功", "", $list);
}
return view('index');
}
public function deletes()
{
if ($this->request->isPost()) {
$param = $this->request->param();
if (array_key_exists("idList", $param)) {
$idList = json_decode($param['idList']);
if (sizeof($idList) <= 0) {
$this->error("操作失败,请选择对应删除数据");
}
$idStr = implode(",", $idList);
try {
$formLists = FormListModal::whereIn('id', $idStr)->select();
foreach ($formLists as $key => $fromList) {
$id = $fromList["id"];
//删除表
$sql = "DROP TABLE {$fromList['table_name']}";
Db::execute($sql);
//删除字段
FormField::where('form_list_id', $id)->delete();
//删除数据
FormListModal::destroy($id);
}
} catch (\Exception $e) {
$this->error("操作失败");
}
Cache::clear();
$this->success('操作成功');
}
}
}
public function add()
{
$param = $this->request->param();
$columnId = $param['columnId']; //栏目id
$authRule = AuthRule::find($columnId);
$bcidStr = str_replace(",", "_", $authRule->tier);
$breadcrumb = AuthRule::getBreadcrumb($bcidStr);
array_push($breadcrumb, ['id' => '', 'title' => '添加表单', 'name' => DIRECTORY_SEPARATOR . config('adminconfig.admin_path') . '/FormList/add', 'url' => 'javascript:void(0)']);
View::assign("breadcrumb", $breadcrumb);
if ($this->request->isPost()) {
$param = $this->request->param();
if (array_key_exists("columns", $param)) {
$columns = $param["columns"];
foreach ($columns as $k => $column) {
//判断参数
$dfVArr = explode(",", $column['dfvalue']);
$dfVArr2 = array_unique($dfVArr);
if (sizeof($dfVArr) != sizeof($dfVArr2)) {
$this->error("保存失败," . $column['name'] . "的值重复");
}
}
}
//创建表
$tableName = $param['table_name'];
if (empty($tableName)) {
$this->error("数据库表名不能为空");
}
if (strpos($tableName, 'fox_') !== false) {
} else {
$tableName = 'fox_' . $tableName;
}
if (is_exist_table($tableName)) {
$this->error("表名已存在");
}
$newData = array(
'name' => $param['name'],
'table_name' => $tableName,
'commit_type' => $param['commit_type'],
'notice_setting' => $param['notice_setting'],
'verify' => $param['verify']
);
$flm = new FormListModal();
$r = $flm->save($newData);
$fieldList = []; //表栏列表
$tableFieldData = []; //表栏列表数据
if (array_key_exists("columns", $param)) {
$field = new Field();
$columns = $param["columns"];
$formListId = $flm->id;
Db::name("form_field")->where("form_list_id", $formListId)->delete(); //删除当前表多余字段
foreach ($columns as $k => $column) {
$fieldinfos = $field->GetFieldMake($column['dtype'], $column['name'], $column['dfvalue'], $column['title']);
$ntabsql = $fieldinfos[0];
$buideType = $fieldinfos[1];
$maxlength = $fieldinfos[2];
$csql = substr($ntabsql, 0, strlen($ntabsql) - 1);
array_push($fieldList, $csql); //表栏列表
/*保存新增字段的记录*/
$FieldData = array(
'form_list_id' => $formListId,
'dfvalue' => $column['dfvalue'],
'val' => $column['val'],
'maxlength' => $maxlength,
'define' => $buideType,
'dtype' => $column['dtype'],
'is_require' => $column['isRequire'],
'name' => $column['name'],
'remark' => $column['remark'],
'title' => $column['title'],
'sort_order' => $k,
'marke_word' => $column['markeWord']
);
array_push($tableFieldData, $FieldData); //表栏列表
}
}
//额外增加两个字段
array_push($fieldList, "`is_view` tinyint(2) DEFAULT '0' COMMENT '是否查看'");
array_push($fieldList, "`create_time` datetime DEFAULT NULL COMMENT '创建时间'");
$remark = $param['name'];
try {
$e = TableUtil::createTable($tableName, $fieldList, $remark);
if (!$e) {
$flm->delete(); //删除
$this->error("创建表失败");
}
if (sizeof($tableFieldData) > 0) {
//保存表各列的数据
$dr = (new FormField())->saveAll($tableFieldData);
}
Cache::clear();
} catch (\Exception $e) {
$flm->delete(); //删除
$this->error("创建表失败" . $e->getMessage());
}
$this->success("操作成功");
}
//默认表名
$default_table_name = "form_diy" . func_random_num(0, 4);
View::assign("default_table_name", $default_table_name);
return view('add');
}
// 查询表单项
public function findFormFields()
{
$param = $this->request->param();
$id = $param['id'];
$formFieldList = (new FormField())->where("form_list_id", $id)->order(["sort_order" => "asc", "create_time" => "asc"])->select();
$uf = new \app\common\model\UploadFiles();
foreach ($formFieldList as $ff) {
if ($ff->dtype == 'pic' && $ff->val && $ff->val != '') { //图片
$ff->img = $uf->find(intval($ff->val));
}
}
$this->success("查询成功", null, $formFieldList);
}
// 编辑表单字段
public function edit()
{
$param = $this->request->param();
$flm = new FormListModal();
if ($this->request->isPost()) {
if (!array_key_exists("id", $param)) {
$this->error("id参数不存在操作失败");
}
$rflm = $flm->find(intval($param['id']));
if (!$rflm) {
$this->error("没查到更新表,操作失败");
}
$formFieldList = (new FormField())->where("form_list_id", intval($param['id']))->select();
if (array_key_exists("columns", $param)) {
$columns = $param["columns"];
foreach ($columns as $k => $column) {
//判断参数
$dfVArr = explode(",", $column['dfvalue']);
$dfVArr2 = array_unique($dfVArr);
if (sizeof($dfVArr) != sizeof($dfVArr2)) {
$this->error("保存失败," . $column['title'] . "的值重复");
}
}
}
//创建表
$tableName = $param['table_name'];
if (empty($tableName)) {
$this->error("数据库表名不能为空");
}
if (strpos($tableName, 'fox_') !== false) {
} else {
$tableName = 'fox_' . $tableName;
}
//修改表单表数据
$updateData = array();
if ($tableName != $rflm['table_name']) { //表名一致
//修改表名
$sql = "alter table {$rflm['table_name']} rename {$tableName}";
try {
Db::execute($sql);
$updateData['table_name'] = $tableName;
} catch (\Exception $e) {
$this->error("修改表名失败");
}
}
if ($rflm['name'] != $param['name']) {
$updateData['name'] = $param['name'];
}
if ($rflm['commit_type'] != $param['commit_type']) {
$updateData['commit_type'] = $param['commit_type'];
}
if ($rflm['notice_setting'] != $param['notice_setting']) {
$updateData['notice_setting'] = $param['notice_setting'];
}
if ($rflm['email_setting'] != $param['email_setting']) {
$updateData['email_setting'] = $param['email_setting'];
}
if ($rflm['template_id'] != $param['template_id']) {
$updateData['template_id'] = $param['template_id'];
}
if ($rflm['verify'] != $param['verify']) {
$updateData['verify'] = $param['verify'];
}
if (sizeof($updateData) > 0) {
$updateData["id"] = $rflm['id'];
FormListModal::update($updateData);
}
if (array_key_exists("columns", $param)) {
//删除的字段
$delFormFieldArr = array();
foreach ($formFieldList as $formField) {
$isExist = false;
foreach ($columns as $column) {
if ($column["id"] && $column["id"] == $formField['id']) {
$isExist = true;
break;
}
}
if (!$isExist) {
array_push($delFormFieldArr, $formField);
}
}
//区分操作数据
$field = new Field();
$columns = $param["columns"];
$addFieldList = []; //添加表栏列表属性
$updateFieldList = []; //修改表栏列表属性
$addTableFieldData = []; //添加表栏列表数据
$updateTableFieldData = []; //修改表栏列表数据
foreach ($columns as $k => $column) {
if ($column["id"]) { //存在
$fField = null;
foreach ($formFieldList as $formField) {
if ($column["id"] == $formField['id']) {
$fField = $formField;
break;
}
}
if ($fField) {
$fieldinfos = $field->GetFieldMake($column['dtype'], $fField['name'], $column['dfvalue'], $column['title'], $column['isRequire']);
$ntabsql = $fieldinfos[0];
$buideType = $fieldinfos[1];
$maxlength = $fieldinfos[2];
/*保存新增字段的记录*/
$FieldData = array();
if ($column['title'] != $fField['title']) {
$FieldData['title'] = $column['title'];
}
if ($buideType != $fField['define']) {
$FieldData['define'] = $buideType;
}
if ($maxlength != $fField['maxlength']) {
$FieldData['maxlength'] = $maxlength;
}
if ($column['val'] != $fField['val']) {
$FieldData['val'] = $column['val'];
}
if ($column['dfvalue'] != $fField['dfvalue']) {
$FieldData['dfvalue'] = $column['dfvalue'];
}
if ($column['markeWord'] != $fField['marke_word']) {
$FieldData['marke_word'] = $column['markeWord'];
}
if ($column['remark'] != $fField['remark']) {
$FieldData['remark'] = $column['remark'];
}
if ($column['isRequire'] != $fField['is_require']) {
$FieldData['is_require'] = $column['isRequire'];
}
if (sizeof($FieldData) > 0) {
array_push($updateFieldList, $ntabsql); //修改的字段
$FieldData['sort_order'] = $k;
$FieldData['id'] = $fField['id'];
array_push($updateTableFieldData, $FieldData); //表栏列表
}
}
} else { //不存在
//重新生成一个名字
foreach ($formFieldList as $fk => $ff) {
if ($column['name'] == $ff['name']) {
$column['name'] = $column['name'] . createNonceStr(1);
break;
}
}
$fieldinfos = $field->GetFieldMake($column['dtype'], $column['name'], $column['dfvalue'], $column['title'], $column['isRequire']);
$ntabsql = $fieldinfos[0];
$buideType = $fieldinfos[1];
$maxlength = $fieldinfos[2];
array_push($addFieldList, $ntabsql); //添加的字段
/*保存新增字段的记录*/
$FieldData = array(
'form_list_id' => $rflm->id,
'dfvalue' => $column['dfvalue'],
'val' => $column['val'],
'maxlength' => $maxlength,
'define' => $buideType,
'dtype' => $column['dtype'],
'is_require' => $column['isRequire'],
'name' => $column['name'],
'remark' => $column['remark'],
'title' => $column['title'],
'sort_order' => $k,
'marke_word' => $column['markeWord']
);
array_push($addTableFieldData, $FieldData); //表栏列表
}
}
if (sizeof($addFieldList) > 0) { //添加表栏列表属性
foreach ($addFieldList as $addField) {
//增加表字段
$sql = "ALTER TABLE {$tableName} ADD {$addField}";
try {
Db::execute($sql);
} catch (\Exception $e) {
$this->error("增加表字段失败" . $e->getMessage());
}
}
}
if (sizeof($updateFieldList) > 0) { //修改表字段属性
foreach ($updateFieldList as $updateField) {
//增加表字段
$sql = "ALTER TABLE {$tableName} modify {$updateField}";
try {
Db::execute($sql);
} catch (\Exception $e) {
$this->error("修改表字段失败");
}
}
}
if (sizeof($addTableFieldData) > 0) { //添加表栏列表数据
$dr = (new FormField())->saveAll($addTableFieldData);
}
if (sizeof($updateTableFieldData) > 0) { //修改表栏列表数据
foreach ($updateTableFieldData as $updateTFieldData) {
FormField::update($updateTFieldData);
}
}
if (sizeof($delFormFieldArr) > 0) { //删除去掉的表字段
$delFieldIdArr = array(); //删除数据id
foreach ($delFormFieldArr as $delFormField) {
//增加表字段
$sql = "alter table {$tableName} drop column {$delFormField['name']} ";
try {
Db::execute($sql);
array_push($delFieldIdArr, $delFormField["id"]);
} catch (\Exception $e) {
$this->error("删除表字段失败");
}
}
}
if (sizeof($delFieldIdArr) > 0) {
//删除数据
FormField::destroy($delFieldIdArr);
}
}
Cache::clear();
$this->success();
}
$id = $param['id'];
View::assign('id', $id);
$pmt = [];
if (array_key_exists('id', $param)) {
$formList = $flm->find($id);
View::assign('formList', $formList);
$pmt = Db::name('plugin_mail_template')->find($formList['template_id']);
}
View::assign("pmt", $pmt);
return view('edit');
}
public function look($page = 1, $pageSize = 100)
{
$param = $this->request->param();
$tableItem = []; //表格项
$tableHeads = []; //表头
//table列
$ffList = \app\common\model\FormField::where(['form_list_id' => $param["formListId"]])->order(["sort_order" => "asc", "create_time" => "asc"])->select();
foreach ($ffList as $ff) {
array_push($tableHeads, ['key' => $ff['name'], 'title' => $ff['title']]);
array_push($tableItem, $ff['name']);
}
array_push($tableHeads, ['key' => 'create_time', 'title' => '创建时间']);
array_push($tableItem, 'create_time');
if ($this->request->isAjax()) {
$where = [];
if (sizeof($tableHeads) > 2 && array_key_exists('keyword', $param) && !empty($param['keyword'])) {
array_push($where, ["{$tableHeads[0]['key']}|{$tableHeads[1]['key']}", 'like', '%' . trim($param['keyword']) . '%']);
}
$formList = FormListModal::find($param["formListId"]); //表单
$list = Db::table($formList["table_name"])->where($where)->order(["create_time" => "desc", "id" => "desc"])->paginate(['page' => $page, 'list_rows' => $pageSize]);
$this->success('查询成功', null, $list);
}
View::assign("tableHeads", $tableHeads);
View::assign("formListId", $param["formListId"]);
View::assign("tableItemStr", implode(',', $tableItem));
return view();
}
// 批量删除
public function lookDeletes()
{
if ($this->request->isPost()) {
$param = $this->request->param();
if (array_key_exists("idList", $param)) {
$idList = json_decode($param['idList']);
if (sizeof($idList) <= 0) {
$this->error("操作失败,请选择对应删除数据");
}
try {
$formList = FormListModal::find($param["formListId"]); //表单
Db::table($formList["table_name"])->delete($idList);
} catch (\Exception $e) {
$this->error("操作失败");
}
Cache::clear();
$this->success('操作成功');
}
} else {
$this->error("请求异常,删除失败!");
}
}
public function detail()
{
$param = $this->request->param();
$id = $param['id'];
$formListId = $param['formListId'];
$formList = FormListModal::find($formListId);
View::assign("id", $id);
View::assign("formListId", $formListId);
View::assign("tableName", $formList['table_name']);
return view();
}
public function deleteField()
{
$field_id = $this->request->param("field_id");
if (empty($field_id)) {
$this->error("操作失败");
}
$formField = FormField::find($field_id);
if ($formField) {
$formList = \app\common\model\FormList::find($formField['form_list_id']);
//增加表字段
$sql = "alter table {$formList['table_name']} drop column {$formField['name']} ";
Db::execute($sql);
FormField::destroy($field_id);
$this->success("操作成功");
} else {
$this->success("操作成功", "", "ts");
}
$this->error("操作失败");
}
}