基于数据模型的表单

Encore\Admin\Form类用于生成基于数据模型的表单,先来个例子,数据库中有movies

  1. CREATE TABLE `movies` (
  2. `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  3. `title` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  4. `director` int(10) unsigned NOT NULL,
  5. `describe` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  6. `rate` tinyint unsigned NOT NULL,
  7. `released` enum(0, 1),
  8. `release_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  9. `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  10. `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  11. PRIMARY KEY (`id`)
  12. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

对应的数据模型为App\Models\Movie,下面的代码可以生成movies的数据表单:

  1. use App\Models\Movie;
  2. use Encore\Admin\Form;
  3. use Encore\Admin\Facades\Admin;
  4. $form = new Form(new Movie);
  5. // 显示记录id
  6. $form->display('id', 'ID');
  7. // 添加text类型的input框
  8. $form->text('title', '电影标题');
  9. $directors = [
  10. 1 => 'John',
  11. 2 => 'Smith',
  12. 3 => 'Kate' ,
  13. ];
  14. $form->select('director', '导演')->options($directors);
  15. // 添加describe的textarea输入框
  16. $form->textarea('describe', '简介');
  17. // 数字输入框
  18. $form->number('rate', '打分');
  19. // 添加开关操作
  20. $form->switch('released', '发布?');
  21. // 添加日期时间选择框
  22. $form->dateTime('release_at', '发布时间');
  23. // 两个时间显示
  24. $form->display('created_at', '创建时间');
  25. $form->display('updated_at', '修改时间');

自定义工具

表单右上角默认有返回和跳转列表两个按钮工具, 可以使用下面的方式修改它:

  1. $form->tools(function (Form\Tools $tools) {
  2. // 去掉`列表`按钮
  3. $tools->disableList();
  4. // 去掉`删除`按钮
  5. $tools->disableDelete();
  6. // 去掉`查看`按钮
  7. $tools->disableView();
  8. // 添加一个按钮, 参数可以是字符串, 或者实现了Renderable或Htmlable接口的对象实例
  9. $tools->add('<a class="btn btn-sm btn-danger"><i class="fa fa-trash"></i>&nbsp;&nbsp;delete</a>');
  10. });

表单脚部

使用下面的方法去掉form脚部的元素

  1. $form->footer(function ($footer) {
  2. // 去掉`重置`按钮
  3. $footer->disableReset();
  4. // 去掉`提交`按钮
  5. $footer->disableSubmit();
  6. // 去掉`查看`checkbox
  7. $footer->disableViewCheck();
  8. // 去掉`继续编辑`checkbox
  9. $footer->disableEditingCheck();
  10. // 去掉`继续创建`checkbox
  11. $footer->disableCreatingCheck();
  12. });

其它方法

去掉提交按钮:

  1. $form->disableSubmit();

去掉重置按钮:

  1. $form->disableReset();

忽略掉不需要保存的字段

  1. $form->ignore(['column1', 'column2', 'column3']);

设置宽度

  1. $form->setWidth(10, 2);

设置表单提交的action

  1. $form->setAction('admin/users');

判断当前表单页是创建页面还是更新页面

Since v1.7.6

  1. $form->isCreating();
  2. $form->isUpdating();

关联模型

一对一

users表和profiles表通过profiles.user_id字段生成一对一关联

  1. CREATE TABLE `users` (
  2. `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  3. `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  4. `email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  5. `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  6. `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  7. PRIMARY KEY (`id`)
  8. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
  9. CREATE TABLE `profiles` (
  10. `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  11. `user_id` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  12. `age` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  13. `gender` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  14. `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  15. `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  16. PRIMARY KEY (`id`)
  17. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

对应的数据模分别为:

  1. class User extends Model
  2. {
  3. public function profile()
  4. {
  5. return $this->hasOne(Profile::class);
  6. }
  7. }
  8. class Profile extends Model
  9. {
  10. public function user()
  11. {
  12. return $this->belongsTo(User::class);
  13. }
  14. }

通过下面的代码可以关联在一个form里面:

  1. $form = new Form(new User);
  2. $form->display('id');
  3. $form->text('name');
  4. $form->text('email');
  5. $form->text('profile.age');
  6. $form->text('profile.gender');
  7. $form->datetime('created_at');
  8. $form->datetime('updated_at');