PHP code example of smallhadroncollider / laravel-form-presenter

1. Go to this page and download the library: Download smallhadroncollider/laravel-form-presenter library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

smallhadroncollider / laravel-form-presenter example snippets




// app/Http/Presenters/PersonFieldSet.php

namespace App\Http\Presenters;

use SmallHadronCollider\LaravelFormPresenter\FieldSetPresenter;

class PersonFieldSet extends FieldSetPresenter
{
    protected function fields()
    {
        return [
            [
                "name" => "first_name",
                "type" => "text",
                "label" => "First Name",
            ],
            [
                "name" => "last_name",
                "type" => "text",
                "label" => "Last Name",
                "rules" => ["



// app/Http/Controllers/PersonController.php

namespace App\Http\Controllers;

use App\Http\Presenters\PersonFieldSet;
use App\Http\Requests\PersonFormRequest;
use App\Repositories\PersonRepository;

class PersonController extends Controller
{
    private $repository;

    public function __construct(PersonRepository $repository)
    {
        $this->repository = $repository;
    }

    public function get(PersonFieldSet $fieldSet, $id)
    {
        $person = $this->repository->find($id);

        // Set the form data from the $person entity
        $fieldSet->setModel($person);

        return view("form", [
            // Pass in the form for the fieldset
            "form" => $fieldSet->form(),
            "title" => "Update Person"
        ]);
    }

    public function post(PersonFieldSet $fieldSet, PersonFormRequest $request, $id)
    {
        $person = $this->repository->find($id);

        // Get the data for each form field
        $data = $request->only($fieldSet->fieldNames());
        $this->repository->update($person, $data);

        return redirect("/people/{$person->id}");
    }
}



// app/Http/Request/PersonFormRequest.php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use App\Http\Presenters\FieldSets\PersonFieldSet;

class PersonFormRequest extends FormRequest
{
    public function rules(PersonFieldSet $fieldset)
    {
        return $fieldset->rules();
    }
}

{{-- form.blade.php --}}

{!! $form->open(["class" => "form"]) !!}
    {!! $form->display() !!}
    {!! $form->submit($title, ["class" => "button button--blue"]) !!}
{!! $form->close() !!}

{{-- person-form.blade.php --}}

{!! $form->open(["class" => "form"]) !!}
    {!! $form->first_name !!}
    {!! $form->last_name !!}
    {!! $form->submit($title, ["class" => "button button--blue"]) !!}
{!! $form->close() !!}

{{-- forms/field.blade.php --}}

<div class="form__group {{ $errors->has($field->name()) ? "form__group--error" : "" }}">
    {!! $field->label(["class" => "form__label"]) !!}

    @if ($errors->has($field->name()))
        <span class="form__info">{{ $errors->first($field->name()) }}</span>
    @endif

    {!! $field->display(["class" => "form__control form__control--grouped form__control--{$field->type()}"]) !!}
</div>



// app/Providers/AppServiceProvider.php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

use SmallHadronCollider\LaravelFormPresenter\FieldPresenter;

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        FieldPresenter::presenter(function ($attrs) {
            return view("forms/field", $attrs);
        });
    }
}



// app/Http/Presenters/PersonFieldSet.php

namespace App\Http\Presenters;

use SmallHadronCollider\LaravelFormPresenter\FieldSetPresenter;

class PersonFieldSet extends FieldSetPresenter
{
    protected function fields()
    {
        return [
            [
                "name" => "first_name",
                "type" => "text",
                "label" => "First Name",

                // Custom field property
                "message" => "Enter you first name"
            ],
        ];
    }
}

{{-- forms/field.blade.php --}}

<div class="form__group {{ $errors->has($field->name()) ? "form__group--error" : "" }}">
    {!! $field->label(["class" => "form__label"]) !!}

    @if ($errors->has($field->name()))
        <span class="form__info">{{ $errors->first($field->name()) }}</span>
    @endif

    {{-- use custom message field - will return null if no value set --}}
    <p class="form__message">{!! $field->message() !!}</p>

    {!! $field->display(["class" => "form__control form__control--grouped form__control--{$field->type()}"]) !!}
</div>



// app/Providers/AppServiceProvider.php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

use SmallHadronCollider\LaravelFormPresenter\FieldPresenter;

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        FieldPresenter::presenter(function ($attrs) {
            return view("form-presenter::bootstrap", $attrs);
        });
    }
}



// app/Http/Presenters/Forms/Fields/Boolean.php

namespace App\Http\Presenters\Forms\Fields;

use Illuminate\Foundation\Testing\TestCase;
use Faker\Generator;

use SmallHadronCollider\LaravelFormPresenter\Fields\AbstractField;
use SmallHadronCollider\LaravelFormPresenter\Fields\FieldInterface;

class Boolean extends AbstractField implements FieldInterface
{
    // The html to display for the label
    public function label($attrs = [])
    {
        return $this->formBuilder->label($this->name, $this->label, $attrs);
    }

    // The html to display for the field
    public function display($attrs = [])
    {
        return view("embellish::forms/boolean", [
            "name" => $this->name,
            "value" => $this->value() || $this->value() === null,
        ]);
    }

    // Test function for integration testing
    public function test(TestCase $test, Generator $faker)
    {
        return mt_rand(0, 1) ? $test->check($this->name) : $test->uncheck($this->name);
    }
}

{{-- forms/boolean.blade.php --}}

<div>
    <label>
      <input type="radio" value="1" name="{{ $name }}"{{ $value ? " checked" : "" }}> Yes
    </label>
    <label>
      <input type="radio" value="0" name="{{ $name }}"{{ $value ? "" : " checked" }}> No
    </label>
</div>



// app/Providers/AppServiceProvider

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

use SmallHadronCollider\LaravelFormPresenter\FieldPresenter;
use App\Http\Presenters\Forms\Fields\Boolean;

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        // Add boolean field type
        FieldPresenter::add("boolean", Boolean::class);
    }
}



// tests\AddPersonTest.php

use TestCase;
use SmallHadronCollider\LaravelFormPresenter\PubliciseFormMethods;
use App\Http\Presenters\FieldSets\PersonFieldSet;

class AddPersonTest extends TestCase
{
    // puts form filling methods (type(), select(), etc.) into public scope using __call()
    use PubliciseFormMethods;

    public function testPersonForm()
    {
        // create fieldset
        $fieldset = new PersonFieldSet();

        // visit page
        $test = $this->visit("/admin/people/create");

        // populate test form automatically, then submit
        $fieldset->populateTest($test)->press("Create Person")->assertResponseOk();
    }
}