控制一些项目的位置,而其余的可以排序

Controlling the Position of some items whilst the remainder can be sorted

本文关键字:排序 项目 位置 控制      更新时间:2023-09-26

我有一个ModelAdminMyDataObject has_many AnotherDataObject和SilverStripe网格字段扩展模块,控制

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;
    }
}

我想在AnotherDataObject上使用Type来控制排序顺序,以便Top项目保持在顶部,然后在末尾结束。我认为最简单的方法是防止玩家"掉入"或"掉入"这些位置,并控制onBeforeWrite中Top/End项目的优先级。但我不确定如何禁用那些从"拖放"…或者是否有更好的方法?

您需要重写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 '设置为要排除排序的行。
相关文章: