需要的是Service
和Location
之間的$many_many
關係。我們希望有多對多的關係,因爲服務可以有很多地點,而且一個地點可以有很多服務。要了解有關使用$many_many
關係的更多信息,請參閱this lesson或this documentation。
一旦我們有一個$many_many
關係定義,我們可以添加一個CheckboxSetField
來控制這種關係。
注意,我已經改名爲Locations
類Location
和Services
到Service
因爲我認爲類的名稱應爲單數。
服務
class Service extends DataObject {
private static $db = array(
'Name' => 'Varchar'
);
private static $belongs_many_many = array(
'Locations' => 'Location'
);
private static $summary_fields = array(
'Name' => 'Title'
);
private static $field_labels = array(
'Name'
);
public function getCMSFields() {
$fields = parent::getCMSFields();
if ($this->ID) {
$fields->addFieldToTab('Root.Locations', CheckboxSetField::create(
'Locations',
'Locations',
Location::get()->map()
));
}
return $fields;
}
}
在Location
我們添加一個$belongs_many_many
關係回到Service
所以我們可以控制雙方這種關係。
位置
class Location extends DataObject {
private static $db = array(
'Name' => 'Varchar',
'AcceptingAppointments' => 'Boolean'
);
private static $many_many = array(
'Services' => 'Service'
);
private static $summary_fields = array(
'Name',
'AcceptingAppointmentsNice'
);
private static $field_labels = array(
'Name' => 'Title',
'AcceptingAppointmentsNice' => 'Accepting Appointments?'
);
public function AcceptingAppointmentsNice() {
return $this->AcceptingAppointments ? 'Yes' : 'No';
}
public function getCMSFields() {
$fields = parent::getCMSFields();
if ($this->ID) {
$fields->addFieldToTab('Root.Services', CheckboxSetField::create(
'Services',
'Services',
Service::get()->map()
));
}
return $fields;
}
}
到CheckboxSetField
另外也可以將ListboxField
。 ListboxField
是一個整齊的下拉多選字段。如果選項列表非常長,這很有用。
class Service extends DataObject {
// ...
public function getCMSFields() {
$fields = parent::getCMSFields();
if ($this->ID) {
$fields->addFieldToTab('Root.Locations', ListboxField::create(
'Locations',
'Locations',
Location::get()->map('ID', 'Name')->toArray(),
array(),
null,
true
));
}
return $fields;
}
}
另請注意,$summary_fields
必須聲明爲一個private
變量,而不是public
變量。
哇......那很完美!非常感謝你的回答 - 它回答了我的確切問題,證實了我的一些想法,並且似乎已經按照我的意願設置了一切。 –