qa-ifish7/web/Application/Admin/Model/FeedbackFieldModel.class.php

558 lines
24 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace Admin\Model;
use Think\Model;
class FeedbackFieldModel extends Model{
const modelFieldPath = 'Data/feedbackFieldTemp/'; //字段模板路径
protected $table_name;
public function __construct(){
$this->table_name="feedback";
//注意,这里父类析构函数一定要放到最下面,否则框架自带的方法不能使用
parent::__construct();
}
//自动验证
//array(验证字段,验证规则,错误提示,[验证条件,附加规则,验证时间])
protected $_validate = array(
array('formtype', 'require', '字段类型不能为空!'),
array('field', 'require', '字段名称必须填写!'),
array('field', 'isFieldUnique', '该字段名称已经存在!', 0, 'callback', 1),
array('name', 'require', '字段别名必须填写!'),
array('field', '/^[a-z_0-9]+$/i', '字段名只支持英文或数字!', 0, 'regex', 3),
);
/**
* 验证字段名是否已经存在
* @param type $fieldName
* @return boolean false已经存在true不存在
*/
public function isFieldUnique($fieldName) {
if (empty($fieldName)) {
return true;
}
if ($this->where(array('field' => $fieldName))->count()){
return false;
}
return true;
}
//增加
public function data_add(){
$data=$this->create();
$fieldtype = $data['fieldtype'];
//检查字段是否存在
if ($this->field_exists("feedback", $data['field'])) {
$this->error = '该字段已经存在!';
return false;
}
//增加字段
$field = array(
'tablename' => C("DB_PREFIX") .$this->table_name,
'fieldname' => $data['field'],
'fieldlen' => $data['fieldlen'],
'defaultvalue' => $data['defaultvalue'],
);
if ($this->addFieldSql($fieldtype, $field)) {
//更新htmlcode
$data['htmlcode']=$this->createFieldHtmlCode($data);
//
$fieldid = $this->add($data);
if (!$fieldid){
$this->error = '字段信息入库失败!';
//回滚
$this->execute("ALTER TABLE `{$field['tablename']}` DROP `{$field['fieldname']}`");
return false;
}
} else {
$this->error = '数据库字段添加失败!';
return false;
}
return $fieldid;
}
//修改模型
public function data_editor(){
$data=$this->create();
if (!$data['field_id']) {
$this->error = '缺少字段id';
return false;
} else {
$fieldid = $fieldid ? $fieldid : (int) $data['field_id'];
}
//重置htmlcode
$data['htmlcode']=htmlspecialchars_decode($data['htmlcode']);
$data['htmlcode']=$this->createFieldHtmlCode($data);
//原字段信息
$info = $this->where(array("field_id" => $fieldid))->find();
if (empty($info)) {
$this->error = '该字段不存在!';
return false;
}
//字段类型
if (empty($data['formtype'])) {
$data['formtype'] = $info['formtype'];
}
$field_type = $data['fieldtype'];
if (false !== $this->save($data)) {
//如果字段名变更
if ($data['field'] && $info['field']) {
//检查字段是否存在,只有当字段名改变才检测
if ($data['field'] != $info['field'] && $this->field_exists($this->table_name, $data['field'])) {
$this->error = '该字段已经存在!';
//回滚
$this->where(array("field_id" => $fieldid))->save($info);
return false;
}
$field = array(
'tablename' => C("DB_PREFIX") . $this->table_name,
'newfilename' => $data['field'],
'oldfilename' => $info['field'],
'fieldlen' => $data['fieldlen'],
'defaultvalue' => $data['defaultvalue'],
);
if (false === $this->editFieldSql($field_type, $field)) {
$this->error = '数据库字段结构更改失败!';
//回滚
$this->where(array("field_id" => $fieldid))->save($info);
return false;
}
}
} else {
$this->error = '数据库更新失败!';
return false;
}
$cat=M("feedback_cat")->select();
foreach($cat as $v){
$this->updateModelTemp($v["catid"]);
}
//
return $data;
}
//删除字段
public function data_delete($fieldid) {
//原字段信息
$info = $this->where(array("field_id" => $fieldid))->find();
if (empty($info)) {
$this->error = '该字段不存在!';
return false;
}
//完整表名获取 判断主表 还是副表
$tablename = $this->table_name;
if ($this->deleteFieldSql($info['field'], C("DB_PREFIX") . $tablename)) {
$this->where(array("field_id" => $fieldid))->delete();
} else {
$this->error = '数据库表字段删除失败!';
return false;
}
//modeltemp
$cat=M("feedback_cat")->select();
foreach($cat as $v){
$this->updateModelTemp($v["catid"]);
}
return true;
}
/**
* 重新生成模型表单文件
* @param type $modelId 模型id
*/
public function updateModelTemp($catid){
$ModelModel=new \Admin\Model\FeedbackCatModel();
$ModelModel->updateModelTemp($catid);
}
/**
* 根据字段类型,删除对应的字段到相应表里面
* @param type $filename 字段名称
* @param type $tablename 完整表名
*/
protected function deleteFieldSql($filename, $tablename) {
//不带表前缀的表名
$noprefixTablename = str_replace(C("DB_PREFIX"), '', $tablename);
if (empty($tablename) || empty($filename)) {
$this->error = '表名或者字段名不能为空!';
return false;
}
if (false === $this->table_exists($noprefixTablename)) {
$this->error = '该表不存在!';
return false;
}
$sql = "ALTER TABLE `{$tablename}` DROP `{$filename}`;";
if (false === $this->execute($sql)) {
$this->error = '字段删除失败!';
return false;
}
return true;
}
/**
* 根据字段类型,增加对应的字段到相应表里面
* @param type $field_type 字段类型
* @param type $field 相关配置
* $field = array(
* 'tablename' 表名(完整表名)
* 'fieldname' 字段名
* 'maxlength' 最大长度
* 'minlength' 最小值
* 'defaultvalue' 默认值
* 'minnumber' 是否正整数 和整数 1为正整数-1是为整数
* 'decimaldigits' 小数位数
* )
*/
protected function addFieldSql($field_type, $field) {
//表名
$tablename = $field['tablename'];
//字段名
$fieldname = $field['fieldname'];
//长度
$fieldlen = $field['fieldlen'];
switch ($field_type) {
case "varchar":
if (!$fieldlen) {
$fieldlen = 255;
}
$fieldlen = min($fieldlen, 255);
$sql = "ALTER TABLE `{$tablename}` ADD `{$fieldname}` VARCHAR( {$fieldlen} ) NOT NULL DEFAULT ''";
if (false === $this->execute($sql)) {
$this->error = '数据库字段添加失败!';
return false;
}
break;
case "tinyint":
if (!$fieldlen) {
$fieldlen = 3;
}
$sql = "ALTER TABLE `{$tablename}` ADD `{$fieldname}` TINYINT( {$fieldlen} ) " . ($minnumber >= 0 ? 'UNSIGNED' : '') . " NOT NULL DEFAULT 0";
if (false === $this->execute($sql)) {
$this->error = '数据库字段添加失败!';
return false;
}
break;
case "smallint":
$minnumber = intval($minnumber);
$sql = "ALTER TABLE `{$tablename}` ADD `{$fieldname}` SMALLINT " . ($minnumber >= 0 ? 'UNSIGNED' : '') . " NOT NULL DEFAULT 0";
if (false === $this->execute($sql)) {
$this->error = '数据库字段添加失败!';
return false;
}
break;
case "mediumint":
$minnumber = intval($minnumber);
$sql = "ALTER TABLE `{$tablename}` ADD `{$fieldname}` INT " . ($minnumber >= 0 ? 'UNSIGNED' : '') . " NOT NULL DEFAULT 0";
if (false === $this->execute($sql)) {
$this->error = '数据库字段添加失败!';
return false;
}
break;
case "int":
$minnumber = intval($minnumber);
$sql = "ALTER TABLE `{$tablename}` ADD `{$fieldname}` INT " . ($minnumber >= 0 ? 'UNSIGNED' : '') . " NOT NULL DEFAULT 0";
if (false === $this->execute($sql)) {
$this->error = '数据库字段添加失败!';
return false;
}
break;
case "mediumtext":
$sql = "ALTER TABLE `{$tablename}` ADD `{$fieldname}` MEDIUMTEXT";
if (false === $this->execute($sql)) {
$this->error = '数据库字段添加失败!';
return false;
}
break;
case "text":
$sql = "ALTER TABLE `{$tablename}` ADD `{$fieldname}` TEXT";
if (false === $this->execute($sql)) {
$this->error = '数据库字段添加失败!';
return false;
}
break;
case "date":
$sql = "ALTER TABLE `{$tablename}` ADD `{$fieldname}` DATE DEFAULT ''";
if (false === $this->execute($sql)) {
$this->error = '字段结构更改失败!';
return false;
}
break;
case "datetime":
$sql = "ALTER TABLE `{$tablename}` ADD `{$fieldname}` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP";
if (false === $this->execute($sql)) {
$this->error = '字段结构更改失败!';
return false;
}
break;
case "timestamp":
$sql = "ALTER TABLE `{$tablename}` ADD `{$fieldname}` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP";
if (false === $this->execute($sql)) {
$this->error = '数据库字段添加失败!';
return false;
}
break;
case "double":
$sql = "ALTER TABLE `{$tablename}` ADD `{$fieldname}` DOUBLE NOT NULL DEFAULT 0";
if (false === $this->execute($sql)) {
$this->error = '数据库字段添加失败!';
return false;
}
break;
case "float":
$sql = "ALTER TABLE `{$tablename}` ADD `{$fieldname}` FLOAT NOT NULL DEFAULT 0";
if (false === $this->execute($sql)) {
$this->error = '数据库字段添加失败!';
return false;
}
break;
case "bigint":
$sql = "ALTER TABLE `{$tablename}` ADD `{$fieldname}` BIGINT NOT NULL DEFAULT 0";
if (false === $this->execute($sql)) {
$this->error = '数据库字段添加失败!';
return false;
}
break;
case "longtext":
$sql = "ALTER TABLE `{$tablename}` ADD `{$fieldname}` LONGTEXT";
if (false === $this->execute($sql)) {
$this->error = '数据库字段添加失败!';
return false;
}
break;
case "char":
$sql = "ALTER TABLE `{$tablename}` ADD `{$fieldname}` CHAR(255) NOT NULL DEFAULT ''";
if (false === $this->execute($sql)) {
$this->error = '字段结构更改失败!';
return false;
}
break;
default:
return false;
break;
}
return true;
}
/**
* 执行数据库表结构更改
* @param type $field_type 字段类型
* @param type $field 相关配置
* $field = array(
* 'tablename' 表名(完整表名)
* 'newfilename' 新字段名
* 'oldfilename' 原字段名
* 'maxlength' 最大长度
* 'minlength' 最小值
* 'defaultvalue' 默认值
* 'minnumber' 是否正整数 和整数 1为正整数-1是为整数
* 'decimaldigits' 小数位数
* )
*/
protected function editFieldSql($field_type, $field) {
//表名
$tablename = $field['tablename'];
//原字段名
$oldfilename = $field['oldfilename'];
//新字段名
$newfilename = $field['newfilename'] ? $field['newfilename'] : $oldfilename;
//长度
$fieldlen = $field['fieldlen'];
if (empty($tablename) || empty($newfilename)) {
$this->error = '表名或者字段名不能为空!';
return false;
}
switch ($field_type) {
case 'varchar':
//最大值
if (!$maxlength) {
$maxlength = 255;
}
$maxlength = min($maxlength, 255);
$sql = "ALTER TABLE `{$tablename}` CHANGE `{$oldfilename}` `{$newfilename}` VARCHAR( {$maxlength} ) NOT NULL DEFAULT ''";
if (false === $this->execute($sql)) {
$this->error = '字段结构更改失败!';
return false;
}
break;
case 'tinyint':
$sql = "ALTER TABLE `{$tablename}` CHANGE `{$oldfilename}` `{$newfilename}` TINYINT " . ($minnumber >= 0 ? 'UNSIGNED' : '') . " NOT NULL DEFAULT 0";
if (false === $this->execute($sql)) {
$this->error = '字段结构更改失败!';
return false;
}
break;
case 'smallint':
$minnumber = intval($minnumber);
$defaultvalue = intval($defaultvalue);
$sql = "ALTER TABLE `{$tablename}` CHANGE `{$oldfilename}` `{$newfilename}` SMALLINT " . ($minnumber >= 0 ? 'UNSIGNED' : '') . " NOT NULL DEFAULT '{$defaultvalue}' DEFAULT 0";
if (false === $this->execute($sql)) {
$this->error = '字段结构更改失败!';
return false;
}
break;
case 'mediumint':
$minnumber = intval($minnumber);
$defaultvalue = intval($defaultvalue);
$sql = "ALTER TABLE `{$tablename}` CHANGE `{$oldfilename}` `{$newfilename}` MEDIUMINT " . ($minnumber >= 0 ? 'UNSIGNED' : '') . " NOT NULL DEFAULT '{$defaultvalue}' DEFAULT 0";
if (false === $this->execute($sql)) {
$this->error = '字段结构更改失败!';
return false;
}
break;
case 'int':
$minnumber = intval($minnumber);
$defaultvalue = intval($defaultvalue);
$sql = "ALTER TABLE `{$tablename}` CHANGE `{$oldfilename}` `{$newfilename}` INT " . ($minnumber >= 0 ? 'UNSIGNED' : '') . " NOT NULL DEFAULT '{$defaultvalue}' DEFAULT 0";
if (false === $this->execute($sql)) {
$this->error = '字段结构更改失败!';
return false;
}
break;
case 'mediumtext':
$sql = "ALTER TABLE `{$tablename}` CHANGE `{$oldfilename}` `{$newfilename}` MEDIUMTEXT";
if (false === $this->execute($sql)) {
$this->error = '字段结构更改失败!';
return false;
}
break;
case 'text':
$sql = "ALTER TABLE `{$tablename}` CHANGE `{$oldfilename}` `{$newfilename}` TEXT";
if (false === $this->execute($sql)) {
$this->error = '字段结构更改失败!';
return false;
}
break;
case 'date':
$sql = "ALTER TABLE `{$tablename}` CHANGE `{$oldfilename}` `{$newfilename}` DATE DEFAULT ''";
if (false === $this->execute($sql)) {
$this->error = '字段结构更改失败!';
return false;
}
break;
case 'datetime':
$sql = "ALTER TABLE `{$tablename}` CHANGE `{$oldfilename}` `{$newfilename}` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP";
if (false === $this->execute($sql)) {
$this->error = '字段结构更改失败!';
return false;
}
break;
case 'timestamp':
$sql = "ALTER TABLE `{$tablename}` CHANGE `{$oldfilename}` `{$newfilename}` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP";
if (false === $this->execute($sql)) {
$this->error = '字段结构更改失败!';
return false;
}
break;
case "double":
$defaultvalue = intval($defaultvalue);
$sql = "ALTER TABLE `{$tablename}` CHANGE `{$oldfilename}` `{$newfilename}` DOUBLE NOT NULL DEFAULT 0";
if (false === $this->execute($sql)) {
$this->error = '字段结构更改失败!';
return false;
}
break;
case "float":
$defaultvalue = intval($defaultvalue);
$sql = "ALTER TABLE `{$tablename}` CHANGE `{$oldfilename}` `{$newfilename}` FLOAT NOT NULL DEFAULT 0";
if (false === $this->execute($sql)) {
$this->error = '字段结构更改失败!';
return false;
}
break;
case "bigint":
$defaultvalue = intval($defaultvalue);
$sql = "ALTER TABLE `{$tablename}` CHANGE `{$oldfilename}` `{$newfilename}` BIGINT NOT NULL DEFAULT 0";
if (false === $this->execute($sql)) {
$this->error = '字段结构更改失败!';
return false;
}
break;
case "longtext":
$sql = "ALTER TABLE `{$tablename}` CHANGE `{$oldfilename}` `{$newfilename}` LONGTEXT";
if (false === $this->execute($sql)) {
$this->error = '字段结构更改失败!';
return false;
}
break;
case "char":
$sql = "ALTER TABLE `{$tablename}` CHANGE `{$oldfilename}` `{$newfilename}` CHAR(255) NOT NULL DEFAULT ''";
if (false === $this->execute($sql)) {
$this->error = '字段结构更改失败!';
return false;
}
break;
default:
$this->error = "字段类型" . $field_type . "不存在相应信息!";
return false;
break;
}
return true;
}
/*
* 创建字段html代码
*/
public function createFieldHtmlCode($data){
if($data['field_id']){
$info=M("feedback_field")->find($data['field_id']);
//当字段类型 and 宽度 and 高度 and 默认值 未改变的时候htmlcode等于提交过来的否则执行重新生成动作
if($info['field']==$data['field']&&$info['name']==$data['name']&&$info['formtype']==$data['formtype']&&$info['formwidth']==$data['formwidth']&&$info['formheight']==$data['formheight']&&$info['defaultval']==$data['defaultval']&&$info['tips']==$data['tips']){
$htmlcode=$data['htmlcode'];
}else{
$htmlcode=$this->FieldHtmlCodeReplace($data);
}
}else{
$htmlcode=$this->FieldHtmlCodeReplace($data);
}
return $htmlcode;
}
/*
* 替换字段类型的代码
*
*/
public function FieldHtmlCodeReplace($rs){
//获取表单类型的模板文件
$field_temp= file_get_contents(APP_PATH.self::modelFieldPath.$rs['formtype'].".php");
//内容替换
$field_temp= str_replace("{modelFieldTemp_field}",$rs['field'],$field_temp);
$field_temp= str_replace("{tips}",$rs['tips'],$field_temp);
$field_temp= str_replace("{defaultval}",$rs['defaultval'],$field_temp);
//宽度
if($rs['formwidth']){
$style_formwidth="width:".$rs['formwidth']."px;";
}else{
$style_formwidth="";
}
$field_temp= str_replace("{style_formwidth}",$style_formwidth,$field_temp);
//高度
if($rs['formheight']){
$style_formheight="height:".$rs['formheight']."px;";
}else{
$style_formheight="";
}
$field_temp= str_replace("{style_formheight}",$style_formheight,$field_temp);
//编辑器高度 宽度替换因为编辑器只调用数值不需要css样式
$field_temp= str_replace("{formwidth}",$rs['formwidth'],$field_temp);
$field_temp= str_replace("{formheight}",$rs['formheight'],$field_temp);
//checkbox radio select选项替换
$checkbox_option="";
if($rs['formtype']=="checkbox"||$rs['formtype']=="radio"||$rs['formtype']=="select"){
if($rs['defaultval']){
$defaultval=explode("\r\n",$rs['defaultval']);
foreach($defaultval as $v){
$dufault_arr=explode(":",$v);
$option_arr=explode("==",$dufault_arr[0]);
$select_checked=$dufault_arr[1]=="default"?'<?=$r?"":"selected"?>':"";//select 默认选择中的
$checked_default=$dufault_arr[1]=="default"?'<?=$r?"":"checked"?>':"";//checked radio 默认选择中的
$option_name=trim($option_arr[0]);//字段名称
$option_value=trim($option_arr[1]==""?$option_arr[0]:$option_arr[1]);//字段值 为空时=名称
if($rs['formtype']=="checkbox"){
$checkbox_option.='<label class="label-radio"><input type="checkbox" name="'.$rs['field'].'[]" value="'.$option_value.'" class="modelform_title" <?=strstr($r[\''.$rs['field'].'\'],\'|'.$option_value.'|\')?"checked":""?> '.$checked_default.'/>'.$option_name.'</label>';
}
if($rs['formtype']=="radio"){
$checkbox_option.='<label class="label-radio"><input type="radio" name="'.$rs['field'].'" value="'.$option_value.'" class="modelform_title" <?=$r[\''.$rs['field'].'\']==\''.$option_value.'\'?"checked":""?> '.$checked_default.'/>'.$option_name.'</label>';
}
if($rs['formtype']=="select"){
$checkbox_option.='<option value="'.$option_value.'" <?=$r[\''.$rs['field'].'\']==\''.$option_value.'\'?"selected":""?> '.$select_checked.'>'.$option_name.'</option>';
}
}
}
}
$field_temp= str_replace("{select_option}",$checkbox_option,$field_temp);
return $field_temp;
}
}