Php SilverStripe ListboxField multiselect按用户选择排序

Php SilverStripe ListboxField multiselect按用户选择排序,php,silverstripe,Php,Silverstripe,我的论文和主题之间有many关系。我创建了一个ListboxFieldw/c接受多个值 保存到数据库不是问题,但是当我再次查看信息时,主题会根据主题的ID对用户选择进行排序 例如,用户选择订单[1,5,4,2]。一旦保存并再次查看,它将显示如下[1,2,4,5] 这是我的密码: Theses.php class Theses extends DataObject { private static $db = array( 'CallNo' => 'Varchar'

我的
论文
主题
之间有
many
关系。我创建了一个
ListboxField
w/c接受多个值

保存到数据库不是问题,但是当我再次查看信息时,主题会根据主题的
ID
对用户选择进行排序

例如,用户选择订单
[1,5,4,2]
。一旦保存并再次查看,它将显示如下
[1,2,4,5]

这是我的密码:

Theses.php

class Theses extends DataObject {

    private static $db = array(
        'CallNo' => 'Varchar',
        'AuthorID' => 'Int',
        'TitleTH' => 'Text',
        'Year' => 'Int(4)',
        'PhysicalDesc' => 'Text',
        'Notes' => 'Text',
        'Summary' => 'Text',
        'DegreeCourse' => 'Varchar'
    );

    private static $has_one = array(
        'Author' => 'Author'
    );

    private static $field_labels = array(
        'CallNo' => 'Call Number',
        'TitleTH' => 'Title Headings',
        'Author.AuthorName' => 'Author',
        'DegreeCourse' => 'Degree Course',
        'Year' => 'Year Published',
        'SubjectsString' => 'Subject'
    );

    private static $summary_fields = array(
        'CallNo' => 'CallNo',
        'TitleTH' => 'TitleTH',
        'Author.AuthorName',
        'DegreeCourse',
        'Year' => 'Year',
        'SubjectsString'
    );

    private static $many_many = array(
        'Subjects' => 'Subject'
    );

    public function SubjectsString() {
        $returnString = '';
        foreach ($this->Subjects()->sort('Theses_Subjects.Created') as $Subjects) {
            $returnString .= $Subjects->SubjectTitle . '--';
        }
        return $returnString;
    }

    public function getCMSfields() {
        $fields = FieldList::create(TabSet::create('Root'));
        $fields->addFieldsToTab('Root.Main', array(
            TextField::create('CallNo'),
            DropdownField::create('AuthorID', 'AuthorName')
                ->setSource(Author::get()->sort('AuthorName')->map('ID', 'AuthorName')),
            TextField::create('TitleTH'),
            NumericField::create('Year', 'Year')
                ->setMaxLength(4),
            TextField::create('PhysicalDesc'),
            TextField::create('Notes'),
            TextAreaField::create('Summary'),
            DropdownField::create('DegreeCourse', 'DegreeCourse', array('BLIS' => 'BLIS', 'BLS' => 'BLS', 'MLIS' => 'MLIS', 'MLS' => 'MLS')),
            ListboxField::create('Subjects', 'Subjects', Subject::get()->map('ID', 'SubjectTitle')->toArray(), 1, 4, true),
        ));

        return $fields;
    }
}
class Subject extends DataObject {

    private static $db = array(
        'SubjectTitle' => 'Varchar'
    );

    private static $belongs_many_many = array(
        'Theses' => 'Theses'
    );

    public function canView($member = null) {
        return Permission::check('CMS_ACCESS_MyAdmin', 'any', $member);
    }

    public function canEdit($member = null) {
        return Permission::check('CMS_ACCESS_MyAdmin', 'any', $member);
    }

    public function canDelete($member = null) {
        return Permission::check('CMS_ACCESS_MyAdmin', 'any', $member);
    }

    public function canCreate($member = null) {
        return Permission::check('CMS_ACCESS_MyAdmin', 'any', $member);
    }

    private static $summary_fields = array(
        'SubjectTitle'
    );

}
Subject.php

class Theses extends DataObject {

    private static $db = array(
        'CallNo' => 'Varchar',
        'AuthorID' => 'Int',
        'TitleTH' => 'Text',
        'Year' => 'Int(4)',
        'PhysicalDesc' => 'Text',
        'Notes' => 'Text',
        'Summary' => 'Text',
        'DegreeCourse' => 'Varchar'
    );

    private static $has_one = array(
        'Author' => 'Author'
    );

    private static $field_labels = array(
        'CallNo' => 'Call Number',
        'TitleTH' => 'Title Headings',
        'Author.AuthorName' => 'Author',
        'DegreeCourse' => 'Degree Course',
        'Year' => 'Year Published',
        'SubjectsString' => 'Subject'
    );

    private static $summary_fields = array(
        'CallNo' => 'CallNo',
        'TitleTH' => 'TitleTH',
        'Author.AuthorName',
        'DegreeCourse',
        'Year' => 'Year',
        'SubjectsString'
    );

    private static $many_many = array(
        'Subjects' => 'Subject'
    );

    public function SubjectsString() {
        $returnString = '';
        foreach ($this->Subjects()->sort('Theses_Subjects.Created') as $Subjects) {
            $returnString .= $Subjects->SubjectTitle . '--';
        }
        return $returnString;
    }

    public function getCMSfields() {
        $fields = FieldList::create(TabSet::create('Root'));
        $fields->addFieldsToTab('Root.Main', array(
            TextField::create('CallNo'),
            DropdownField::create('AuthorID', 'AuthorName')
                ->setSource(Author::get()->sort('AuthorName')->map('ID', 'AuthorName')),
            TextField::create('TitleTH'),
            NumericField::create('Year', 'Year')
                ->setMaxLength(4),
            TextField::create('PhysicalDesc'),
            TextField::create('Notes'),
            TextAreaField::create('Summary'),
            DropdownField::create('DegreeCourse', 'DegreeCourse', array('BLIS' => 'BLIS', 'BLS' => 'BLS', 'MLIS' => 'MLIS', 'MLS' => 'MLS')),
            ListboxField::create('Subjects', 'Subjects', Subject::get()->map('ID', 'SubjectTitle')->toArray(), 1, 4, true),
        ));

        return $fields;
    }
}
class Subject extends DataObject {

    private static $db = array(
        'SubjectTitle' => 'Varchar'
    );

    private static $belongs_many_many = array(
        'Theses' => 'Theses'
    );

    public function canView($member = null) {
        return Permission::check('CMS_ACCESS_MyAdmin', 'any', $member);
    }

    public function canEdit($member = null) {
        return Permission::check('CMS_ACCESS_MyAdmin', 'any', $member);
    }

    public function canDelete($member = null) {
        return Permission::check('CMS_ACCESS_MyAdmin', 'any', $member);
    }

    public function canCreate($member = null) {
        return Permission::check('CMS_ACCESS_MyAdmin', 'any', $member);
    }

    private static $summary_fields = array(
        'SubjectTitle'
    );

}

我寻找了一种使列表框工作的方法,但是在那里找不到适合您的东西,所以我以一种提供类似体验但不是列表框的方式来回答这个问题

使用该选项,可以将排序添加到GridField中,删除“添加新”按钮并保留“通过自动完成添加”具有相同的功能。它占用了更多的空间,但确实显示了主题的摘要,并允许打开记录,以及根据需要重新排序

我只包含了部分代码,因为缺少了一些对象(作者)。另外请注意,对于ModelAdmin中使用的DataObject(这是我在这里的假设),您不需要创建每个字段,因为它们是由$fields=parent::getCMSFields()为您构建的

希望这有帮助

class Theses extends DataObject {

    ...

    private static $many_many = array(
        'Subjects' => 'Subject'
    );

    public static $many_many_extraFields = array(
        'Subjects' => array(
            'SortOrder' => 'Int',
        ),
    );

    ...

    public function getCMSfields() {
        $fields = parent::getCMSFields();

        $gridSubjects = $fields->dataFieldByName('Subjects');
        $gridSubjects->getConfig()
            ->addComponent(GridFieldOrderableRows::create('SortOrder'))
            ->removeComponentsByType('GridFieldAddNewButton');

        $fields = FieldList::create(TabSet::create('Root'));
        $fields->addFieldsToTab('Root.Main', array(

            ...

            TextField::create('Notes'),
            TextAreaField::create('Summary'),
            DropdownField::create('DegreeCourse', 'DegreeCourse', array('BLIS' => 'BLIS', 'BLS' => 'BLS', 'MLIS' => 'MLIS', 'MLS' => 'MLS')),
            $gridSubjects
        ));

        return $fields;
    }
}

我寻找了一种使列表框工作的方法,但是在那里找不到适合您的东西,所以我以一种提供类似体验但不是列表框的方式来回答这个问题

使用该选项,可以将排序添加到GridField中,删除“添加新”按钮并保留“通过自动完成添加”具有相同的功能。它占用了更多的空间,但确实显示了主题的摘要,并允许打开记录,以及根据需要重新排序

我只包含了部分代码,因为缺少了一些对象(作者)。另外请注意,对于ModelAdmin中使用的DataObject(这是我在这里的假设),您不需要创建每个字段,因为它们是由$fields=parent::getCMSFields()为您构建的

希望这有帮助

class Theses extends DataObject {

    ...

    private static $many_many = array(
        'Subjects' => 'Subject'
    );

    public static $many_many_extraFields = array(
        'Subjects' => array(
            'SortOrder' => 'Int',
        ),
    );

    ...

    public function getCMSfields() {
        $fields = parent::getCMSFields();

        $gridSubjects = $fields->dataFieldByName('Subjects');
        $gridSubjects->getConfig()
            ->addComponent(GridFieldOrderableRows::create('SortOrder'))
            ->removeComponentsByType('GridFieldAddNewButton');

        $fields = FieldList::create(TabSet::create('Root'));
        $fields->addFieldsToTab('Root.Main', array(

            ...

            TextField::create('Notes'),
            TextAreaField::create('Summary'),
            DropdownField::create('DegreeCourse', 'DegreeCourse', array('BLIS' => 'BLIS', 'BLS' => 'BLS', 'MLIS' => 'MLIS', 'MLS' => 'MLS')),
            $gridSubjects
        ));

        return $fields;
    }
}