Version: current

# Class CompositeField

Base class for all fields that contain other fields. Implements sequentialisation - so that when we're saving / loading data, we can populate a tabbed form properly. All of the children are stored in $this->children

  Object
  ViewableData implements IteratorAggregate
  RequestHandler
  FormField
  CompositeField

### Direct known subclasses

`FieldGroup`, `Folder_UnusedAssetsField`, `SelectionGroup`, `Tab`, `TabSet`, `ToggleCompositeField`

### Indirect known subclasses

`PrintableTransformation_TabSet`

Package: forms\fields-structural
Located at sapphire/forms/CompositeField.php

## Methods summary

`public` | # `__construct( `FormField::$name` $children = null )` Create a new field. Create a new field. #### Parameters $children name The internal field name, passed to forms. #### Overrides `FormField::__construct`
`public` | # `FieldSet( )` Returns all the sub-fields, suitable for <% control FieldSet %> Returns all the sub-fields, suitable for <% control FieldSet %>
`public` | # `setID( mixed $id )`
`public` | # `Field( )` Returns the form field - used by templates. Although FieldHolder is generally what is inserted into templates, all of the field holder templates make use of $Field. It's expected that FieldHolder will give you the "complete" representation of the field on the form, whereas Field will give you the core editing widget, such as an input tag. Returns the form field - used by templates. Although FieldHolder is generally what is inserted into templates, all of the field holder templates make use of $Field. It's expected that FieldHolder will give you the "complete" representation of the field on the form, whereas Field will give you the core editing widget, such as an input tag. Our base FormField class just returns a span containing the value. This should be overridden! #### Overrides `FormField::Field`
`public `FieldSet`` | # `getChildren( )` Accessor method for $this->children Accessor method for $this->children #### Returns ``FieldSet`` FieldSet
`public` | # `setChildren( `FieldSet` $children )` #### Parameters $children FieldSet $children
`public` | # `collateDataFields( mixed & $list, mixed $saveableOnly = false )` Add all of the non-composite fields contained within this field to the list. Sequentialisation is used when connecting the form to its data source Add all of the non-composite fields contained within this field to the list. Sequentialisation is used when connecting the form to its data source
`public` | # `setForm( mixed $form )` Set the container form. This is called whenever you create a new form and put fields inside it, so that you don't have to worry about linking the two. Set the container form. This is called whenever you create a new form and put fields inside it, so that you don't have to worry about linking the two. #### Overrides `FormField::setForm`
`public` | # `setColumnCount( mixed $columnCount )`
`public` | # `isComposite( )` Returns true if this field is a composite field. To create composite field types, you should subclass `CompositeField`. Returns true if this field is a composite field. To create composite field types, you should subclass `CompositeField`. #### Overrides `FormField::isComposite`
`public` | # `hasData( )` Returns true if this field has its own data. Some fields, such as titles and composite fields, don't actually have any data. It doesn't make sense for data-focused methods to look at them. By overloading hasData() to return false, you can prevent any data-focused methods from looking at it. Returns true if this field has its own data. Some fields, such as titles and composite fields, don't actually have any data. It doesn't make sense for data-focused methods to look at them. By overloading hasData() to return false, you can prevent any data-focused methods from looking at it. #### See ``FieldSet::collateDataFields()`` #### Overrides `FormField::hasData`
`public` | # `fieldByName( mixed $name )`
`public` | # `push( `FormField` $field )` Add a new child field to the end of the set. Add a new child field to the end of the set.
`public` | # `insertBefore( mixed $field, mixed $insertBefore )` #### Uses ``FieldSet::insertBefore()``
`public` | # `insertAfter( mixed $field, mixed $insertAfter )`
`public` | # `removeByName( string $fieldName, boolean $dataFieldOnly = false )` Remove a field from this CompositeField by Name. The field could also be inside a CompositeField. Remove a field from this CompositeField by Name. The field could also be inside a CompositeField. #### Parameters $fieldName string $fieldName The name of the field $dataFieldOnly boolean $dataFieldOnly If this is true, then a field will only be removed if it's a data field. Dataless fields, such as tabs, will be left as-is.
`public` | # `replaceField( mixed $fieldName, mixed $newField )`
`public` | # `rootFieldSet( )` #### Overrides `FormField::rootFieldSet`
`public` | # `performReadonlyTransformation( )` Return a readonly version of this field. Keeps the composition but returns readonly versions of all the children Return a readonly version of this field. Keeps the composition but returns readonly versions of all the children #### Overrides `FormField::performReadonlyTransformation`
`public` | # `performDisabledTransformation( mixed $trans )` Return a readonly version of this field. Keeps the composition but returns readonly versions of all the children Return a readonly version of this field. Keeps the composition but returns readonly versions of all the children #### Overrides `FormField::performDisabledTransformation`
`public` | # `IsReadonly( )`
`public Position` | # `fieldPosition( string|`FormField` $field )` Find the numerical position of a field within the children collection. Doesn't work recursively. Find the numerical position of a field within the children collection. Doesn't work recursively. #### Parameters $field string|FormField #### Returns `Position` in children collection (first position starts with 0). Returns FALSE if the field can't be found.
`public` | # `makeFieldReadonly( string|`FormField` $field )` Transform the named field into a readonly feld. Transform the named field into a readonly feld. #### Parameters $field string|FormField
`public` | # `debug( )` #### Overrides `FormField::debug`
`public` | # `validate( mixed $validator )` Validation Functions for each field type by default formfield doesnt have a validation function Validation Functions for each field type by default formfield doesnt have a validation function #### Overrides `FormField::validate`

### Methods inherited from FormField

`FieldHolder()`, `LeftTitle()`, `Link()`, `Message()`, `MessageType()`, `Name()`, `Required()`, `RightTitle()`, `SmallFieldHolder()`, `Title()`, `Type()`, `Value()`, `addExtraAttribute()`, `addExtraClass()`, `allowHTML5()`, `allow_html5()`, `attrName()`, `attrTitle()`, `attrValue()`, `createTag()`, `dataValue()`, `describe()`, `extraClass()`, `fieldHolderTemplates()`, `fieldTemplates()`, `forTemplate()`, `getCustomValidationMessage()`, `getExtraClasses()`, `getForm()`, `getHTML5Attribute()`, `getTabIndex()`, `getTabIndexHTML()`, `hasClass()`, `id()`, `isDisabled()`, `isReadonly()`, `jsValidation()`, `name_to_label()`, `removeExtraAttribute()`, `removeExtraClass()`, `saveInto()`, `securityTokenEnabled()`, `setAutocomplete()`, `setContainerFieldSet()`, `setCustomValidationMessage()`, `setDisabled()`, `setError()`, `setFieldHolderTemplate()`, `setHTML5Attribute()`, `setLeftTitle()`, `setName()`, `setReadonly()`, `setRightTitle()`, `setSmallFieldHolderTemplate()`, `setTabIndex()`, `setTemplate()`, `setTitle()`, `setValue()`, `smallFieldHolderTemplates()`, `transform()`, `useHTML5()`, `use_html5()`

### Methods inherited from RequestHandler

`allowedActions()`, `checkAccessAction()`, `getRequest()`, `handleRequest()`, `hasAction()`, `httpError()`

### Methods inherited from ViewableData

`ATT_val()`, `BaseHref()`, `CSSClasses()`, `ColumnBreak()`, `ColumnCalc()`, `ColumnNumber()`, `ColumnPad()`, `ColumnPos()`, `CurrentMember()`, `CurrentPage()`, `Debug()`, `Even()`, `EvenOdd()`, `First()`, `FirstLast()`, `HasPerm()`, `IsAjax()`, `JS_val()`, `Last()`, `Me()`, `Middle()`, `MiddleString()`, `Modulus()`, `MultipleOf()`, `Odd()`, `Pos()`, `RAW_val()`, `SQL_val()`, `ThemeDir()`, `ThemeName()`, `Top()`, `TotalItems()`, `XML_val()`, `__get()`, `__isset()`, `__set()`, `buildCastingCache()`, `cachedCall()`, `castingClass()`, `castingHelper()`, `castingHelperPair()`, `castingObjectCreator()`, `castingObjectCreatorPair()`, `customise()`, `defineMethods()`, `escapeTypeForField()`, `getField()`, `getIterator()`, `getSecurityID()`, `getXMLValues()`, `hasField()`, `hasValue()`, `i18nLocale()`, `iteratorProperties()`, `obj()`, `renderWith()`, `setCustomisedObj()`, `setField()`

### Methods inherited from Object

`__call()`, `__toString()`, `__wakeup()`, `addMethodsFrom()`, `addStaticVars()`, `addWrapperMethod()`, `add_extension()`, `add_static_var()`, `allMethodNames()`, `cacheToFile()`, `cacheToFileWithArgs()`, `clearCache()`, `combined_static()`, `create()`, `createMethod()`, `create_from_string()`, `exists()`, `extInstance()`, `extend()`, `getCustomClass()`, `getExtensionInstance()`, `getExtensionInstances()`, `get_extensions()`, `get_static()`, `hasExtension()`, `hasMethod()`, `has_extension()`, `invokeWithExtensions()`, `is_a()`, `loadCache()`, `parentClass()`, `parse_class_spec()`, `remove_extension()`, `sanitiseCachename()`, `saveCache()`, `set_stat()`, `set_static()`, `set_uninherited()`, `stat()`, `strong_create()`, `uninherited()`, `uninherited_static()`, `useCustomClass()`

### Magic methods summary

## Properties summary

`protected `FieldSet`` | $children | #
`protected mixed` | $readonly | # Set to true when this field is a readonly field Set to true when this field is a readonly field
`protected mixed` | $columnCount | # int Toggle different css-rendering for multiple columns ("onecolumn", "twocolumns", "threecolumns"). The content is determined by the $children-array, so wrap all items you want to have grouped in a column inside a CompositeField. Caution: Please make sure that this variable actually matches the count of your $children. int Toggle different css-rendering for multiple columns ("onecolumn", "twocolumns", "threecolumns"). The content is determined by the $children-array, so wrap all items you want to have grouped in a column inside a CompositeField. Caution: Please make sure that this variable actually matches the count of your $children.

### Properties inherited from FormField

`$autocomplete`, `$containerFieldSet`, `$customValidationMessage`, `$description`, `$disabled`, `$dontEscape`, `$extraAttributes`, `$extraClass`, `$extraClasses`, `$fieldHTML5`, `$fieldHolderTemplate`, `$form`, `$html5Attributes`, `$leftTitle`, `$message`, `$messageType`, `$name`, `$possible_autocomplete_values`, `$rightTitle`, `$smallFieldHolderTemplate`, `$tabIndex`, `$template`, `$title`, `$use_html5`, `$value`

### Properties inherited from RequestHandler

`$allowed_actions`, `$brokenOnConstruct`, `$request`, `$url_handlers`

### Properties inherited from ViewableData

`$casting`, `$customisedObject`, `$default_cast`, `$failover`, `$iteratorPos`, `$iteratorTotalItems`

### Properties inherited from Object

`$class`, `$extension_instances`, `$extensions`

[Raise a SilverStripe Framework issue/bug](https://github.com/silverstripe/silverstripe-framework/issues/new)
- [Raise a SilverStripe CMS issue/bug](https://github.com/silverstripe/silverstripe-cms/issues/new)
- Please use the Silverstripe Forums to ask development related questions. -