php - SilverStripe ListboxField multiselect sort by user select -


i have many_many relation between theses , subjects. created listboxfield w/c accepts multiple values.

saving database not problem when view information again subject sorts user selection base on id of subject.

for example, user selects order [1,5,4,2]. once saved , viewed again display [1,2,4,5].

here 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') $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'     );  } 

i looked way make listbox work, not find there instead i'm answering question in way provides similar experience not listbox.

using gridfield extensions module sorting can added gridfield , removing "add new" button , leaving add via auto complete has same functionality. takes more space - show summary of subject , allow opening of record - reordering required.

i've included partial amount of code there missing objects (author). please note dataobject used within modeladmin (which assumption here) not need make each field scaffolded $fields = parent::getcmsfields();

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

Comments