2015-04-02 113 views
7

我的形式:OctoberCMS帖子表格

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

回答

5

請參閱文檔: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" %} 
+0

我不認爲這是一個好主意,只是發送一個表單插件。這是一項非常簡單的任務,因此您可以使用10月後端CMS部分添加代碼。 – 2015-04-02 20:21:21

2

您在後端獲取了CMS部分,然後將其粘貼到代碼部分default.htm佈局。我已經在OctoberCMS.com論壇上回答了這個問題。你可以閱讀關於它here。確保你使用的任何表格有data-request="onSend",否則它將不起作用。這是怎麼最終會看起來像......

enter image description here

+0

在通過郵件模板發送測試郵件和實際表單上發生ajax錯誤時,我收到此錯誤。 在「

名稱:{{name}}」模板的渲染過程中出現異常(「Illuminate \ Mail \ Message對象無法轉換爲字符串」)

Subject:{{subject}}

消息:{{message}}

「在第1行。 – T2T 2015-04-08 11:00:50

+0

Ah這個錯誤表示消息變量不包含字符串。您的郵件模板期望所有的樹枝標籤都是字符串。確保一個字符串被傳遞,而不是一個數組或其他類型的對象 – 2015-04-09 12:31:36

+0

是否有可能創建一個八巴斯基主題的聯繫表單,而無需插件組件,如果有的話,你會如何處理這個問題? – 2017-05-21 21:45:08

2

您可以添加窗體的HTML無論是在你的組件的諧音目錄,主題的部分目錄,或直接將其添加到任何網頁/佈局。這真的不要緊。

瞭解更多關於包括Partials

{% partial "contact-form.htm" %} 

或者

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

月的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('[email protected]', '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; 
      } 
     } 
    } 

}