更改电子邮件-表单模块的主题



我正在用Cockpit和React JS开发一个网站。

在这个项目中,有一个非常简单的联系表格(姓名、电子邮件、消息(。

我通过Forms模块在Cockpit中创建了一个表单,并在Cockpot中添加了一个配置文件(config/config.yaml(:

mailer:
from: no-reply@***.com
transport: smtp
host: smtp.ionos.fr
user: bonjour@***.com
password: ***
port: 587
auth: true
encryption:

表单模块被配置为在Cockpit中记录数据,但也可以在添加新记录后立即向我发送电子邮件(用通俗易懂的语言,只要用户单击表单上的提交按钮(。这就是为什么我必须用这些信息创建config/config.yaml文件。

一切都很完美。数据在驾驶舱里记录得很好,我收到了电子邮件。

但我有个问题。

我想更改电子邮件的主题。目前,当我收到一封电子邮件时,主题是:";"联系人"的新表单数据;。

在modules/Forms/bootstrap.php文件的第325行…我发现了这个:

$response = $this->app->mailer->mail($frm['email_forward'], $options['subject'] ?? "New form data for: {$formname}", $body, $options);

因此,正是在这个文件中管理电子邮件的主题。因此,从理论上讲,可以通过一个选项来修改电子邮件的主题。

问题是,我不知道该如何发送这些信息。

我已经尝试将信息添加到config/config.yaml文件中,但它不起作用。像这样:

mailer:
from: no-reply@***.com
subject: test /* <= I added this information */
transport: smtp
host: smtp.ionos.fr
user: bonjour@***.com
password: ***
port: 587
auth: true
encryption:

在这个页面上,它表明有必要创建一个名为"的隐藏字段__邮件主题";并且以期望的主题作为价值。问题是我使用的是React JS(+axios(,而不是PHP(无法访问:$_REQUEST、$_POST…(

这是我的React组件的代码

import React, { Component } from "react";
import axios from "axios";
class Form extends Component {

constructor(props) {
super(props);
this.onChangeName = this.onChange.bind(this);
this.onChangeEmail = this.onChange.bind(this);
this.onChangeMessage = this.onChange.bind(this);
this.onSubmitForm = this.onSubmitForm.bind(this);
this.state = {
name: '',
email: '',
message: ''
}
}

onChange(e) {
this.setState({ [e.target.name]: e.target.value })
}
onSubmitForm(e) {
e.preventDefault()
const dataForm = {
"form": {
name: this.state.name,
email: this.state.email,
message: this.state.message
}
};

axios
.post('http://dev.site.com/api/forms/submit/contact?token=XXX', dataForm)
.then((res) => {console.log(res.data)} )
.catch((error) => {console.log(error)} );
this.setState({
name: '', 
email: '', 
message: ''
})
}

render() {
return (
<>
<div className="form">
<div className="title">{this.props.title}</div> 
<div className="content">
<form onSubmit={this.onSubmitForm}>                         
<label htmlFor="name">Your name :</label>
<input name="name" value={this.state.name} onChange={this.onChangeName} type="text" />

<label htmlFor="email">Your email :</label>
<input name="email" value={this.state.email} onChange={this.onChangeEmail} type="text" />

<label htmlFor="message">Your message :</label>
<textarea name="message" value={this.state.message} onChange={this.onChangeMessage}></textarea>

<input type="submit" value="Submit" />
</form>
</div>
</div>
</>
);
}
}
export default Form;

我试过了。但它不起作用:

const dataForm = {
"form": {
__mailsubject: "test",
name: this.state.name,
email: this.state.email,
message: this.state.message
}
};

PS:我稍后会使用Formik和Yup来创建和验证表单。

除了直接更改modules/Forms/bootstrap.php文件外,我不知道如何才能实现我想要的!但这不是一个好的解决方案,因为它会在更新过程中给我带来问题!

唯一的解决方案是使用表单模板,比如这里?

一个主意?

为了更新邮件主题,您需要将值作为参数而不是表单数据传递。

根据你的要求,你应该有这样的东西:

axios
.post('http://dev.site.com/api/forms/submit/contact?token=XXX&__mailsubject=My email subject', dataForm)
.then((res) => {console.log(res.data)})
.catch((error) => {console.log(error)})

这方面的代码可以在modules/Forms/Controller/RestApi.php上看到

if ($this->param('__mailsubject')) {
$options['subject'] = $this->param('__mailsubject');
}

这意味着它将只检查作为参数值的__mailsubject,而不是作为表单数据值。

最新更新