OctoberCMS Post Form
Solution 1
You goto the CMS section in your backend and paste that into the Code section of the default.htm layout. I already answered this question in the OctoberCMS.com forum. You can read about it here. Make sure that whatever form you use this on has a data-request="onSend"
else it will not work. This is how it would ultimately look like...
Solution 2
You can add the Form's HTML either in your component partials directory, Theme's partial directory or just add it directly to any page / layout. It does not really matter.
Read more about including Partials
{% partial "contact-form.htm" %}
Or
{% partial __SELF__ ~ "::contact-form.htm" %} // reference to component's partial
October's AJAX framework requires the use of the JavaScript API or data attributes. It is fine how you are doing it in the example but forgot to add the Component's Name before the onSend Handler
data-request="SendEmails::onSend"
Where SendEmails
= Component Name or Alias given in the page, if the form is in the component's partial just use {{ __SELF__ }}::onSend
or with the JavaScript API, just do :
$.request('onSend', {
data:{email:email, message:message, name:name},
success: function (data) {
//
},
error:function(e){
//
}
});
then in the component handling the request create a function 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;
}
}
}
}
T2T
Updated on June 04, 2022Comments
-
T2T almost 2 years
My form:
<form id="main-contact-form" name="contact-form" ata-request="onSend" data-request-success="alert('Message Sent')">
I cant seem to get a form to post; where do I place this file? Which file do I edit to make it send the form data fields to my email? I have already setup the backend mail settings:
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; }