SilverStripe gridfield多类编辑器的sort()列无效

SilverStripe gridfield多类编辑器的sort()列无效,silverstripe,Silverstripe,我在设置嵌套关系的排序顺序时遇到问题,其中子项可以通过的模块拖放重新排序。我也在使用 我有一个页面,其中有许多复杂的行程。这些ComplexStrip对象有许多“LinkedObjects” 问题: <?php class TextBlock extends DataObject { private static $db = array( 'SortOrder' => 'Int' ); private static $default_sor

我在设置嵌套关系的排序顺序时遇到问题,其中子项可以通过的模块拖放重新排序。我也在使用

我有一个
页面
,其中有许多
复杂的行程
。这些
ComplexStrip
对象有许多“LinkedObjects”

问题:

<?php
class TextBlock extends DataObject {

    private static $db = array(
        'SortOrder' => 'Int'
    );

    private static $default_sort = 'Sort';

    private static $has_one = array(
        'TextBlocksStrip' => 'TextBlocksStrip'
    );
}
当我试图通过GridField添加一个
ComplexStrip
时,我得到以下错误:Uncaught InvalidArgumentException:Invalid sort()列

我的设置:

<?php
class TextBlock extends DataObject {

    private static $db = array(
        'SortOrder' => 'Int'
    );

    private static $default_sort = 'Sort';

    private static $has_one = array(
        'TextBlocksStrip' => 'TextBlocksStrip'
    );
}
页面类别: 当我在CMS中浏览并编辑该类时,该类工作正常

<?php
class Page extends SiteTree {

    private static $has_many = array(
        'ComplexStrips' => 'ComplexStrip'
    );

    public function getCMSFields() {

        $fields = parent::getCMSFields();

        $dataColumns = new GridFieldDataColumns();
        $dataColumns->setDisplayFields(
            array(
                'Title'     => 'Title',
                'ClassName' => 'Class Name'
            )
        );

        $multiClassConfig = new GridFieldAddNewMultiClass();
        $multiClassConfig->setClasses(
            array(
                'ComplexStrip'
            )
        );

        $stripsGridField = GridField::create('ComplexStrips', 'Complex strips', $this->Strips(),
            GridFieldConfig::create()->addComponents(
                new GridFieldToolbarHeader(),
                new GridFieldDetailForm(),
                new GridFieldEditButton(),
                new GridFieldDeleteAction('unlinkrelation'),
                new GridFieldDeleteAction(),
                new GridFieldOrderableRows('SortOrder'), // This line causes the issue
                new GridFieldTitleHeader(),
                $multiClassConfig,
                $dataColumns
            )
        );

        $fields->addFieldsToTab(
            'Root.Strips',
            array(
                $stripsGridField
            )
        );

        return $fields;
    }
}
TextBlock类:

<?php
class TextBlock extends DataObject {

    private static $db = array(
        'SortOrder' => 'Int'
    );

    private static $default_sort = 'Sort';

    private static $has_one = array(
        'TextBlocksStrip' => 'TextBlocksStrip'
    );
}

我做了一个相当优雅的变通方法

无法查询排序器,因为父对象
ComplexStrip
在尝试加入排序表时不存在。因此,将GridFieldOrderableRows包装在if中,以检查父对象是否已分配ID

// Need to wait until parent object is created before trying to set sort order
if($this->ID) {
    $textBlocks->addComponents(
        new GridFieldOrderableRows('Sort')
    );
}

在这之后,CMS中的所有工作都与以前一样。我现在将打开模块上的一个问题,看看是否有更持久的解决方案。

我遇到了与使用
$many\u many
而不是
$has\u many
时相同的错误。我可以看到您使用了$has\u many,因此无法解决您的问题,但可能会帮助其他人遇到与我相同的错误消息。

这也可能与此问题有关:您可以在报告的问题中找到我提出的解决方法。因此,在我的情况下,这将在
ComplexStrip
类中进行?我还应该提到,这是在CMS中发生的,而不是在模板中。