Silverstripe Version: 4.7.3
Question: I have a gridifeld displaying rows from a has_many list which works fine on the data object, but not if I move it into an extension. Am using Symbiote\GridFieldExtensions\GridFieldEditableColumns
Specifically I set the calendar config for the DateField, eg.
‘minDate’ => $this->DateTimeStart,
‘maxDate’ => $this->DateTimeEnd
This sets the available date range to be the event start and finish. Works fine on DataObject.
If however, I move this code into an extension of the event, I would expect the following to work:
‘minDate’ => $this->owner->DateTimeStart,
‘maxDate’ => $this->owner->DateTimeEnd
I get the error: “Trying to get property ‘DateTimeStart’ of non-object”. How do I correctly pass the info through to the grid field in the extension?
Working example of grid field in data object below.
class Event extends DataObject {
private static $has_many = ['VenueBookings' => VenueBooking::class];
public function getCMSFields() {
$fields = parent::getCMSFields();
$fields->addFieldToTab('Root.Venues',
GridField::create('VenueBookings','Venue Bookings',$this->VenueBookings(),
GridFieldConfig_RecordEditor::create()
->removeComponentsByType([
GridFieldDataColumns::class,
GridFieldFilterHeader::class,
GridFieldAddNewButton::class,
GridField_ActionMenu::class
])
// add editbale columns before edit button, then remove it (so delete button ends up on right)
->addComponent($venuesgf_cols = new GridFieldEditableColumns(),GridFieldEditButton::class)
->addComponent($add_btn = new GridFieldAddNewInlineButton())
->removeComponentsByType([GridFieldEditButton::class])
)->setDescription('<p class="message" style="margin-top:10px;"><i class="fa fa-info-circle"></i> To reset venue bookings to default, delete all current bookings and save.</p>')
);
$add_btn->setTitle('Assign Venue');
$venuesgf_displayfields = [
'VenueID' => [
'title' => 'Venue',
'callback' => function($record, $column, $grid) {
return DropdownField::create($column)
->setSource(Venue::get()->map('ID','Title'))
->setEmptyString('< select venue >');
}
],
'DateStart' => [
'title' => 'Start',
'callback' => function($record, $column, $grid) {
$field = DateField::create($column);
$field->setCalendarConfig([
'minDate' => $this->DateTimeStart,
'maxDate' => $this->DateTimeEnd
]);
return $field;
}
],
'DateEnd' => [
'title' => 'End',
'callback' => function($record, $column, $grid) {
$field = DateField::create($column);
$field->setCalendarConfig([
'minDate' => $this->DateTimeStart,
'maxDate' => $this->DateTimeEnd
]);
return $field;
}
],
'SpacesRemaining' => [
'title' => 'Spaces',
'field' => ReadOnlyField::class
],
'OverlappingEventsList' => [
'title' => 'Overlapping Events',
'field' => ReadOnlyField::class
]
];
$venuesgf_cols->setDisplayFields($venuesgf_displayfields);
return $fields;
}
}
Second example in extension (not working):
class VenueBookingsEventExtension extends DataExtension {
public function updateCMSFields(FieldList $fields) {
$fields->addFieldToTab('Root.Venues',
GridField::create('VenueBookings','Venue Bookings',$this->owner->VenueBookings(),
GridFieldConfig_RecordEditor::create()
->removeComponentsByType([
GridFieldDataColumns::class,
GridFieldFilterHeader::class,
GridFieldAddNewButton::class,
GridField_ActionMenu::class
])
// add editbale columns before edit button, then remove it (so delete button ends up on right)
->addComponent($venuesgf_cols = new GridFieldEditableColumns(),GridFieldEditButton::class)
->addComponent($add_btn = new GridFieldAddNewInlineButton())
->removeComponentsByType([GridFieldEditButton::class])
)->setDescription('<p class="message" style="margin-top:10px;"><i class="fa fa-info-circle"></i> To reset venue bookings to default, delete all current bookings and save.</p>')
);
$add_btn->setTitle('Assign Venue');
$venuesgf_displayfields = [
'VenueID' => [
'title' => 'Venue',
'callback' => function($record, $column, $grid) {
return DropdownField::create($column)
->setSource(Venue::get()->map('ID','Title'))
->setEmptyString('< select venue >');
}
],
'DateStart' => [
'title' => 'Start',
'callback' => function($record, $column, $grid) {
$field = DateField::create($column);
$field->setCalendarConfig([
'minDate' => $this->owner->DateTimeStart,
'maxDate' => $this->owner->DateTimeEnd
]);
return $field;
}
],
'DateEnd' => [
'title' => 'End',
'callback' => function($record, $column, $grid) {
$field = DateField::create($column);
$field->setCalendarConfig([
'minDate' => $this->owner->DateTimeStart,
'maxDate' => $this->owner->DateTimeEnd
]);
return $field;
}
],
'SpacesRemaining' => [
'title' => 'Spaces',
'field' => ReadOnlyField::class
],
'OverlappingEventsList' => [
'title' => 'Overlapping Events',
'field' => ReadOnlyField::class
]
];
$venuesgf_cols->setDisplayFields($venuesgf_displayfields);
}
}