OctoberCMS Post Form

13,515

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...

enter image description here

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

}
Share:
13,515
T2T
Author by

T2T

Updated on June 04, 2022

Comments

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