2016-09-26 1 views
1

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?

Antwort

2

Sie benötigen jQuery UI sortierbaren Initialisierung außer Kraft zu setzen:

$(".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" 
      }); 
     }, 
    }); 

Sie müssen neue Klasse hinzuzufügen ‚.ui-state-NOSORT‘ auf die Zeilen, die Sie aus dem Sortieren ausschließen möchten.

Verwandte Themen