Javascript 控制某些项目的位置,同时对其余项目进行排序

Javascript 控制某些项目的位置,同时对其余项目进行排序,javascript,php,silverstripe,Javascript,Php,Silverstripe,我有一个ModelAdmin和MyDataObject有许多另一个dataobject,它控制着 class TestAdmin extends ModelAdmin { static $managed_models = array('MyDataObject'); static $url_segment = 'testadmin'; static $menu_title = 'TestAdmin'; } class MyDataObject extends DataO

我有一个
ModelAdmin
MyDataObject
有许多
另一个dataobject
,它控制着

class TestAdmin extends ModelAdmin {
    static $managed_models = array('MyDataObject');
    static $url_segment = 'testadmin';
    static $menu_title = 'TestAdmin';
}

class MyDataObject extends DataObject {
    private static $db = array('Name' => 'Varchar(255)');
    private static $has_many= array('AnotherDataObjects' => 'AnotherDataObject');

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

        if ($grid = $fields->dataFieldByName('AnotherDataObjects')) {
            $grid->getConfig()
                ->removeComponentsByType('GridFieldAddExistingAutocompleter')
                ->addComponent(new GridFieldOrderableRows('Priority'));

            $fields->removeByName('AnotherDataObjects');
            $fields->insertAfter($grid,'Name');
        }

        return $fields;
    }
}

class AnotherDataObject extends DataObject {
    private static $db = array(
        'Name'      => 'Varchar(255)',
        'Type'      => "Enum('Middle,Top,End','Middle')",
        'Priority'  => 'Int'
    );
    private static $has_one = array('MyDataObject' => 'MyDataObject');

    function onBeforeWrite() {
        parent::onBeforeWrite();

        if($this->Type == 'Top')
            $this->Priority = DB::query("SELECT MIN(Priority) FROM Type = 'Top'")->value();

        if($this->Type == 'End')
            $this->Priority = DB::query("SELECT MAX(Priority) FROM AnotherDataObjectWHERE Type = 'End'")->value() + 1;
    }
}

我想在
另一个数据对象上使用
Type
来控制排序顺序,以便顶部的项目保持在顶部,然后在末尾结束。我认为最简单的方法是防止“拖拽”或“掉落”到这些位置,并控制
onforebroite
中顶部/末端项目的优先级。。。但我不知道如何禁用这些“拖放”。。。或者如果有更好的方法?

您需要覆盖jQuery UI可排序初始化:

$(".ss-gridfield-orderable tbody").entwine({
    onadd: function() {
        // skipped code

        // the `cancel` option allows to exclude items from drag&drop sorting
        this.sortable({
                handle: ".handle",
                helper: helper,
                opacity: .7,
                update: update,
                cancel: ".ui-state-nosort"
            });
        },
    });
您需要将新类“.ui state nosort”添加到要从排序中排除的行中