【问题标题】:OctoberCMS Post Form十月CMS发布表格
【发布时间】: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;
}

【问题讨论】:

    标签: php ajax laravel sendmail octobercms


    【解决方案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 部分添加代码..
      猜你喜欢
      • 1970-01-01
      • 2021-03-26
      • 1970-01-01
      • 2017-05-22
      • 2016-05-18
      • 2018-02-28
      • 1970-01-01
      • 1970-01-01
      • 2018-04-22
      相关资源
      最近更新 更多