Silverstripe has_one CMS下拉过滤器位于dropdown_field_threshold之前

时间:2019-03-06 10:53:29

标签: silverstripe silverstripe-4

我的一个模型中有一个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;
}

1 个答案:

答案 0 :(得分:1)

不幸的是,无法在类的上下文中更改此查询。一种替代方法是编写您自己的脚手架函数,而不是调用parent :: getCMSFields,但是在这种情况下,建议不要这样做。

如果可以通过某种方式全局获取当前的Questionnaire对象,则可以在QuestionnaireSection中添加如下所示的EnhanceDataQueryCreation函数,以向正在执行的查询中添加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