研究pbootcms在线留言是怎么将数据存入数据库,并且以邮件方式将留言内容发送至邮箱。
1、判断表单提交方式是否为post,若不是,将提示错误信息
if ($_POST) { xxxx } else { json(0, '留言提交失败,请使用POST方式提交!'); }
2、判断后台留言功能开关是否开启
if ($this->config('message_status') === '0') { json(0, '系统已经关闭留言功能,请到后台开启再试!'); }
3、判断前台用户提交字段在后台数据库中是否存在
// 读取字段 if (! $form = $this->model->getFormField(1)) { json(0, '接收表单不存在任何字段,请核对后重试!'); }
4、将用户提交数据转换成邮件主体内容
// 接收数据 $mail_body = ''; foreach ($form as $value) { $field_data = post($value->name); if (is_array($field_data)) { // 如果是多选等情况时转换 $field_data = implode(',', $field_data); } $field_data = str_replace('pboot:if', '', $field_data); if ($value->required && ! $field_data) { json(0, $value->description . '不能为空!'); } else { $data[$value->name] = $field_data; $mail_body .= $value->description . ':' . $field_data . '<br>'; } }
5、判断后台留言审核开关是否启用,若是没有启用,则设置留言数据的转态为关闭
$status = $this->config('message_verify') == '0' ? 1 : 0;
6、设置其余字段的信息
// 设置其他字段 if ($data) { $data['acode'] = request('acode', 'var') ?: $this->lg; $data['user_ip'] = ip2long(get_user_ip()); $data['user_os'] = get_user_os(); $data['user_bs'] = get_user_bs(); $data['recontent'] = ''; $data['status'] = $status; $data['create_user'] = 'api'; $data['update_user'] = 'api'; }
7、将数据保存至数据库中
// 写入数据 if ($this->model->addMessage($value->table_name, $data)) { xxxxxxx json(1, '留言提交成功!'); } else { $this->log('API提交留言数据失败!'); json(0, '留言提交失败!'); }
8、判断后台是否配置了邮箱信息,若是配置了,则发送邮件至后台配置的邮箱
if ($this->config('message_send_mail') && $this->config('message_send_to')) { $mail_subject = "【" . CMSNAME . "】您有新的" . $value->form_name . "信息,请注意查收!"; $mail_body .= '<br>来自网站' . get_http_url() . '(' . date('Y-m-d H:i:s') . ')'; sendmail($this->config(), $this->config('message_send_to'), $mail_subject, $mail_body); }
至此表单留言方法已经ok了
以下是完整代码
// 新增留言 public function addmsg() { if ($_POST) { if ($this->config('message_status') === '0') { json(0, '系统已经关闭留言功能,请到后台开启再试!'); } // 读取字段 if (! $form = $this->model->getFormField(1)) { json(0, '接收表单不存在任何字段,请核对后重试!'); } // 接收数据 $mail_body = ''; foreach ($form as $value) { $field_data = post($value->name); if (is_array($field_data)) { // 如果是多选等情况时转换 $field_data = implode(',', $field_data); } $field_data = str_replace('pboot:if', '', $field_data); if ($value->required && ! $field_data) { json(0, $value->description . '不能为空!'); } else { $data[$value->name] = $field_data; $mail_body .= $value->description . ':' . $field_data . '<br>'; } } $status = $this->config('message_verify') == '0' ? 1 : 0; // 设置其他字段 if ($data) { $data['acode'] = request('acode', 'var') ?: $this->lg; $data['user_ip'] = ip2long(get_user_ip()); $data['user_os'] = get_user_os(); $data['user_bs'] = get_user_bs(); $data['recontent'] = ''; $data['status'] = $status; $data['create_user'] = 'api'; $data['update_user'] = 'api'; } // 写入数据 if ($this->model->addMessage($value->table_name, $data)) { $this->log('API提交留言数据成功!'); if ($this->config('message_send_mail') && $this->config('message_send_to')) { $mail_subject = "【" . CMSNAME . "】您有新的" . $value->form_name . "信息,请注意查收!"; $mail_body .= '<br>来自网站' . get_http_url() . '(' . date('Y-m-d H:i:s') . ')'; sendmail($this->config(), $this->config('message_send_to'), $mail_subject, $mail_body); } json(1, '留言提交成功!'); } else { $this->log('API提交留言数据失败!'); json(0, '留言提交失败!'); } } else { json(0, '留言提交失败,请使用POST方式提交!'); } }
以下有调用模型中的方法
// 获取表单字段 public function getFormField($fcode) { $field = array( 'a.table_name', 'a.form_name', 'b.name', 'b.required', 'b.description' ); $join = array( 'ay_form_field b', 'a.fcode=b.fcode', 'LEFT' ); return parent::table('ay_form a')->field($field) ->where("a.fcode='$fcode'") ->join($join) ->order('b.sorting ASC,b.id ASC') ->select(); }
// 新增留言 public function addMessage($table, $data) { return parent::table('ay_message')->autoTime()->insert($data); }
邮件发送方法:
/** * 快速发送邮件函数 * * @param array $config * 邮件服务器连接数组,需包含 smtp_server、smtp_username、smtp_password、smtp_port、smtp_port * @param string $to * 邮件接收人 * @param string $subject * 邮件主题 * @param string $body * 邮件正文 */ function sendmail(array $config, $to, $subject, $body) { $smtp = new Smtp($config['smtp_server'], $config['smtp_username'], $config['smtp_password'], $config['smtp_port'], $config['smtp_ssl']); if ($smtp->sendMail($to, $subject, $body)) { return true; } else { return $smtp->error(); } }