- Mám HTML formulář, data odešle a přijme AJAX a samotnou validaci (a další úkony) vykoná funkce v pluginu (PHPčko)
- Pro správné fungování AJAXu je ho potřeba na stránku přidat:
{% framework %}
- nejlépe na konec<body>
tagu, kde se většinou nachází další skripty (aby se načítaly až potom, co se načte samotný obsah stránky)- ještě je možné includovat
{% framework extras %}
- zde se nachází další JavaScript skripty a stylování, které hlavně pomáhá front-end validaci formulářů
- ukazatel načítání, validace, validační výjimky, zobrazování errorů
- více zde: https://docs.octobercms.com/2.x/ajax/extras.html
- ještě je možné includovat
Formulář
<!-- specifikace funkce, která se zavolá v Pluginu (přidán přes {% component 'contactform' %} -->
<form data-request="onSend"
data-request-update="'form-message': '#message', 'form-message-name-error': '#nameError', 'form-message-email-error': '#emailError', 'form-message-content-error': '#contentError'"
data-request-redirect="/#kontakt"
data-request-complete="if(data.responseJSON['result'] === 'success'){document.getElementById('contactForm').reset()};"
class="form-wrap"
id="contactForm"
>
<label for="contact-name">Jméno a příjmení:</label><br>
<input type="text" id="contact-name" name="name" required><br>
<div class="err-message">{{ errors.first('name') }}</div>
<div id="nameError">{% partial 'form-message-name-error' %}</div>
<label for="contact-email">E-mail:</label><br>
<input type="text" id="contact-email" name="email" required><br>
<div id="emailError">{% partial 'form-message-email-error' %}</div>
<label for="contact-textarea">Text zprávy:</label><br>
<textarea id="contact-textarea" name="content" required></textarea><br>
<div id="contentError">{% partial 'form-message-content-error' %}</div>
<button type="submit" class="form-submit-btn">Odeslat</button>
<span id="message">{% partial 'form-message' %}</span>
</form>
Pluginová funkce onSend()
public function onSend()
{
$messages = [
'name.required' => 'Vaše jméno není vyplněné.',
'email.required' => 'Váš e-mail není vyplněný.',
'email.email' => 'Váš e-mail není validní e-mail.',
'content.required' => 'Vaše zpráva je prázdná.',
];
// jedná se o Octoberovský Validator -> use Validator;
$validator = Validator::make(
[
'name' => input('name'),
'email' => input('email'),
'content' => input('content'),
],
[
'name' => 'required',
'email' => 'required|email',
'content' => 'required',
],
$messages
);
if($validator->fails()) {
if(!empty($validator->errors()->get('name'))) {
$this->page['formMessageNameError'] = $validator->errors()->get('name')[0];
}
if(!empty($validator->errors()->get('email'))) {
$this->page['formMessageEmailError'] = $validator->errors()->get('email')[0];
}
if(!empty($validator->errors()->get('content'))) {
$this->page['formMessageContentError'] = $validator->errors()->get('content')[0];
}
// vrátí se jako objekt 'data', který nese spoustu informací ohledně Response z AJAXu, včetně responseJSON, kde je i tato dvojice (viz data-request-complete skript ve Formuláři výše)
return [
'result' => 'error',
];
}
else {
$vars = ['name' => input('name'), 'email' => input('email'), 'content' => input('content')];
$this->page['formMessage'] = "Děkujeme za zprávu, co nejdříve se Vám ozveme na Váš e-mail.";
Mail::send('externity.contact::mail.message', $vars, function($message) {
$message->to("test@email.com", 'Sender Name');
});
// posílám jen pro informaci, jak skončila validace, zpět na front-end
return [
'result' => 'success',
];
}
}
Partials
- partials, které používám na zobrazení error zpráv a potvrzovací zprávy jsou velmi jednoduché
- např. form-message-name-error.htm má obsah
{{ formMessageNameError }}
, stejně jako ostatní
Zajímavé odkazy
AJAX v Octoberu - načítání dat ze serveru bez page refreshe
Data Attributes API - attributy (nejen k <form>
elementu pro napojení na AJAX)