Silverstripe $searchable_fields 超过 $has_one,然后是 $many_many 关系

Silverstripe $searchable_fields over a $has_one, then a $many_many relationship

在 Silverstripe V2 中,可以创建跨越 Obj1.Obj2.Obj3.Obj3Field 等关系的可搜索字段,但现在在 V3 中,这会产生以下错误...

[User Error] Uncaught LogicException: relation can't be called on an UnsavedRelationList.
GET /zz_silverstripe_default/admin/mymodeladmin/
Line 391 in C:\xampp\htdocs\zz_silverstripe_default\framework\model\UnsavedRelationList.php
Source
390     public function relation() {
391         throw new LogicException(__FUNCTION__ . " can't be called on an UnsavedRelationList.");
392     }
Trace
UnsavedRelationList->relation(EndObject) 
DataObject.php:3009
DataObject->relObject(MiddleDataObjects.EndObject.Name) 
DataObject.php:2285
DataObject->scaffoldSearchFields() 
DataObject.php:2230
DataObject->getDefaultSearchContext() 
ModelAdmin.php:173

重现此代码的代码是...

class MyModelAdmin extends ModelAdmin {
    static $managed_models = array('RootDataObject');
    static $url_segment = 'mymodeladmin';
    static $menu_title = 'MyModelAdmin';
    static $model_importers = array();
}

class RootDataObject extends DataObject {
    private static $db = array('Name' => 'Varchar(255)');
    private static $has_many = array('MiddleDataObjects' => 'MiddleDataObject');
    static $searchable_fields = array('MiddleDataObjects.EndObject.Name');
}

class MiddleDataObject extends DataObject {
    private static $db = array('Name' => 'Varchar(255)');
    private static $has_one = array('RootDataObject' => 'RootDataObject');
    private static $many_many = array('EndDataObjects' => 'EndDataObject');
}

class EndDataObject extends DataObject {
    private static $db = array('Name' => 'Varchar(255)');
    private static $belongs_many_many = array('OtherDataObjects' => 'OtherDataObject');
}

我已将此代码上传到 http://pastebin.com/QBfU8Fub,其中包含更多白色 space 和一些 php 标签,以便更容易重现此问题。我本质上是在以前的行为之后工作,所以我不必继续手动编写搜索上下文和过滤器来做我期望从这个漂亮的 CMS 中得到的东西。

这是 SilverStripe 框架代码中 UnsavedRelationList 对象中的错误。

这是另一个遇到此问题的用户: https://github.com/silverstripe/silverstripe-widgets/issues/123

有一个解决方法: https://github.com/silverstripe/silverstripe-framework/pull/5348

但是,此更新要到 SilverStripe 3.4 / SilverStripe 4.0 才会发布。