official_website/app/plus/controller/Diyform.php

202 lines
8.8 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:24
* @version : V1.08
* @copyright : ©2021-现在 贵州黔狐科技股份有限公司 版权所有
* @LastEditTime : 2023/6/26 19:24
*/
namespace app\plus\controller;
use app\common\controller\ApiBase;
use app\common\model\FormField;
use app\common\model\FormList;
use PHPMailer\PHPMailer\PHPMailer;
use think\captcha\facade\Captcha;
use think\facade\Db;
use think\Response;
class Diyform extends ApiBase
{
private $limitTime = 5; //限制时间单位分钟
// 接收表单数据
function receive()
{
$param = $this->request->param();
$locationHref = getFromPage();
if ($this->request->isPost()) {
$id = $param["id"];
if (empty($id)) {
$content = "<html><body><script>alert('提交失败'); window.location.href='$locationHref'</script></body></html>";
$type = "html";
return Response::create($content, $type, 0);
} else {
$formList = FormList::find($id);
if ($formList['verify'] == 1) { //开启
if (empty($param['vercode'])) {
$content = "<html><body><script>alert('验证码不能空'); window.location.href='$locationHref'</script></body></html>";
$type = "html";
return Response::create($content, $type, 0);
}
if (array_key_exists("vercode", $param) && !captcha_check($param['vercode'])) { //验证码
$respContent = "<html><body><script>alert('验证码错误');window.location.href='$locationHref'</script></body></html>";
$type = "html";
return Response::create($respContent, $type, 0);
}
}
$key = getAccessIP() . "_" . $id; //用于记录时间
$commit_type = $formList["commit_type"];
if ($commit_type == 1) { //同IP在5分钟内只许提交1次可免避恶意多次提交。
$timestamp1 = saveToCache($key);
if ($timestamp1 != null) {
$timestampArr = time_diff($timestamp1, time());
$hours = $timestampArr["hours"]; //小时
$minutes = $timestampArr["minutes"]; //分钟
if ($hours <= 0 && $minutes < $this->limitTime) {
$content = "<html><body><script>alert('频繁提交,请稍候再试'); window.location.href='$locationHref'</script></body></html>";
$type = "html";
return Response::create($content, $type, 0);
}
}
}
if (!$formList) {
$content = "<html><body><script>alert('提交失败,没找到对应表单');window.location.href='$locationHref'</script></body></html>";
$type = "html";
return Response::create($content, $type, 0);
}
unset($param["id"]); //移出表单id
unset($param["vercode"]); //移出表单验证码
$formFields = FormField::where(["form_list_id" => $id, "is_require" => 1])->select()->toArray();
$formData = [];
if (sizeof($formFields) > 0) {
$noExistParam = []; //没有必填字段
$paramNull = []; //必填字段内容为空
foreach ($formFields as $formField) {
$isExist = false;
if (key_exists($formField["name"], $param)) {
$isExist = true;
}
if ($isExist) { //存在判断值是否为空
if (empty($param[$formField['name']]) || $param[$formField['name']] == null) {
array_push($paramNull, $formField['name']);
} else { //不为空的时候处理一下内容
$fieldVal = $param[$formField['name']];
$fieldVal = form_replace($fieldVal);
$param[$formField['name']] = $fieldVal;
array_push($formData, ['title' => $formField['title'], 'value' => $fieldVal]);
}
} else {
array_push($noExistParam, $formField['name']);
}
}
if (sizeof($noExistParam) > 0) {
$content = "<html><body><script>alert('提交失败,少了必填字段');window.location.href='$locationHref'</script></body></html>";
$type = "html";
return Response::create($content, $type, 0);
}
if (sizeof($paramNull) > 0) {
$content = "<html><body><script>alert('提交失败,必填字段值为空');window.location.href='$locationHref'</script></body></html>";
$type = "html";
return Response::create($content, $type, 0);
}
}
$r = Db::table($formList['table_name'])->strict(false)->insert($param);
if ($r) {
if ($formList['email_setting'] == 1) { //开启邮件通知
$this->sendMail($formList['template_id'], $formData);
}
saveToCache($key, time()); //记录一下时间
$content = "<html><body><script>alert('提交成功');window.location.href='$locationHref'</script></body></html>";
$type = "html";
return Response::create($content, $type, 200);
} else {
$content = "<html><body><script>alert('提交失败');window.location.href='$locationHref'</script></body></html>";
$type = "html";
return Response::create($content, $type, 0);
}
}
}
$content = "<html><body><script>alert('提交失败');window.location.href='$locationHref'</script></body></html>";
$type = "html";
return Response::create($content, $type, 0);
}
/**
* 生成验证码
*/
public function verify()
{
return Captcha::create();
}
/**
* 发送邮件
*/
private function sendMail($template_id, $formData)
{
$pmcArr = Db::name('plugin_mail_config')->select();
if (sizeof($pmcArr) > 0) {
$pluginMailConfig = $pmcArr[0];
$pmt = Db::name('plugin_mail_template')->find($template_id);
$title = $pmt['title'];
$to = $pluginMailConfig['test_account'];
$contents = ["<!DOCTYPE html>
<html>
<head>
<title>邮件通知</title>
<style>
body { font-family: Arial, sans-serif; }
.container { max-width: 600px; margin: auto; padding: 20px; border: 1px solid #ddd; }
h1 {color: #333; }
p { color: #666; }
hr {border: 1px solid #ddd; }
</style>
</head>
<body>
<div class='container'>
<h1>尊敬的FoxCMS用户</h1>
<p style='font-size: 16px;'>这是一封来自您网站的通知邮件!</p>
<p>您网站收到新的表单信息,可登录网后后台“应用-自定义表单”中查看。</p>
<p style='font-weight: bold'>以下是消息内容</p>
<hr>
"];
$template_content = $pmt['content'];
foreach ($formData as $key => $fd) {
$tc = str_replace("__TITLE__", $fd['title'], $template_content);
$tc = str_replace("__CONTENT__", $fd['value'], $tc);
array_push($contents, $tc);
}
array_push($contents, '</div></body></html>');
$mail = new PHPMailer();
$mail->SMTPDebug = 0;
$mail->isSMTP();
$mail->SMTPAuth = true;
$mail->Host = trim($pluginMailConfig['smtp_url']);
$mail->SMTPSecure = 'ssl';
$mail->Port = $pluginMailConfig['smtp_port'];
$mail->Hostname = '';
$mail->CharSet = 'UTF-8';
$mail->FromName = 'FoxCMS网站消息';
$mail->Username = trim($pluginMailConfig['send_account']);
$mail->Password = trim($pluginMailConfig['auth_code']);
$mail->From = trim($pluginMailConfig['send_account']);
$mail->isHTML(true);
$mail->addAddress($to, '');
$mail->Subject = $title;
$mail->Body = implode("", $contents);
try {
$mail->send();
} catch (\Exception $e) {
}
}
}
}