All Projects → protonemedia → Laravel Form Components

protonemedia / Laravel Form Components

Licence: mit
A set of Blade components to rapidly build forms with Tailwind CSS (v1.0 and v2.0) and Bootstrap 4. Supports validation, model binding, default values, translations, Laravel Livewire, includes default vendor styling and fully customizable!

Projects that are alternatives of or similar to Laravel Form Components

Admin One Laravel Dashboard
Admin One — Free Laravel Dashboard (Bulma Buefy Vue.js SPA)
Stars: ✭ 94 (-68.14%)
Mutual labels:  laravel, laravel-package, laravel-framework
Bs Stepper
A stepper for Bootstrap 4.x
Stars: ✭ 261 (-11.53%)
Mutual labels:  bootstrap, bootstrap4, bootstrap-4
Employee Mgmt Laravel5.4 Adminlte
The project is using laravel 5.4 and adminlte
Stars: ✭ 141 (-52.2%)
Mutual labels:  laravel, laravel-framework, bootstrap4
Laraupdater
Enable Laravel App Self-Update. Allow your Laravel Application to auto-update itself.
Stars: ✭ 75 (-74.58%)
Mutual labels:  laravel, laravel-package, laravel-framework
Auth Tests
Always-current tests for Laravel's authentication system. Curated by the community.
Stars: ✭ 230 (-22.03%)
Mutual labels:  laravel, laravel-package, laravel-framework
Laravel Schedulable
Schedule and unschedule eloquent models elegantly without cron jobs
Stars: ✭ 78 (-73.56%)
Mutual labels:  laravel, laravel-package, laravel-framework
Laravel Bootstrap Components
Bootstrap components as Laravel components
Stars: ✭ 190 (-35.59%)
Mutual labels:  laravel, laravel-package, bootstrap
Framework
An eCommerce administration built with Laravel 7 for create and manage online shop with multi-vendor.
Stars: ✭ 56 (-81.02%)
Mutual labels:  laravel, laravel-package, tailwindcss
Borgert Cms
Borgert is a CMS Open Source created with Laravel Framework 5.6
Stars: ✭ 298 (+1.02%)
Mutual labels:  laravel, laravel-framework, bootstrap4
Wagonwheel
Offer an online version of your Laravel emails to users.
Stars: ✭ 224 (-24.07%)
Mutual labels:  laravel, laravel-package, laravel-framework
Startbootstrap Business Casual
A Bootstrap HTML theme for business websites - created by Start Bootstrap
Stars: ✭ 266 (-9.83%)
Mutual labels:  bootstrap, bootstrap4, bootstrap-4
Laravel User Activity
Monitor user activity easily!
Stars: ✭ 253 (-14.24%)
Mutual labels:  laravel, laravel-package, laravel-framework
Pingcrm Svelte
🦊 Ping CRM Svelte - A demo app to illustrate how Inertia.js works with Laravel and Svelte (hosted on a heroku free dyno).
Stars: ✭ 74 (-74.92%)
Mutual labels:  laravel, laravel-framework, tailwindcss
Dropzone Laravel Image Upload
Laravel 5.2 and Dropzone.js auto image uploads with removal links
Stars: ✭ 92 (-68.81%)
Mutual labels:  laravel, laravel-package, laravel-framework
Backup
MySQL Database backup package for Laravel
Stars: ✭ 66 (-77.63%)
Mutual labels:  laravel, laravel-package, laravel-framework
Pingcrm React
⚛️ Ping CRM React - A demo app to illustrate how Inertia.js works with Laravel and React (hosted on a heroku free dyno).
Stars: ✭ 158 (-46.44%)
Mutual labels:  laravel, laravel-framework, tailwindcss
Laravel Compass
A REST client inside your Laravel app
Stars: ✭ 1,002 (+239.66%)
Mutual labels:  laravel, laravel-package, laravel-framework
Laravel Settings
Simple Settings package for a laravel application
Stars: ✭ 45 (-84.75%)
Mutual labels:  laravel, laravel-package, bootstrap
Blogetc
Easily add a full Laravel blog (with built in admin panel and public views) to your laravel project with this simple package.
Stars: ✭ 198 (-32.88%)
Mutual labels:  laravel, laravel-package, laravel-framework
Laravel Gitscrum
GitScrum is a Project Management Tool, developed to help entrepreneurs, freelancers, managers, and teams Skyrocket their Productivity with the Agile methodology and Gamification.
Stars: ✭ 2,686 (+810.51%)
Mutual labels:  laravel, laravel-package, laravel-framework

Laravel Form Components

Latest Version on Packagist Build Status Quality Score Total Downloads Buy us a tree

A set of Blade components to rapidly build forms with Tailwind CSS v1, Tailwind CSS v2 and Bootstrap 4. Supports validation, model binding, default values, translations, includes default vendor styling and fully customizable!

... 👀 There's a Pro version of this package in development: check out formcomponents.pro!

📺 Want to see this package in action? Join the live stream on November 19 at 14:00 CET: https://youtu.be/7eNZS4U7xyM

Features

  • Components for input, textarea, select, multi-select, checkbox and radio elements.
  • Support for Tailwind v1 with Tailwind CSS Custom Forms.
  • Support for Tailwind v2 with Tailwind Forms.
  • Support for Bootstrap 4 Forms.
  • Component logic independent from Blade views, the Tailwind and Bootstrap views use the same logic.
  • Bind a target to a form (or a set of elements) to provide default values (model binding).
  • Support for Laravel Livewire v2.
  • Support for Spatie's laravel-translatable.
  • Re-populate forms with old input.
  • Validation errors.
  • Form method spoofing.
  • Components classes and Blade views fully customizable.
  • Support for prefixing the components.

Requirements

  • PHP 7.4 + Laravel 7.0 and higher

Support

We proudly support the community by developing Laravel packages and giving them away for free. Keeping track of issues and pull requests takes time, but we're happy to help! If this package saves you time or if you're relying on it professionally, please consider supporting the maintenance and development.

Installation

You can install the package via composer:

composer require protonemedia/laravel-form-components

If you're using Tailwind, make sure the right plugin (v1 or v2) is installed and configured.

Quick example

<x-form>
    @bind($user)
        <x-form-input name="last_name" label="Last Name" />
        <x-form-select name="country_code" :options="$options" />
        <x-form-select name="interests[]" :options="$multiOptions" label="Select your interests" multiple />

        <!-- \Spatie\Translatable\HasTranslations -->
        <x-form-textarea name="biography" language="nl" placeholder="Dutch Biography" />
        <x-form-textarea name="biography" language="en" placeholder="English Biography" />

        <!-- Inline radio inputs -->
        <x-form-group name="newsletter_frequency" label="Newsletter frequency" inline>
            <x-form-radio name="newsletter_frequency" value="daily" label="Daily" />
            <x-form-radio name="newsletter_frequency" value="weekly" label="Weekly" />
        </x-form-group>

        <x-form-group>
            <x-form-checkbox name="subscribe_to_newsletter" label="Subscribe to newsletter" />
            <x-form-checkbox name="agree_terms" label="Agree with terms" />
        </x-form-group>

        <x-form-submit />
    @endbind
</x-form>

Preface

Generating HTML in PHP is always quite opinionated and limited. Blade Components are great because additional attributes are passed down to the element. That's why we prefer writing forms using components instead of using PHP builders. This way, you don't have to write extensions or custom code for any attribute you pass in. Let's take a look at this x-form example.

The action attribute is optional, but you can pass a hard-coded, primitive value to the component using a simple HTML attribute. PHP expressions and variables can be passed to the component as well via attributes that use the : character as a prefix. Do you need Alpine.js or VueJS directives? No problem!

<x-form action="/api/user">
    <!-- ... -->
</x-form>
<x-form :action="route('api.user.store')" v-on:submit="checkForm">
    <!-- ... -->
</x-form>

Configuration

You can switch frameworks by updating the framework setting in the form-components.php configuration file. Use the artisan vendor:publish command to publish the configuration file.

return [
    'framework' => 'bootstrap-4',
];

No further configuration is needed unless you want to customize the Blade views and components.

Usage

Input and textarea elements

The minimum requirement for an input or textarea is the name attribute.

<x-form-input name="company_name" />

Optionally you can add a label attribute, which can be computed as well.

<x-form-input name="company_name" label="Company name" />
<x-form-input name="company_name" :label="trans('forms.company_name')" />

You can also choose to use a placeholder instead of a label, and of course you can change the type of the element.

<x-form-input type="email" name="current_email" placeholder="Current email address" />

By default every element shows validation errors but you can hide them if you want.

<x-form-textarea name="description" :show-errors="false" />

Default value and binds

You can use the default attribute to specify the default value of the element.

<x-form-textarea name="motivation" default="I want to use this package because..." />

Binding a target

Instead of setting a default value, you can also pass in a target, like an Eloquent model. Now the component will get the value from the target by the name.

<x-form-textarea name="description" :bind="$video" />

In the example above, where $video is an Eloquent model, the default value will be $video->description.

Binding a target to multiple elements

You can also bind a target by using the @bind directive. This will bind the target to all elements until the @endbind directive.

<x-form>
    @bind($video)
        <x-form-input name="title" label="Title" />
        <x-form-textarea name="description" label="Description" />
    @endbind
</x-form>

You can even mix targets!

<x-form>
    @bind($user)
        <x-form-input name="full_name" label="Full name" />

        @bind($userProfile)
            <x-form-textarea name="biography" label="Biography" />
        @endbind

        <x-form-input name="email" label="Email address" />
    @endbind
</x-form>

Override or remove a binding

You can override the @bind directive by passing a target directly to the element using the :bind attribute. If you want to remove a binding for a specific element, pass in false.

<x-form>
    @bind($video)
        <x-form-input name="title" label="Title" />
        <x-form-input :bind="$videoDetails" name="subtitle" label="Subtitle" />
        <x-form-textarea :bind="false" name="description" label="Description" />
    @endbind
</x-form>

Laravel Livewire

You can use the @wire and @endwire directives to bind a form to a Livewire component. Let's take a look at the ContactForm example from the official Livewire documentation.

use Livewire\Component;

class ContactForm extends Component
{
    public $name;
    public $email;

    public function submit()
    {
        $this->validate([
            'name' => 'required|min:6',
            'email' => 'required|email',
        ]);

        Contact::create([
            'name' => $this->name,
            'email' => $this->email,
        ]);
    }

    public function render()
    {
        return view('livewire.contact-form');
    }
}

Normally you would use a wire:model attribute to bind a component property with a form element. By using the @wire directive, this package will automatically use the wire:model attribute instead of the name attribute.

<x-form wire:submit.prevent="submit">
    @wire
        <x-form-input name="name" />
        <x-form-input name="email" />
    @endwire

    <x-form-submit>Save Contact</x-form-submit>
</form>

Additionally, you can pass an optional modifier to the @wire directive. This feature was added in v2.4.0. If you're upgrading from a previous version and you published the Blade views, you should republish them or update them manually.

<x-form wire:submit.prevent="submit">
    @wire('debounce.500ms')
        <x-form-input name="email" />
    @endwire
</form>

Select elements

Besides the name attribute, the select element has a required options attribute, which should be a simple key-value array.

$countries = [
    'be' => 'Belgium',
    'nl' => 'The Netherlands',
];
<x-form-select name="country_code" :options="$countries" />

You can provide a slot to the select element as well:

<x-form-select name="country_code">
   <option value="be">Belgium</option>
   <option value="nl">The Netherlands</option>
</x-form-select>

If you want a select element where multiple options can be selected, add the multiple attribute to the element. If you specify a default, make sure it is an array. This applies to bound targets as well.

<x-form-select name="country_code[]" :options="$countries" multiple :default="['be', 'nl']" />

Using Eloquent relationships

This package has built-in support for BelongsToMany, MorphMany, and MorphToMany relationships. To utilize this feature, you must add both the multiple and many-relation attribute to the select element.

In the example below, you can attach one or more tags to the bound video. By using the many-relation attribute, it will correctly retrieve the selected options (attached tags) from the database.

<x-form>
    @bind($video)
        <x-form-select name="tags[]" :options="$tags" multiple many-relation />
    @endbind
</x-form>

Checkbox elements

Checkboxes have a default value of 1, but you can customize it as well.

<x-form-checkbox name="subscribe_to_newsletter" label="Subscribe to newsletter" />

If you have a fieldset of multiple checkboxes, you can group them together with the form-group component. This component has an optional label attribute and you can set the name as well. This is a great way to handle the validation of arrays. If you disable the errors on the individual checkboxes, it will one show the validation errors once. The form-group component has a show-errors attribute that defaults to true.

<x-form-group name="interests" label="Pick one or more interests">
    <x-form-checkbox name="interests[]" :show-errors="false" value="laravel" label="Laravel" />
    <x-form-checkbox name="interests[]" :show-errors="false" value="tailwindcss" label="Tailwind CSS" />
</x-form-group>

Radio elements

Radio elements behave exactly the same as checkboxes, except the show-errors attribute defaults to false as you almost always want to wrap multiple radio elements in a form-group.

You can group checkbox and radio elements on the same horizontal row by adding an inline attribute to the form-group element.

<x-form-group name="notification_channel" label="How do you want to receive your notifications?" inline>
    <x-form-radio name="notification_channel" value="mail" label="Mail" />
    <x-form-radio name="notification_channel" value="slack" label="Slack" />
</x-form-group>

When you're not using target binding, you can use the default attribute to mark a radio element as checked:

<x-form-group name="notification_channel" label="How do you want to receive your notifications?">
    <x-form-radio name="notification_channel" value="mail" label="Mail" default />
    <x-form-radio name="notification_channel" value="slack" label="Slack" />
</x-form-group>

Old input data

When a validation errors occurs and Laravel redirects you back, the form will be re-populated with the old input data. This old data will override any binding or default value.

Handling translations

This package supports spatie/laravel-translatable out of the box. You can add a language attribute to your element.

<x-form-input name="title" language="en" :bind="$book" />

This will result in the following HTML:

<input name="title[en]" value="Laravel: Up & Running" />

To get the validation errors from the session, the name of the input will be mapped to a dot notation like title.en. This is how old input data is handled as well.

Customize the blade views

Publish the configuration file and Blade views with the following command:

php artisan vendor:publish --provider="ProtoneMedia\LaravelFormComponents\Support\ServiceProvider"

You can find the Blade views in the resources/views/vendor/form-components folder. Optionally, in the form-components.php configuration file, you can change the location of the Blade view per component.

Component logic

You can bind your own component classes to any of the elements. In the form-components.php configuration file, you can change the class per component. As the logic for the components is quite complex, it is strongly recommended to duplicate the default component as a starting point and start editing. You'll find the default component classes in the vendor/protonemedia/laravel-form-components/src/Components folder.

Prefix the components

You can define a prefix in the form-components.php configuration file.

return [
    'prefix' => 'tailwind',
];

Now all components can be referenced like so:

<x-tailwind-form>
    <x-tailwind-form-input name="company_name" />
</x-tailwind-form>

Error messages

By the default, the errors messages are positioned under the element. To show these messages, we created a FormErrors component. You can manually use this component as well. The element takes an optional bag attribute to specify the ErrorBag, which defaults to default.

<x-form>
    <x-form-input name="company_name" :show-errors="false" />

    <!-- other elements -->

    <x-form-errors name="company_name" />

    <x-form-errors name="company_name" bag="register" />
</x-form>

Submit button

The label defaults to Submit but you can use the slot to provide your own content.

<x-form-submit>
    <span class="text-green-500">Send</span>
</x-form-submit>

Bootstrap 4

You can switch to Bootstrap 4 by updating the framework setting in the form-components.php configuration file.

return [
    'framework' => 'bootstrap-4',
];

There is a little bit of styling added to the form.blade.php view to add support for inline form groups. If you want to change it or remove it, publish the assets and update the view file.

Input prepend and append

In addition to the Tailwind features, there is also support for input groups. Use the prepend and append slots to provide the contents.

<x-form-input name="username" label="Username">
    @slot('prepend')
        <span>@</span>
    @endslot
</x-form-input>

<x-form-input name="subdomain" label="Subdomain">
    @slot('append')
        <span>.protone.media</span>
    @endslot
</x-form-input>

Help text

You can add block-level help text to any element by using the help slot.

<x-form-input name="username" label="Username">
    @slot('help')
        <small class="form-text text-muted">
            Your username must be 8-20 characters long.
        </small>
    @endslot
</x-form-input>

Testing

composer test

Changelog

Please see CHANGELOG for more information about what has changed recently.

Contributing

Please see CONTRIBUTING for details.

Other Laravel packages

  • Laravel Analytics Event Tracking: Laravel package to easily send events to Google Analytics.
  • Laravel Blade On Demand: Laravel package to compile Blade templates in memory.
  • Laravel Cross Eloquent Search: Laravel package to search through multiple Eloquent models.
  • Laravel Eloquent Scope as Select: Stop duplicating your Eloquent query scopes and constraints in PHP. This package lets you re-use your query scopes and constraints by adding them as a subquery.
  • Laravel Eloquent Where Not: This Laravel package allows you to flip/invert an Eloquent scope, or really any query constraint.
  • Laravel FFMpeg: This package provides an integration with FFmpeg for Laravel. The storage of the files is handled by Laravel's Filesystem.
  • Laravel Paddle: Paddle.com API integration for Laravel with support for webhooks/events.
  • Laravel Verify New Email: This package adds support for verifying new email addresses: when a user updates its email address, it won't replace the old one until the new one is verified.
  • Laravel WebDAV: WebDAV driver for Laravel's Filesystem.

Security

If you discover any security related issues, please email [email protected] instead of using the issue tracker.

Credits

License

The MIT License (MIT). Please see License File for more information.

Treeware

This package is Treeware. If you use it in production, then we ask that you buy the world a tree to thank us for our work. By contributing to the Treeware forest you’ll be creating employment for local families and restoring wildlife habitats.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].