-
-
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> |
Sure, here's a (slightly cut down) example:
@php
$form = statamic_form($handle, [
'redirect' => url()->current() . "#form-{$handle}",
'error_redirect' => url()->current() . "#form-{$handle}",
]);
@endphp
<div>
@if ($form['success'])
<x-success>Thank you, your message has been sent successfully.</x-success>
@else
<x-errors :errors="$form['errors']" />
<form {!! $form['attrs'] !!} id="form-{{ $form['handle'] }}">
<div class="space-y-4">
@foreach ($form['fields'] as $field)
{{-- ... --}}
@endforeach
<x-button>Send Message</x-button>
</div>
{!! $form['params'] !!}
<input name="{!! $form['honeypot'] !!}">
</form>
@endif
</div>
Thank you! I had something similar so I am definitely on a good path, however every time I am trying to access any field attributes within the loop I am getting this error.
Cannot access protected property Statamic\Fields\Field::$config
@foreach ($form['fields'] as $field)
{{ $field->handle }}
@endforeach
Ah yeah, you need to use the handle
and config
methods:
{{ $field->handle() }}
{{ $field->config()['type'] }}
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!!
Hi Jack, is it possible to show me the blade template where you use this? I am trying to build a form from this it seems too difficult which made me think I am doing something wrong and there is an easier way.