dropdown_field_threshold 之前的 Silverstripe has_one CMS 下拉过滤器
Silverstripe has_one CMS dropdown filter before dropdown_field_threshold
我的一个模型中有一个 has_one
。但它超过了dropdown_field_threshold
。
但是在 getCMSFields
方法中,我更改了该下拉列表的查询。但是由于在调用此方法之前它已经超过了阈值,因此下拉列表将转换为 NumericDropdown 或类似的东西。
有没有办法在检查阈值之前更改查询?
顺便说一下,我知道我可以用我自己的查询创建一个自定义下拉列表。但是 Silverstripe 已经处理了很多,所以最好只更改查询。
编辑:示例代码
public function getCMSFields() {
$fields = parent::getCMSFields();
$questionnaire = $this->QuestionnaireSection()->Questionnaire();
$nextQuestionOptions = $questionnaire->Sections();
/** @var DropdownField $dropdownField */
$dropdownField = $fields->dataFieldByName("NextQuestionID");
$dropdownField->setSource($nextQuestionOptions->map()->toArray());
return $fields;
}
遗憾的是,无法在 class 的上下文中更改此查询。另一种方法可能是编写自己的脚手架函数而不是调用 parent::getCMSFields,但在这种情况下不建议这样做。
如果您有某种方法可以全局获取当前问卷对象,则可以将如下所示的 augmentDataQueryCreation 函数添加到 QuestionnaireSection,以将 where 子句添加到正在执行的查询中。但是请注意,在执行 QuestionnaireSection::get() 的每种情况下都会调用此函数。
public function augmentDataQueryCreation(SQLSelect $query, DataQuery $dataQuery){
$baseTable = $this->baseTable();
$filter = 1; //Your global param here
$dataQuery->where("\"$baseTable\".\"QuestionnaireID\" = $filter");
}
防止 DropdownField 被 NumericField 替换的替代方法是通过将以下代码添加到您的 mysite.yml 来更改此开关的阈值。这并不能完全解决您的问题,但却是一个很好的解决方法。
SilverStripe\ORM\FieldType\DBForeignKey:
dropdown_field_threshold: 100000
我的一个模型中有一个 has_one
。但它超过了dropdown_field_threshold
。
但是在 getCMSFields
方法中,我更改了该下拉列表的查询。但是由于在调用此方法之前它已经超过了阈值,因此下拉列表将转换为 NumericDropdown 或类似的东西。
有没有办法在检查阈值之前更改查询?
顺便说一下,我知道我可以用我自己的查询创建一个自定义下拉列表。但是 Silverstripe 已经处理了很多,所以最好只更改查询。
编辑:示例代码
public function getCMSFields() {
$fields = parent::getCMSFields();
$questionnaire = $this->QuestionnaireSection()->Questionnaire();
$nextQuestionOptions = $questionnaire->Sections();
/** @var DropdownField $dropdownField */
$dropdownField = $fields->dataFieldByName("NextQuestionID");
$dropdownField->setSource($nextQuestionOptions->map()->toArray());
return $fields;
}
遗憾的是,无法在 class 的上下文中更改此查询。另一种方法可能是编写自己的脚手架函数而不是调用 parent::getCMSFields,但在这种情况下不建议这样做。
如果您有某种方法可以全局获取当前问卷对象,则可以将如下所示的 augmentDataQueryCreation 函数添加到 QuestionnaireSection,以将 where 子句添加到正在执行的查询中。但是请注意,在执行 QuestionnaireSection::get() 的每种情况下都会调用此函数。
public function augmentDataQueryCreation(SQLSelect $query, DataQuery $dataQuery){
$baseTable = $this->baseTable();
$filter = 1; //Your global param here
$dataQuery->where("\"$baseTable\".\"QuestionnaireID\" = $filter");
}
防止 DropdownField 被 NumericField 替换的替代方法是通过将以下代码添加到您的 mysite.yml 来更改此开关的阈值。这并不能完全解决您的问题,但却是一个很好的解决方法。
SilverStripe\ORM\FieldType\DBForeignKey:
dropdown_field_threshold: 100000