I solved this as follows:
I wanted to allow registrants members to indicate which key "Regions" they were interested in.
In the form I included this code to initialise the list box:
$member = Member::CurrentMember();
// initialise field values so already selected regions are shown in list box
if($member) {
// initialise Region Values
$wherevalue = 'Member_Regions.MemberID=' . $member->ID;
$memberregions = DataObject::get('Region',$wherevalue,'',"LEFT JOIN `Member_Regions` ON `Region`.`ID` = `Member_Regions`.`RegionID`");
$memberregionsIDs = array();
if($memberregions) {
foreach ($memberregions as $memberregion) {
$memberregionsIDs[] = (string)$memberregion->ID;
}
}
} else {
$memberregionsIDs[] = '';
}
// Initialise Region Title
$regionTitle = 'Select one or more Regions below:';
// create field set
$region = DataObject::get('Region');
if ($region) {
$regionsize = ($region->Count()+1);
$region = $region->toDropdownMap('ID', 'Title', '(Select one or more options)', true);
}
$fields->push(new ListBoxField(
$name = 'regionIDs',
$title = $regionTitle,
$source = $region,
$value = $memberregionsIDs,
$size = 10,
$multiple = true
));
The form data selected in the list box was then processed as follows:
// Create a new Member object and load the form data into it
$newmember = new Member();
// Check if new entry is for logged-in member
if($member = Member::CurrentMember()) {
if($newmember->ID = $member->ID) {
$newmember = $member;
}
}
$regions = $data['regionIDs'];
// remove existing Regions for this Member
$wherevalue = 'Member_Regions.MemberID=' . $newmember->ID;
$memberregions = DataObject::get('Region',$wherevalue,'',"LEFT JOIN `Member_Regions` ON `Region`.`ID` = `Member_Regions`.`RegionID`");
if($memberregions) {
foreach ($memberregions as $memberregion) {
$newmember->Regions()->remove($memberregion);
}
}
// add new Regions for this Member
if($regions) {
foreach ($regions as $region) {
$regionID = (int)$region;
$newmember->Regions()->add($regionID);
}
}
$newmember->write();