2016-07-21 7 views
1

Ich habe eine many_many Beziehung zwischen meinem Theses und Subjects. Ich erstellte eine ListboxField w/c akzeptiert mehrere Werte.SilverStripe ListboxField Multiselect Sortieren nach Benutzer wählen

Speichern in der Datenbank war kein Problem, aber wenn ich die Informationen erneut anzeigen, sortiert der Betreff die Benutzerauswahlbasis auf ID des Betreffs.

Zum Beispiel wählt der Benutzer die Reihenfolge [1,5,4,2]. Einmal gespeichert und erneut angezeigt wird es wie folgt angezeigt [1,2,4,5].

Hier ist mein Code:

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

Subject.php

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' 
    ); 

} 

Antwort

0

ich für eine Art und Weise sah die ListBox Arbeit zu machen, konnte aber Ich finde nichts für dich dort, also beantworte ich diese Frage auf eine Art und Weise, die ein ähnliches Beispiel liefert Erfahrung, aber keine ListBox.

Mit der GridField Extensions Module kann die Sortierung zu einem GridField hinzugefügt werden, und das Entfernen der Schaltfläche "Add new" und das Hinzufügen von add über Auto Complete hat die gleiche Funktionalität. Es nimmt mehr Platz in Anspruch - zeigt aber die Zusammenfassung des Themas und ermöglicht das Öffnen des Datensatzes - ebenso wie das Nachbestellen nach Bedarf.

Ich habe nur eine Teilmenge des Codes enthalten, da einige Objekte fehlten (Autor). Bitte beachten Sie auch, dass Sie für ein DataObject, das in ModelAdmin verwendet wird (was hier meine Annahme ist), nicht jedes Feld als Gerüst für Sie erstellen müssen, indem Sie $ fields = parent :: getCMSFields();

this helps

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