数据表单

Since v1.7.0

数据表单用来构建表单和处理提交数据,可以很方便的来处理和Eloquent模型不相关的数据

基本使用

用命令admin:form来生成表单类文件:

  1. php artisan admin:form Setting --title=网站设置`

将会生成表单文件app/Admin/Forms/Setting.php

  1. <?php
  2. namespace App\Admin\Forms;
  3. use Encore\Admin\Widgets\Form;
  4. use Illuminate\Http\Request;
  5. class Setting extends Form
  6. {
  7. /**
  8. * The form title.
  9. *
  10. * @var string
  11. */
  12. public $title = 'Settings';
  13. /**
  14. * Handle the form request.
  15. *
  16. * @param Request $request
  17. *
  18. * @return \Illuminate\Http\RedirectResponse
  19. */
  20. public function handle(Request $request)
  21. {
  22. //dump($request->all());
  23. admin_success('Processed successfully.');
  24. return back();
  25. }
  26. /**
  27. * Build a form here.
  28. */
  29. public function form()
  30. {
  31. $this->text('name')->rules('required');
  32. $this->email('email')->rules('email');
  33. $this->datetime('created_at');
  34. }
  35. /**
  36. * The data of the form.
  37. *
  38. * @return array $data
  39. */
  40. public function data()
  41. {
  42. return [
  43. 'name' => 'John Doe',
  44. 'email' => 'John.Doe@gmail.com',
  45. 'created_at' => now(),
  46. ];
  47. }
  48. }

在上面的表单类里面,$title用来设置表单的标题,在form方法中来构建表单项,使用方法和model-form一致,data方法用来给这个表单项设置默认数据

然后按照下面的方法将上面的表单放到你的页面中:

  1. <?php
  2. use App\Admin\Forms\Setting;
  3. use App\Http\Controllers\Controller;
  4. use Encore\Admin\Layout\Content;
  5. class UserController extends Controller
  6. {
  7. public function setting(Content $content)
  8. {
  9. return $content
  10. ->title('网站设置')
  11. ->body(new Setting());
  12. }
  13. }

在页面中填入数据提交表单之后,请求会进入到handle方法中,在这里可以加入你的数据处理逻辑,处理完成之后,返回一个response对象给前端:

    public function handle(Request $request)
    {
        // 从$request对象中获取数据来处理...

        // 加入一个成功提示
        admin_success('数据处理成功.');

        // 或者一个错误提示
        admin_success('数据处理成功失败.');

        // 处理完成之后回到原来的表单页面,或者通过返回`redirect()`方法跳转到其它页面
        return back();
    }

选项卡表单

选项卡表单用选项卡的方式将多个表单组织起来,点击选项卡跳转到相应的表单页面

使用方法如下

use App\Admin\Forms\Settings;
use App\Http\Controllers\Controller;
use Encore\Admin\Layout\Content;
use Encore\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('系统设置')
            ->body(Tab::forms($forms));
    }
}

其中$forms数据表单类数组,页面效果如下:

WX20190608-143841

步骤表单

如果要把一个表单分成多个步骤来处理,可以使用步骤表单:

<?php

use App\Admin\Forms\Steps;
use App\Http\Controllers\Controller;
use Encore\Admin\Layout\Content;
use Encore\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('注册用户')
            ->body(MultipleSteps::make($steps));
    }
}

第一个步骤表带类app/Admin/Forms/Steps/Info.php的代码如下:

<?php

namespace App\Admin\Forms\Steps;

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

class Info extends StepForm
{
    /**
     * The form title.
     *
     * @var string
     */
    public $title = '填写基本信息';

    /**
     * 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');
    }
}

注意在步骤表单继承的是Encore\Admin\Widgets\StepForm

handle方法中, 有下面的一些方法可以帮助处理各种情况

使用next方法来保存当前这一步的数据到session中,并且跳转到下一步:

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

或者数据处理失败,回到上一步:

return $this->prev();

在最后一步处理完数据后清空session中的数据:

return $this->clear();

通过all方法获取之前的所有数据

return $this->all();