You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:26:43