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