如何在OctoberCMS中将表单输入数据保存至自定义数据库表?
在OctoberCMS中实现表单数据存入自定义数据库表的完整指南
我在OctoberCMS里折腾过不少表单存库的需求,下面给你一步步拆解,从准备数据库到处理提交全流程都给你讲清楚:
1. 准备数据库表与模型
OctoberCMS基于Laravel,所以我们用Eloquent模型来操作数据库,最规范的方式是创建一个自定义插件(当然你也可以在主题里快速实现,但插件模式更便于后续维护和复用)。
1.1 创建迁移文件(生成数据库表)
打开终端进入项目根目录,执行Artisan命令生成迁移:
php artisan create:migration create_contact_submissions_table --create=contact_submissions
找到database/migrations目录下生成的迁移文件,修改up()方法定义表字段(以常见的联系表单为例):
public function up() { Schema::create('contact_submissions', function (Blueprint $table) { $table->id(); $table->string('name'); $table->string('email'); $table->text('message'); $table->timestamps(); }); }
执行迁移生成数据库表:
php artisan migrate
1.2 创建对应模型
在插件目录(比如plugins/yourvendor/contact/models,没有插件的话先创建基础插件结构)创建Submission.php模型文件:
<?php namespace YourVendor\Contact\Models; use Model; class Submission extends Model { // 指定对应的数据表 protected $table = 'contact_submissions'; // 允许批量赋值的字段(对应表单输入项) protected $fillable = ['name', 'email', 'message']; }
2. 创建表单处理组件
October用组件封装业务逻辑,我们创建一个处理表单提交的组件:
在插件的components目录创建ContactForm.php:
<?php namespace YourVendor\Contact\Components; use Cms\Classes\ComponentBase; use YourVendor\Contact\Models\Submission; use Validator; use Redirect; class ContactForm extends ComponentBase { public function componentDetails() { return [ 'name' => '联系表单', 'description' => '处理联系表单提交并保存到数据库' ]; } // 处理表单提交的核心方法,对应表单里的请求处理器 public function onSubmit() { // 获取表单提交的POST数据 $data = post(); // 定义验证规则 $rules = [ 'name' => 'required|min:2', 'email' => 'required|email', 'message' => 'required|min:10' ]; // 执行验证 $validator = Validator::make($data, $rules); if ($validator->fails()) { // 验证失败,返回原页面并携带错误信息 return Redirect::back()->withErrors($validator); } // 验证通过,保存数据到数据库 Submission::create($data); // 提交成功,返回原页面并携带成功提示 return Redirect::back()->with('success', '感谢您的留言,我们会尽快回复!'); } }
记得在插件的plugin.php里注册这个组件,让后台可以选择使用:
public function registerComponents() { return [ 'YourVendor\Contact\Components\ContactForm' => 'contactForm' ]; }
3. 在页面中添加表单
在主题页面(比如pages/contact.htm)中引入组件并编写表单:
title = "联系我们" url = "/contact" layout = "default" is_hidden = 0 [contactForm] == <div class="contact-form"> <!-- 显示成功提示 --> {% if flash.success %} <div class="alert alert-success">{{ flash.success }}</div> {% endif %} <!-- 显示错误信息 --> {% if errors %} <div class="alert alert-danger"> <ul> {% for error in errors.all() %} <li>{{ error }}</li> {% endfor %} </ul> </div> {% endif %} <!-- OctoberCMS表单助手,自动处理CSRF防护 --> {{ form_open({ request: 'contactForm::onSubmit' }) }} <div class="form-group"> <label>姓名</label> <input type="text" name="name" class="form-control" value="{{ old('name') }}"> </div> <div class="form-group"> <label>邮箱</label> <input type="email" name="email" class="form-control" value="{{ old('email') }}"> </div> <div class="form-group"> <label>留言</label> <textarea name="message" class="form-control" rows="5">{{ old('message') }}</textarea> </div> <button type="submit" class="btn btn-primary">提交</button> {{ form_close() }} </div>
4. 测试验证
现在访问你的联系页面,填写表单提交后,去数据库的contact_submissions表里查看,数据应该已经成功存储了!
额外实用提示
- 如果不想用插件,也可以把模型放在
app/models目录、组件放在主题的components目录,但插件模式更符合October的最佳实践,便于后续扩展。 - 可以根据需求扩展字段(比如添加电话、主题),只需要修改迁移文件和模型的
$fillable数组即可。 - 若需要在后台管理提交的数据,可以给模型配置后台列表和表单(在插件的
models/submission/columns.yaml和fields.yaml中配置),就能直接在October后台查看和管理提交内容。
内容的提问来源于stack exchange,提问作者Milos
相关产品推荐
相关产品推荐

