Passing values to editable GridField in extension

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);

}

}

Hey, did you find an answer for your question? I’m facing the same problem in my extension…

@welano no I haven’t sorry…