official_website/app/admin/util/ModelMg.php

218 lines
8.2 KiB
PHP
Raw 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
/**
* @Descripttion : FOXCMS 是一款高效的 PHP 多端跨平台内容管理系统
* @Author : FoxCMS Team
* @Date : 2023/6/26 15:53
* @version : V1.08
* @copyright : ©2021-现在 贵州黔狐科技股份有限公司 版权所有
* @LastEditTime : 2023/6/26 15:53
*/
namespace app\admin\util;
use think\facade\Db;
// 模型工具
class ModelMg
{
// 解析sql语句
public function sql_split($sql, $tablepre)
{
if ($tablepre != "fox_")
$sql = str_replace("`fox_", '`' . $tablepre, $sql);
$sql = preg_replace("/TYPE=(InnoDB|MyISAM|MEMORY)( DEFAULT CHARSET=[^; ]+)?/", "ENGINE=\\1 DEFAULT CHARSET=utf8", $sql);
$sql = str_replace("\r", "\n", $sql);
$ret = array();
$num = 0;
$queriesarray = explode(";\n", trim($sql));
unset($sql);
foreach ($queriesarray as $query) {
$query = remove_str_bom($query);
$ret[$num] = '';
$queries = explode("\n", trim($query));
$queries = array_filter($queries);
foreach ($queries as $query) {
$str1 = substr($query, 0, 1);
if ($str1 != '#' && $str1 != '-')
$ret[$num] .= $query;
}
$num++;
}
return $ret;
}
/**
* 创建模型及模型表
* @param $nid 模型标识
* @param $cm 类名称
* @param $templateHtml 模型文件
* @param $name 表名字
* @param string $reference_model 参照模型 0文章模型; 1:单页模型
* @return bool
*/
public function createModel($nid, $cm, $templateHtml, $name, $reference_model = "0")
{
$modelPath = app()->getRootPath() . 'custom';
$filelist = dirFile($modelPath);
$referenceModelText = "article";
if ($reference_model == 1) {
$referenceModelText = "single";
}
foreach ($filelist as $key => $file) {
$dst = $file; //目标文件
//跳过模型
if ((strpos($dst, 'admin') !== false)) {
if (((strpos($dst, 'view') !== false) && !(strpos($dst, $referenceModelText) !== false))) {
continue;
}
if ((strpos($dst, 'controller') !== false) && !(strpos($dst, ucfirst($referenceModelText)) !== false)) {
continue;
}
}
if (strpos($dst, 'common') !== false) { //模型
if (!(strpos($dst, ucfirst($referenceModelText)) !== false)) {
continue;
}
}
if (strpos($dst, 'home') !== false) { //前端控制
if (!(strpos($dst, ucfirst($referenceModelText)) !== false)) {
continue;
}
}
$src = $modelPath . DIRECTORY_SEPARATOR . $file; //源文件
$dst = str_replace('custom', $nid, $dst);
$dst = str_replace('Custom', $cm, $dst);
if (strpos($dst, 'admin') !== false) { //后台控制
if (strpos($dst, 'controller') !== false) { //控制文件
$dst = str_replace(ucfirst($referenceModelText), $cm, $dst);
$dst = app()->getRootPath() . "app" . DIRECTORY_SEPARATOR . $dst;
$fileContent = @file_get_contents($src);
$fileContent = str_replace('Custom', $cm, $fileContent);
$fileContent = str_replace('custom', $nid, $fileContent);
@file_put_contents($dst, $fileContent);
} elseif (strpos($dst, 'view') !== false) { //显示文件
$dst = str_replace($referenceModelText, $nid, $dst);
$dst = app()->getRootPath() . "app" . DIRECTORY_SEPARATOR . $dst;
$dir = substr($dst, 0, strrpos($dst, DIRECTORY_SEPARATOR));
if (tp_mkdir($dir)) {
$fileContent = @file_get_contents($src);
$fileContent = str_replace('Custom', $cm, $fileContent);
$fileContent = str_replace('custom', $nid, $fileContent);
@file_put_contents($dst, $fileContent);
}
}
} elseif (strpos($dst, 'common') !== false) { //模型
$dst = str_replace(ucfirst($referenceModelText), $cm, $dst);
$dst = app()->getRootPath() . "app" . DIRECTORY_SEPARATOR . $dst;
$fileContent = @file_get_contents($src);
$fileContent = str_replace('Custom', $cm, $fileContent);
@file_put_contents($dst, $fileContent);
} elseif (strpos($dst, 'home') !== false) { //前端控制
$dst = str_replace(ucfirst($referenceModelText), $cm, $dst);
$dst = app()->getRootPath() . "app" . DIRECTORY_SEPARATOR . $dst;
$fileContent = @file_get_contents($src);
$fileContent = str_replace('Custom', $cm, $fileContent);
$fileContent = str_replace('custom', $nid, $fileContent);
@file_put_contents($dst, $fileContent);
} elseif (strpos($dst, 'template') !== false) { //前端模型文件
$dst = str_replace("template", "", $dst);
$dst = str_replace(DIRECTORY_SEPARATOR . "html", "", $dst);
$dst = $templateHtml . $dst;
$dir = substr($dst, 0, strrpos($dst, DIRECTORY_SEPARATOR));
if (tp_mkdir($dir)) {
$fileContent = @file_get_contents($src);
@file_put_contents($dst, $fileContent);
}
}
}
$columnFieldStr = "";
if ($reference_model == "0") { //参照模型 0文章模型;
$columnFieldStr = implode(",", xn_cfg("article"));
} elseif ($reference_model == "1") { //参照模型 1:单页模型
$columnFieldStr = implode(",", xn_cfg("single"));
}
// 创建自定义模型附加表
$table = 'fox_' . $nid;
$tableSql = <<<EOF
CREATE TABLE `{$table}` (
`id` int(10) NOT NULL AUTO_INCREMENT,
{$columnFieldStr},
`create_time` datetime DEFAULT NULL COMMENT '新增时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='$name';
EOF;
$sqlFormat = $this->sql_split($tableSql, "fox_");
// 执行SQL语句
try {
// 执行SQL语句
$counts = count($sqlFormat);
for ($i = 0; $i < $counts; $i++) {
$sql = trim($sqlFormat[$i]);
if (stristr($sql, 'CREATE TABLE')) {
Db::execute($sql);
} else {
if (trim($sql) == '')
continue;
Db::execute($sql);
}
}
return true;
} catch (\Exception $e) {
return false;
}
}
/**
* 创建模型表
* @param $nid 模型标识
* @param $name 表名称
* @return array|bool
*/
public function createModelTable($nid, $name)
{
// 创建自定义模型附加表
$table = 'fox_' . $nid;
$tableSql = <<<EOF
CREATE TABLE `{$table}` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`create_time` datetime DEFAULT NULL COMMENT '新增时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='$name';
EOF;
$sqlFormat = $this->sql_split($tableSql, "fox_");
// 执行SQL语句
try {
// 执行SQL语句
$counts = count($sqlFormat);
for ($i = 0; $i < $counts; $i++) {
$sql = trim($sqlFormat[$i]);
if (stristr($sql, 'CREATE TABLE')) {
Db::execute($sql);
} else {
if (trim($sql) == '')
continue;
Db::execute($sql);
}
}
return true;
} catch (\Exception $e) {
return false;
}
}
}