/** * This should be updateCMSFields and configured to be called last but configuration * priority does not seem to work to force this to be the last loaded/called extension. * * For now will call via extend.manualUpdate with the field list in ArtisanModel.getCMSFields * * @param FieldList $fields */ public function manualUpdateCMSFields(FieldList $fields) { // $formFields = $fields->dataFields(); $formFields = $fields->VisibleFields(); $selectorFieldName = parent::get_config_setting('selector_field_name'); $hiddenCSSClass = parent::get_config_setting('hidden_css_class'); $provider = Injector::inst()->get('AdaptableFormMetaDataProvider'); $defaultFieldNames = $provider->getDefaultFieldNames(); // keep track of fields we have encountered in the spec, other fields will be hidden, // we can initialise this to defaultFieldNames as we don't want to hide these ever $handled = array_combine($defaultFieldNames, $defaultFieldNames); // we want to get the form so we can remove fields later $form = null; $metaData = $provider->getMetaData(); // the master list of content types by field name $this->contentTypes = []; foreach ($metaData as $contentType => $fieldSpec) { if (isset($fieldSpec['FormFields'])) { $fieldDefinitions = $fieldSpec['FormFields']; $specFields = array_merge($fieldDefinitions, $defaultFieldNames); $this->processFieldList($formFields, $contentType, $selectorFieldName, $specFields, $defaultFieldNames, $handled); } } $this->hideUnhandled($formFields, $handled, $hiddenCSSClass); }
/** * Test VisibleFields and HiddenFields */ public function testVisibleAndHiddenFields() { $fields = new FieldList(new TextField("A"), new TextField("B"), new HiddenField("C"), new Tabset("Root", new Tab("D", new TextField("D1"), new HiddenField("D2")))); $hidden = $fields->HiddenFields(); // Inside hidden fields, all HiddenField objects are included, even nested ones $this->assertNotNull($hidden->dataFieldByName('C')); $this->assertNotNull($hidden->dataFieldByName('D2')); // Visible fields are not $this->assertNull($hidden->dataFieldByName('B')); $this->assertNull($hidden->dataFieldByName('D1')); $visible = $fields->VisibleFields(); // Visible fields exclude top level HiddenField objects $this->assertNotNull($visible->dataFieldByName('A')); $this->assertNull($visible->dataFieldByName('C')); // But they don't exclude nested HiddenField objects. This is a limitation; you should // put all your HiddenFields at the top level. $this->assertNotNull($visible->dataFieldByName('D2')); }