十月CMS发布表单

10

我的表单:

<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;
}
3个回答

9
请参考文档:插件组件。您可以创建一个组件(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" %}

我认为制作一个仅用于发送表单的插件并不是一个好主意。这是一个非常简单的任务,因此您可以使用October后端CMS部分来添加代码。 - Saifur Rahman Mohsin

4
您需要前往后端的CMS部分,并将其粘贴到default.htm布局的Code部分。我已经在OctoberCMS.com论坛中回答了这个问题,您可以在这里阅读相关内容。请确保您在使用此表格时添加了data-request="onSend",否则它将无法正常工作。以下是最终的效果...

当通过邮件模板发送测试消息时,我收到了此错误,并在实际表单上收到了一个ajax错误。在第1行的"<p>Name: {{name}}</p><p>Subject: {{subject}}</p><p>Message: {{message}}</p>"处,在模板渲染期间抛出了异常(“无法将Illuminate\Mail\Message类的对象转换为字符串”)。 - T2T
啊,这个错误意味着消息变量不是一个字符串。你的邮件模板期望所有的Twig标签都是字符串。确保传递的是一个字符串,而不是数组或其他类型的对象。 - Saifur Rahman Mohsin
是否可以在Octaskin主题中创建联系表单而不制作插件组件?如果可以,您会如何处理? - Artful_dodger
这就是我在这里所做的。在标记部分放置所需的表单。不要使用action =“”,而是使用OctoberCMS的data-handler =“onSend”,然后转到代码部分并按照我的答案中所示实现代码。 - Saifur Rahman Mohsin
那么recpatcha验证呢?使用data-request="{{ __SELF__ }}::onFormSubmit"可以工作,但是使用data-request="onSend"就不行了... - Kuzma
你也可以在同一个 onSend 处理程序中编写 recaptcha 验证。毕竟,recaptcha 只是另一个 POST 字段,在验证其他字段之前需要在服务器端进行验证。至于 {{ __SELF__ }} 的整个部分,我认为您可能正在组件内使用处理程序?我给出的示例是针对常规的OctoberCMS页面。 - Saifur Rahman Mohsin

2
您可以将表单的HTML代码添加到组件partials目录、主题的partials目录或直接添加到任何页面/布局中。这并不重要。
了解更多关于包含Partials的信息。
{% partial "contact-form.htm" %} 

或者

{% partial __SELF__ ~ "::contact-form.htm" %} // reference to component's partial

十月的AJAX框架需要使用JavaScript API或数据属性。你在示例中的做法很好,但忘记在onSend处理程序之前添加组件名称了。
data-request="SendEmails::onSend" 

"Where 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;
            }
        }
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接