# Data Form

`Data form` is used to build forms and process submission data, which can be easily processed to process data that is not related to the Eloquent model.

## Basic usage

Generate the form class file with the command `admin:form`:

```
php artisan admin:form Setting --title=Website settings`
```

Will generate the form file `app/Admin/Forms/Setting.php`

```php
<?php

namespace App\Admin\Forms;

use Ezadev\Admin\Widgets\Form;
use Illuminate\Http\Request;

class Setting extends Form
{
    /**
     * The form title.
     *
     * @var string
     */
    public $title = 'Settings';

    /**
     * Handle the form request.
     *
     * @param Request $request
     *
     * @return \Illuminate\Http\RedirectResponse
     */
    public function handle(Request $request)
    {
        //dump($request->all());

        admin_success('Processed successfully.');

        return back();
    }

    /**
     * Build a form here.
     */
    public function form()
    {
        $this->text('name')->rules('required');
        $this->email('email')->rules('email');
        $this->datetime('created_at');
    }

    /**
     * The data of the form.
     *
     * @return array $data
     */
    public function data()
    {
        return [
            'name'       => 'John Doe',
            'email'      => 'John.Doe@gmail.com',
            'created_at' => now(),
        ];
    }
}
```

In the form class above, `$title` is used to set the title of the form, and the form item is built in the `form` method. The method is consistent with `model-form`, and the `data` method is used to set the form item. Default data

Then put the above form into your page as follows:

```php
<?php

use App\Admin\Forms\Setting;
use App\Http\Controllers\Controller;
use Ezadev\Admin\Layout\Content;

class UserController extends Controller
{
    public function setting(Content $content)
    {
        return $content
            ->title('Website setting')
            ->body(new Setting());
    }
}
```

After filling in the data submission form on the page, the request will go to the `handle` method, where you can add your data processing logic. After the processing is complete, return a response object to the front end:

```php
    public function handle(Request $request)
    {
        // Get data from the $request object to process...

        // Add a success prompt
        admin_success('Success');

        // or an error message
        admin_success('Asu Ada Error....');

        // Go back to the original form page after processing is complete, or jump to another page by returning `redirect()` method
        return back();
    }
```

## Tab form

`tab form` Organize multiple forms by using the line selection card, click the tab to jump to the corresponding form page

How to use

```php
use App\Admin\Forms\Settings;
use App\Http\Controllers\Controller;
use Ezadev\Admin\Layout\Content;
use Ezadev\Admin\Widgets\Tab;

class FormController extends Controller
{
    public function settings(Content $content)
    {
        $forms = [
            'basic'    => Settings\Basic::class,
            'site'     => Settings\Site::class,
            'upload'   => Settings\Upload::class,
            'database' => Settings\Database::class,
            'develop'  => Settings\Develop::class,
        ];

        return $content
            ->title('Judul Form')
            ->body(Tab::forms($forms));
    }
}
```

Where `$forms` is an array of `data form` types

## Step form

If you want to divide a form into multiple steps, you can use the `step form`:

```php
<?php

use App\Admin\Forms\Steps;
use App\Http\Controllers\Controller;
use Ezadev\Admin\Layout\Content;
use Ezadev\Admin\Widgets\MultipleSteps;

class FormController extends Controller
{
    public function register(Content $content)
    {
        $steps = [
            'info'     => Steps\Info::class,
            'profile'  => Steps\Profile::class,
            'password' => Steps\Password::class,
        ];

        return $content
            ->title('Register')
            ->body(MultipleSteps::make($steps));
    }
}
```

The code for the first step table with class `app/Admin/Forms/Steps/Info.php` is as follows:

```php
<?php

namespace App\Admin\Forms\Steps;

use Ezadev\Admin\Widgets\StepForm;
use Illuminate\Http\Request;

class Info extends StepForm
{
    /**
     * The form title.
     *
     * @var string
     */
    public $title = 'Basic info';

    /**
     * Handle the form request.
     *
     * @param Request $request
     *
     * @return \Illuminate\Http\RedirectResponse
     */
    public function handle(Request $request)
    {
        return $this->next($request->all());
    }

    /**
     * Build a form here.
     */
    public function form()
    {
        $this->text('username');
        $this->email('email');
    }
}
```

> Note that the inheritance of the step form is the `Ezadev\Admin\Widgets\StepForm` class.

In the `handle` method, there are some ways to help deal with various situations.

Use the `next` method to save the current step data to the session and jump to the next step:

```php
return $this->next($data = []);
```

Or data processing fails, go back to the previous step:

```php
return $this->prev();
```

Clear the data in the session after processing the data in the last step:

```php
return $this->clear();
```

Get all previous data through the `all` method

```php
return $this->all();
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://me.khairu-aqsara.net/documentation/readme/en/data-form.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
