Ich habe ein ModelAdmin
mit MyDataObject
has_many AnotherDataObject
und SilverStripe Grid Field Extensions Module sortiert werden, die diedie Position einiger Elemente, während der Rest steuern kann
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;
}
}
Ich mag kontrolliert würde Type
auf AnotherDataObject
verwenden, um die Sortierreihenfolge zu steuern damit die Top-Elemente oben bleiben und dann am Ende enden. Ich denke, der einfachste Weg wäre, zu verhindern, dass man in diese Positionen "drapieren" oder "fallen lassen kann" und die Priorität für die Top-/End-Items innerhalb von onBeforeWrite
... aber ich bin mir nicht sicher, wie ich diese deaktivieren kann " Drag/Drop "... oder wenn es einen besseren Weg gibt?