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

SilverStripe 4中ModelAdmin下Quiz与问题的has_many关联配置咨询

没问题,我来帮你一步步搞定SilverStripe 4里ModelAdmin中has_many关联的配置,咱们分步骤来:

1. 完善你的Quiz类关联定义

首先得在Quiz类里明确has_many关联,同时补全MailText的字段类型(比如用Text或者HTMLText,根据你的需求),修改后的代码大概是这样:

use SilverStripe\ORM\DataObject;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\TextField;
use SilverStripe\Forms\DateField;
use SilverStripe\Forms\LiteralField;
use SilverStripe\Forms\CheckboxField;
// 引入GridField相关类,用于管理关联记录
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridFieldConfig_RecordEditor;

class Quiz extends DataObject {
    private static $db = [
        "Name" => "Varchar(200)",
        "bis" => "Date", // SilverStripe 4字段类型不需要加括号
        "aktiv" => "Boolean",
        "Mail" => "Boolean",
        "MailText" => "Text" // 补全字段类型,按需选Text或HTMLText
    ];

    // 定义has_many关联,指向后续要创建的Question类
    private static $has_many = [
        'Questions' => Question::class
    ];

    // 配置CMS字段,添加GridField管理关联问题
    public function getCMSFields() {
        $fields = parent::getCMSFields();

        // 在后台添加一个标签页,用GridField管理关联的Question
        $fields->addFieldToTab('Root.Questions', GridField::create(
            'Questions',
            'Quiz Questions',
            $this->Questions(),
            GridFieldConfig_RecordEditor::create()
        ));

        return $fields;
    }
}

2. 创建对应的Question DataObject

接下来要创建和Quiz关联的Question类,它需要定义belongs_to关联指向Quiz,示例代码如下:

use SilverStripe\ORM\DataObject;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\TextField;
use SilverStripe\Forms\TextareaField;

class Question extends DataObject {
    private static $db = [
        'Title' => 'Varchar(255)',
        'Content' => 'Text'
        // 可按需添加更多字段,比如选项、正确答案等
    ];

    // 定义belongs_to关联,绑定到Quiz类
    private static $belongs_to = [
        'Quiz' => Quiz::class
    ];

    public function getCMSFields() {
        $fields = parent::getCMSFields();

        // 移除自动生成的Quiz下拉框(因为通过GridField关联,无需手动选择)
        $fields->removeByName('QuizID');

        return $fields;
    }
}

3. 配置ModelAdmin管理Quiz和关联数据

最后创建一个ModelAdmin类,让你能在后台统一管理Quiz(包括它的关联问题):

use SilverStripe\Admin\ModelAdmin;

class QuizAdmin extends ModelAdmin {
    // 指定要管理的模型
    private static $managed_models = [
        Quiz::class
    ];

    // 后台菜单显示标题
    private static $menu_title = 'Quizzes';

    // 后台访问的URL路径
    private static $url_segment = 'quizzes';
}

收尾注意事项

  • 确保类文件放在正确目录(比如app/src/Models/),如果用了命名空间,记得在每个类顶部添加对应声明
  • 执行dev/build?flush=all刷新SilverStripe配置和数据库结构
  • 要是bis字段是德语“截止日期”,可以考虑改成更通用的EndDate方便团队理解,不过不是必须的

这样配置完成后,你在后台的QuizAdmin里就能创建Quiz,还能通过标签页里的GridField直接添加、编辑关联的Question了。

内容的提问来源于stack exchange,提问作者Denis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:28:23