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
相关产品推荐
相关产品推荐

