This is a Laravel >=5.5 package to help easily create CRUD (Create, Read, Update, Delete) forms for eloquent models (as well as an index page).
It aims to be used as a quick tool which does not interfere with the other parts of the application that it's used in., (*1)
The package provides:
- A trait to use in resource controllers and
- A series of views for displaying the forms, (*2)
The views are built using bootstrap (v3), but the styling can easily be overriden., (*3)
Installation
Composer
From the command line, run:, (*4)
composer require achillesp/laravel-crud-forms
Configuration
This package uses a config file which you can override by publishing it to your app's config dir., (*5)
php artisan vendor:publish --provider=Achillesp\CrudForms\CrudFormsServiceProvider --tag=config
Usage
To use the package, you need to use the trait Achillesp\CrudForms\CrudForms in your model's controller and define your routes.
The trait provides all the required methods for a Resource Controller, as well as a restore method in case of soft-deleted models., (*6)
Routes
If for example you have a Post model, you would define the routes:, (*7)
Route::resource('/posts', 'PostController');
Controller
Then in your PostController, you will need to use the trait and also define a constructor where you give the needed details of the model., (*8)
use App\Post;
use Achillesp\CrudForms\CrudForms;
class PostController extends Controller
{
use CrudForms;
public function __construct(Post $post)
{
$this->model = $post;
}
}
In the controller's constructor you can define the properties which are handled by the controller.
The available properties that can be defined are as follows., (*9)
The model
This is the model, which should be passed in the constructor through Dependency Injection., (*10)
This is an array of all the fields you need in the forms. Each field is declared as an array that has:
1. name: This is the model's attribute name, as it is in the database.
2. label: This is the field's label in the forms.
3. type: The type of the form input field that will be used. Accepted types are:
- text
- textarea
- email
- url
- password
- date
- select
- select_multiple
- checkbox
- checkbox_multiple
- radio
4. relationship: This is needed in case of a select, select_multiple, radio or checkbox_multiple buttons.
You can state here the name of the relationship as it is defined in the model.
In the example bellow, the Post model has a belongsTo relationship to category and a belongsToMany relationship to tags.
For belongsTo relationships you can use a select or a radio(group of radios) input.
For belongsToMany relationships you can use a select_multiple or checkbox_multiple inputs.
5. relFieldName: This is optional. It is used only in case we have a relationship, to set the name of the attribute of the related model that is displayed (ie. in a select's options).
If not defined, the default attribute to be used is name., (*11)
$this->formFields = [
['name' => 'title', 'label' => 'Title', 'type' => 'text'],
['name' => 'slug', 'label' => 'Slug', 'type' => 'text'],
['name' => 'body', 'label' => 'Enter your content here', 'type' => 'textarea'],
['name' => 'publish_on', 'label' => 'Publish Date', 'type' => 'date'],
['name' => 'published', 'label' => 'Published', 'type' => 'checkbox'],
['name' => 'category_id', 'label' => 'Category', 'type' => 'select', 'relationship' => 'category'],
['name' => 'tags', 'label' => 'Tags', 'type' => 'select_multiple', 'relationship' => 'tags'],
];
The indexFields array
These are the model's attributes that are displayed in the index page., (*12)
$this->indexFields = ['title', 'category_id', 'published'];
If not defined, then the first of the formFields is shown., (*13)
You can optionally, define the name of the model as we want it to appear in the views.
If not defined, the name of the model will be used., (*14)
The bladeLayout (optional)
This is used to define the blade layout file that will be extended by the views for the crud forms and index page., (*15)
The option to display deleted models (withTrashed)
Setting this to true, will also display deleted models and offer an option to restore them., (*16)
$this->withTrashed = true;
In order to be able to restore the models, you need to define an additional route:, (*17)
Route::put('/posts/{post}/restore', ['as' => 'posts.restore', 'uses' => 'PostController@restore']);
The validationRules array (optional)
These are the rules we want to use to validate data before saving the model., (*18)
$this->validationRules = [
'title' => 'required|max:255',
'slug' => 'required|max:100',
'body' => 'required',
'publish_on' => 'date',
'published' => 'boolean',
'category_id' => 'required|int',
];
The validationMessages array (optional)
Use this to define custom messages for validation errors. For example:, (*19)
$this->validationMessages = [
'body.required' => "You need to fill in the post content."
];
The validationAttributes array (optional)
Use this to change the way an attribute's name should appear in validation error messages., (*20)
$this->validationAttributes = [
'title' => 'Post title'
];
Views
The views are built with bootstrap v.3 and also have css classes to support some common JavaScript libraries.
- select2 class is used in select inputs
- datepicker class is used in date inputs
- data-table class is used in the index view table, (*21)
It is also possible to publish the views, so you can change them anyway you need.
To publish them, use the following artisan command:, (*22)
php artisan vendor:publish --provider=Achillesp\CrudForms\CrudFormsServiceProvider --tag=views
License
The MIT License (MIT). Please see License File for more information., (*23)