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
Post a Comment