# User:Profile_Form

## Overview

User tags are designed for sites that have areas or features behind a login. The `user:profile_form` tag helps you build a user profile edit form for existing users based on your user [Blueprint](/blueprints.md).

The tag will render the opening and closing `<form>` HTML elements for you.

### Example

A basic profile edit form, with validation errors.

::tabs

::tab antlers
```antlers
{{ user:profile_form }}

    {{ if errors }}
        <div class="bg-red-300 text-white p-2">
            {{ errors }}
                {{ value }}<br>
            {{ /errors }}
        </div>
    {{ /if }}

    {{ if success }}
        <div class="bg-green-300 text-white p-2">
            {{ success }}<br>
        </div>
    {{ /if }}

    <label>Email</label>
    <input type="email" name="email" value="{{ old:email }}" />

    <label>Bio</label>
    <textarea name="bio">{{ old:bio }}</textarea>

    <label>Job Title</label>
    <input type="text" name="title" value="{{ old:title }}" />

    <button type="submit">Save</button>

{{ /user:profile_form }}
```
::tab blade
```blade

```
::

## Blueprints Fields

You may add edit fields for any that exist in the `user.yaml` blueprint.

Any submitted data that does _not_ exist in the blueprint will be completely ignored.

Additional fields will be validated as per your blueprint `validate` rules.

:::tip Note
The `user:profile_form` tag doesn't currently support uploading Assets.
:::

## Dynamic Rendering

Instead of hardcoding individual fields, you may loop through the `fields` array to render fields more dynamically.


::tabs

::tab antlers
```antlers
{{ fields }}
    <div class="p-2">
        <label>{{ display }}</label>
        <div class="p-1">{{ field }}</div>
        {{ if error }}
            <p class="text-gray-500">{{ error }}</p>
        {{ /if }}
    </div>
{{ /fields }}
```
::tab blade
```blade
<s:user:profile_form>

  @foreach ($fields as $field)
    <div class="p-2">
      <label>{{ $field['display'] }}</label>
      <div class="p-1">{!! $field['field'] !!}</div>
      @if ($field['error'])
        <p class="text-gray-500">{{ $field['error'] }}</p>
      @endif
    </div>
  @endforeach

</s:user:profile_form>
```
::

Each item in the `fields` array contains `type`, `display` and `handle`, which are configurable from the `user` blueprint.

You will also find the field's `old` input on unsuccessful submission, as well as an `error` message when relevant.

Finally, the `field` value contains a pre-rendered form input.  Using this will intelligently render inputs as inputs, textareas as textareas, and snozzberries as snozzberries.  You can customize these pre-rendered templates by running `php artisan vendor:publish --tag=statamic-forms`, which will expose editable templates in your `views/vendor/statamic/forms/fields` folder.

## Precognition

The profile update endpoint supports [Laravel Precognition](https://laravel.com/docs/precognition) for live, server-driven validation against your user blueprint's `validate` rules. See [Precognition for User Forms](/forms.md#user-forms) for setup and a full example. Post to `/!/auth/profile` and seed the `$form` data object with the user's current values.

