Silverstripe在下拉字段阈值之前有一个CMS下拉过滤器

Silverstripe在下拉字段阈值之前有一个CMS下拉过滤器,silverstripe,silverstripe-4,Silverstripe,Silverstripe 4,我的一个型号中有一个有一个。但它超过了下拉列表\u字段\u阈值。 但是在getCMSFields方法中,我更改了该下拉列表的查询。但是,由于在调用此方法之前它已经超过阈值,因此下拉列表将转换为NumericDropdown或类似的内容 在检查阈值之前,是否有办法更改查询 顺便说一下,我知道我可以用自己的查询自定义下拉列表。但是Silverstripe已经处理了很多问题,所以最好只是修改查询 编辑:示例代码 public function getCMSFields() { $fields

我的一个型号中有一个
有一个
。但它超过了
下拉列表\u字段\u阈值
。 但是在
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;
}

不幸的是,不可能在类的上下文中更改此查询。另一种方法可能是编写自己的scaffold函数,而不是调用parent::getCMSFields,但在本例中并不建议这样做

如果您有某种全局获取当前问卷对象的方法,可以向QuestionNairection添加如下的augmentDataQueryCreation函数,以便向正在执行的查询添加where子句。但是,请注意,在每次执行Questionnairection::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

你能分享一下你的密码吗?@RobbieAverill很抱歉回复太晚,那天我需要它,因为我第二天在holliday上。我添加了我正在使用的代码。现在,由于所有“部分”都太多,所以超过了阈值,但我通过只获取当前“问卷”的部分来减少数量。所以我知道在减少之后,它不应该再超过阈值。