十月CMS发布表格
Posted
技术标签:
【中文标题】十月CMS发布表格【英文标题】:OctoberCMS Post Form 【发布时间】:2015-06-07 05:33:39 【问题描述】:我的表格:
<form id="main-contact-form" name="contact-form" ata-request="onSend" data-request-success="alert('Message Sent')">
我似乎无法获得要发布的表格;我在哪里放置这个文件?我要编辑哪个文件以使其将表单数据字段发送到我的电子邮件?我已经设置了后端邮件设置:
function onSend()
// Collect input
$name = post('name');
$email = post('email');
$message = post('message');
// Submit form
$to = System\Models\MailSettings::get('sender_email');
$params = compact('name','email');
Mail::sendTo($to, 'temp.website::mail.newrequest', $params);
return true;
【问题讨论】:
【参考方案1】:您可以在组件部分目录、主题的部分目录中添加表单的 html,或者直接将其添加到任何页面/布局。没关系。
阅读更多关于包括Partials
% partial "contact-form.htm" %
或者
% partial __SELF__ ~ "::contact-form.htm" % // reference to component's partial
October 的 AJAX 框架需要使用 javascript API 或数据属性。您在示例中的操作方式很好,但忘记在 onSend 处理程序之前添加组件的名称
data-request="SendEmails::onSend"
其中SendEmails
= 页面中给出的组件名称或别名,如果表单在组件的部分中,则使用 __SELF__ ::onSend
或使用 JavaScript API,只需:
$.request('onSend',
data:email:email, message:message, name:name,
success: function (data)
//
,
error:function(e)
//
);
然后在处理请求的组件中创建一个函数onSend
:
<?php namespace AuthorName\PluginName\Components;
use Cms\Classes\ComponentBase;
use Mail;
use Url;
use Input;
use Request;
use Response;
use ApplicationException;
use Validator;
use ValidationException;
class SendEmails extends ComponentBase
public function onSend()
if (Request::ajax())
try
$data = post();
// Quick Validation rules for E-mail, Name & Message
if (!array_key_exists('email', $data))
$data['email'] = post('email');
if (!array_key_exists('norad', $data))
$data['message'] = post('message');
if (!array_key_exists('name', $data))
$data['name'] = post('name');
$rules = [
'email' => 'required|email|between:6,255',
'name' => 'required|between:4,255'
//..
];
$validation = Validator::make($data, $rules);
if ($validation->fails())
throw new ValidationException($validation);
// Check if E-mail Template Exists @ "author.plugin::mail.templatename"
if (View::exists("author.plugin::mail.templatename"))
Mail::send("author.plugin::mail.templatename", $data, function ($message)
$message->from('noreply@yourdomain.com', 'Site Name');
$message->to($data['email'], $data['name']);
$message->subject('Subject here..');
);
// Handle Erros
if (count(Mail::failures()) > 0)
echo "Failed to send Mail "; // Handle Failure
else
// Mail sent
echo "Mail Sent!"; // Handle Success
catch (Exception $ex)
throw $ex;
【讨论】:
【参考方案2】:您转到后端的 CMS 部分并将其粘贴到 default.htm 布局的代码部分。我已经在 OctoberCMS.com 论坛上回答了这个问题。你可以阅读它here。确保您使用它的任何形式都有data-request="onSend"
,否则它将不起作用。这就是它最终的样子......
【讨论】:
我在通过邮件模板发送测试消息时收到此错误,并且在实际表单上出现 ajax 错误。在“名称:name
主题: subject
消息:message
”在第 1 行。 啊这个错误意味着消息变量不包含字符串。您的邮件模板要求所有的 twig 标签都是字符串。确保传递的是字符串,而不是数组或其他类型的对象 是否可以在不制作插件组件的情况下为 octaskin 主题创建联系表单,如果可以,您将如何处理? 这正是我在这里所做的。在标记部分放置您需要的表格。而不是 action="" 使用 OctoberCMS 的 data-handler="onSend" 然后转到代码部分并按照我的答案实现代码。 那么recpatcha
验证呢?使用data-request=" __SELF__ ::onFormSubmit"
,它可以工作,但使用data-request="onSend"
,它不会...【参考方案3】:
请参考文档:Plugin Components。
你可以创建一个组件(SomeForm.php
)
<?php namespace My\Plugin\Components;
use Cms\Classes\ComponentBase;
class SomeForm extends ComponentBase
public function componentDetails()
return [
'name' => 'Form',
'description' => 'Some form'
];
public function onSend()
// Collect input
$name = post('name');
$email = post('email');
$message = post('message');
// Submit form
$to = System\Models\MailSettings::get('sender_email');
$params = compact('name','email');
Mail::sendTo($to, 'temp.website::mail.newrequest', $params);
return true;
然后为它创建一个视图(例如default.htm
)
<form id="main-contact-form" name="contact-form" data-request=" __SELF__ ::onSend" data-request-success="alert('Message Sent')">
...
</form>
在页面/布局中的使用:
[someForm]
==
% component "someForm" %
【讨论】:
我认为制作插件只是为了发送表单不是一个好主意。这是一项微不足道的任务,因此您可以使用十月后端 CMS 部分添加代码..以上是关于十月CMS发布表格的主要内容,如果未能解决你的问题,请参考以下文章