setTypes($blockTypes); $config = GridFieldConfig_Base::create(); $config->getComponentByType(GridFieldDataColumns::class)->setDisplayFields([ 'Icon' => '', 'Title' => 'Title', 'Enabled' => 'Enabled', ])->setFieldFormatting([ 'Icon' => static function ($v, Widget $item) { return ''.$item::config()->get('icon').''; }, 'Enabled' => static function ($v, Widget $item) { return $item->getField('Enabled') ? 'Yes' : 'No'; }, ]); $config->addComponent(new GridFieldEditButton()); $config->addComponent(new GridFieldDeleteAction(false)); $config->addComponent(new GridFieldDetailForm(null, false, false)); $config->addComponent(new GridFieldSortableRows('Sort')); if (!empty($blockTypes)) { /** @var GridFieldAddNewMultiClass $adder */ $adder = Injector::inst()->create(GridFieldAddNewMultiClass::class); $adder->setClasses($blockTypes); $config->addComponent($adder); } // By default, no need for a title on the editor. If there is more than one area then use `setTitle` to describe parent::__construct($name, '', $area->Widgets(), $config); $this->area = $area; $this->addExtraClass('element-editor__container no-change-track'); } /** * @param array $types * * @return $this */ public function setTypes($types) { $this->types = $types; return $this; } /** * @return array */ public function getTypes() { $types = $this->types; $this->extend('updateGetTypes', $types); return $types; } /** * @return ElementalArea */ public function getArea() { return $this->area; } public function saveInto(DataObjectInterface $dataObject) { parent::saveInto($dataObject); $elementData = $this->Value(); $idPrefixLength = strlen(sprintf(ElementalAreaController::FORM_NAME_TEMPLATE, '')); if (!$elementData) { return; } foreach ($elementData as $form => $data) { // Extract the ID $elementId = (int) substr($form, $idPrefixLength); // @var BaseElement $element $element = $this->getArea()->Widgets()->byID($elementId); if (!$element) { // Ignore invalid elements continue; } $data = ElementalAreaController::removeNamespacesFromFields($data, $element->ID); $element->updateFromFormData($data); $element->write(); } } }