-
-
Save jacksleight/04fdc8c1f8d827313a68261ac94f34fa to your computer and use it in GitHub Desktop.
<?php | |
use Statamic\Tags\Loader; | |
use Statamic\View\Antlers\Parser; | |
if (! function_exists('statamic_form')) { | |
function statamic_form($handle, $params = []) | |
{ | |
$form = Form::find($handle); | |
$html = app(Loader::class)->load('form', [ | |
'parser' => app(Parser::class), | |
'params' => $params, | |
'content' => '', | |
'context' => [], | |
'tag' => "form:{$handle}", | |
'tag_method' => $handle, | |
])->$handle(); | |
preg_match('/^<form (.*?)>(.*?)<\/form>$/is', $html, $match); | |
return [ | |
'handle' => $handle, | |
'attrs' => $match[1], | |
'params' => $match[2], | |
'errors' => optional(session()->get('errors'))->getBag("form.{$handle}"), | |
'success' => session("form.{$handle}.success"), | |
'fields' => $form->fields(), | |
'honeypot' => $form->honeypot(), | |
]; | |
} | |
} |
@php | |
$form = statamic_form('contact', [ | |
'redirect' => url('thank-you'), | |
]); | |
@endphp | |
<div> | |
@if ($form['success']) | |
<x-success :message="$form['success']" /> | |
@else | |
<x-errors :errors="$form['errors']" /> | |
<form {!! $form['attrs'] !!}> | |
<div class="space-y-4"> | |
@foreach ($form['fields'] as $field) | |
<label> | |
{{ $field->display() }} | |
</label> | |
@if ($field->type() === 'text') | |
<input name="{{ $field->handle() }}" type="text"> | |
@elseif ($field->type() === 'select') | |
<select name="{{ $field->handle() }}"> | |
@foreach ($field->get('options') as $option) | |
{{-- ... --}} | |
@endforeach | |
</select> | |
@else | |
{{-- ... --}} | |
@endif | |
@endforeach | |
<button>Send Message</button> | |
</div> | |
{!! $form['params'] !!} | |
<input name="{!! $form['honeypot'] !!}"> | |
</form> | |
@endif | |
</div> |
Ohh, I didnt realize those are methods, it makes sense now. Thank you Jack!
No problem. I've updated the gist with a more complete example of how to use this as well.
Awesome! Appreciate the help! :)
One thing I missed, you can also use $field->type()
, $field->display()
and $field->get('key')
as a shortcut for $field->config()['key']
.
That makes it look a lot cleaner in templates, thank you :) This is a great workaround to use forms with Blade and have it fully customisable at the same time.
Thanks Jack, really helpful!
@markverg You’re welcome!
FYI: As of 3.3.28 you can now get this data from the built-in form tag. 👍
@markverg You’re welcome!
FYI: As of 3.3.28 you can now get this data from the built-in form tag. 👍
Thanks, we were on 3.3.25 but looking at the commit I did notice it's now in 3.3.28 so will upgrade right away.
One more thing (sorry)..
I noticed after a submit the field values are missing, I try to put back the values in case of errors so the user can just correct the field(s) and re-submit. Is that just me or is that fixed when using the 3.3.28 native way?
The old values seem to work, so switching to the now native function.
Thanks a lot for all your work!!
Ah yeah, you need to use the
handle
andconfig
methods: