Version: current

# Class ComplexTableField

Provides a tabuar list in your form with view, edit and add links to edit records with a "has-one"-relationship. Detail-views are shown in a greybox-iframe. Features pagination in the overview as well as the detail-views.

CAUTION: You need to make sure that the original form-call to the main controller (e.g. EditForm()) returns a form which includes this field even if no data is loaded, to provide a "starting point" for action_callfieldmethod and ReferencedField.

All URL data sent to and from ComplexTableField is encapsulated in $_REQUEST['ctf'] to avoid side-effects with the main controller.

Example-URL for a "DetailForm"-call explained: "/admin/family/?executeForm=EditForm&action_callfieldmethod&fieldName=Individual&childID=7&methodName=edit" - executeForm Name of the form on the main rendering page (e.g. "FamilyAdmin") - action_callfieldmethod Trigger to call a method of a single field in "EditForm" instead of rendering the whole thing - fieldName Name of the targeted formField - methodName Method on the formfield (e.g. "ComplexTableField") - childID Identifier of the database-record (the targeted table is determined by the $sourceClass parameter)

  Object
  ViewableData implements IteratorAggregate
  RequestHandler
  FormField
  TableListField
  ComplexTableField

### Direct known subclasses

`AssetTableField`, `CommentTableField`, `DataObjectManager`, `HasManyComplexTableField`, `MemberTableField`

### Indirect known subclasses

`AssetManager`, `DocumentPageFiles_Manager`, `ImageDataObjectManager`, `ManyManyComplexTableField`, `ManyManyDataObjectManager`, `ManyManyFileDataObjectManager`, `Mediaweb3DPageFiles_Manager`, `MediawebPageFiles_Manager`, `MediawebPagePhoto_Manager`, `MediawebPageTexture_Manager`, `PhotoAlbumManager`, `VideoManager`, `FileComplexTableField`, `FileDataObjectManager`, `HasManyDataObjectManager`, `HasManyFileDataObjectManager`, `HasOneComplexTableField`, `HasOneDataObjectManager`, `HasOneFileDataObjectManager`, `ImageAssetManager`

Package: forms\fields-relational
Located at sapphire/forms/ComplexTableField.php

## Methods summary

`public` | # `handleItem( mixed $request )` #### Overrides `TableListField::handleItem`
`public` | # `getViewer( )`
`public` | # `setPopupSize( mixed $width, mixed $height )`
`public` | # `PopupWidth( )`
`public` | # `PopupHeight( )`
`public` | # `__construct( `ContentController` $controller, string $name, string $sourceClass, array $fieldList = null, `FieldSet` $detailFormFields = null, string $sourceFilter = "", string $sourceSort = "", string $sourceJoin = "" )` See class comments See class comments #### Parameters $controller ContentController $controller $name string $name $sourceClass string $sourceClass $fieldList array $fieldList $detailFormFields FieldSet $detailFormFields $sourceFilter string $sourceFilter $sourceSort string $sourceSort $sourceJoin string $sourceJoin #### Overrides `TableListField::__construct`
`public` | # `sourceFilter( )` Return the record filter for this table. It will automatically add a relation filter if relationAutoSetting is true, and it can determine an appropriate filter. Return the record filter for this table. It will automatically add a relation filter if relationAutoSetting is true, and it can determine an appropriate filter. #### Overrides `TableListField::sourceFilter`
`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 String` | # `FieldHolder( )` #### Returns `String` String #### Overrides `TableListField::FieldHolder`
`public` | # `sourceClass( )` #### Overrides `TableListField::sourceClass`
`public `DataObjectSet`` | # `Items( )` #### Returns ``DataObjectSet`` DataObjectSet #### Overrides `TableListField::Items`
`public` | # `setPopupCaption( mixed $caption )` Sets the popup-title by javascript. Make sure to use FormResponse in ajax-requests, otherwise the title-change will only take effect on items existing during page-load. Sets the popup-title by javascript. Make sure to use FormResponse in ajax-requests, otherwise the title-change will only take effect on items existing during page-load. #### Parameters $caption $caption String
`public` | # `setDetailFormValidator( `Validator` $validator )` #### Parameters $validator $validator Validator
`public` | # `setAddTitle( mixed $addTitle )`
`public` | # `Title( )` Returns the field label - used by templates. Returns the field label - used by templates. #### Overrides `TableListField::Title`
`public `Int`` | # `ItemCount( )` Calculates the number of columns needed for colspans used in template Calculates the number of columns needed for colspans used in template #### Returns ``Int`` Int
`public `Boolean`` | # `IsAddMode( )` Used to toggle paging (makes no sense when adding a record) Used to toggle paging (makes no sense when adding a record) #### Returns ``Boolean`` Boolean
`public `Int`` | # `sourceID( )` #### Returns ``Int`` Int #### Overrides `TableListField::sourceID`
`public` | # `AddLink( )`
`public `FieldSet`` | # `createFieldSet( )` #### Returns ``FieldSet`` FieldSet
`public` | # `setController( mixed $controller )`
`public String` | # `getParentClass( )` Determines on which relation-class the DetailForm is saved by looking at the surrounding form-record. Determines on which relation-class the DetailForm is saved by looking at the surrounding form-record. #### Returns `String` String
`public` | # `getParentRecord( )` Return the record in which the CTF resides, if it exists. Return the record in which the CTF resides, if it exists.
`public` | # `setParentClass( mixed $className )` (Optional) Setter for a correct parent-relation-class. Defaults to the record loaded into the surrounding form as a fallback. Caution: Please use the classname, not the actual column-name in the database. (Optional) Setter for a correct parent-relation-class. Defaults to the record loaded into the surrounding form as a fallback. Caution: Please use the classname, not the actual column-name in the database. #### Parameters $className $className string
`public` | # `getParentIdName( mixed $parentClass, mixed $childClass )` Returns the db-fieldname of the currently used has_one-relationship. Returns the db-fieldname of the currently used has_one-relationship.
`public` | # `setParentIdName( String $str )` Manually overwrites the parent-ID relations. Manually overwrites the parent-ID relations. #### Parameters $str String $str Example: FamilyID (when one Individual has_one Family) #### See ``ComplexTableField::setParentClass()``
`public` | # `getParentIdNameRelation( mixed $parentClass, mixed $childClass, mixed $relation )` Returns the db-fieldname of the currently used relationship. Note: constructed resolve ambiguous cases in the same manner as DataObject::getComponentJoinField() Returns the db-fieldname of the currently used relationship. Note: constructed resolve ambiguous cases in the same manner as DataObject::getComponentJoinField()
`public` | # `setTemplatePopup( mixed $template )`
`public` | # `getCustomFieldsFor( mixed $childData )` Return the object-specific fields for the given record, to be shown in the detail pop-up Return the object-specific fields for the given record, to be shown in the detail pop-up This won't include all the CTF-specific 'plumbing; this method is called by self::getFieldsFor() and the result is then processed further to get the actual FieldSet for the form. The default implementation of this processes the value of $this->detailFormFields; consequently, if you want to set the value of the fields to something that $this->detailFormFields doesn't allow, you can do so by overloading this method.
`public` | # `getFieldsFor( mixed $childData )`
`public` | # `getValidatorFor( mixed $childData )`
`public` | # `add( )`
`public` | # `AddForm( mixed $childID = null )`
`public` | # `setRelationAutoSetting( boolean $value )` By default, a ComplexTableField will assume that the field name is the name of a has-many relation on the object being edited. It will identify the foreign key in the object being listed, and filter on that column, as well as auto-setting that column for newly created records. By default, a ComplexTableField will assume that the field name is the name of a has-many relation on the object being edited. It will identify the foreign key in the object being listed, and filter on that column, as well as auto-setting that column for newly created records. Calling $this->setRelationAutoSetting(false) will disable this functionality. #### Parameters $value boolean $value Should the relation auto-setting functionality be enabled?
`public` | # `saveComplexTableField( mixed $data, mixed $form, mixed $params )` Use the URL-Parameter "action_saveComplexTableField" to provide a clue to the main controller if the main form has to be rendered, even if there is no action relevant for the main controller (to provide the instance of ComplexTableField which in turn saves the record. Use the URL-Parameter "action_saveComplexTableField" to provide a clue to the main controller if the main form has to be rendered, even if there is no action relevant for the main controller (to provide the instance of ComplexTableField which in turn saves the record. This is for adding new item records. `ComplexTableField_ItemRequest::saveComplexTableField()` #### See Form::ReferencedField

### Methods inherited from TableListField

`Actions()`, `BaseLink()`, `Can()`, `CurrentLink()`, `ExportLink()`, `FieldList()`, `FirstItem()`, `FirstLink()`, `GroupedItems()`, `HasGroupedItems()`, `HasSummary()`, `Headings()`, `LastItem()`, `LastLink()`, `ListStart()`, `Name()`, `NamePlural()`, `NameSingular()`, `NextLink()`, `PageSize()`, `PrevLink()`, `PrintLink()`, `ShowPagination()`, `SummaryFields()`, `SummaryTitle()`, `TotalCount()`, `Utility()`, `addSummary()`, `ajax_refresh()`, `colFunction_avg()`, `colFunction_sum()`, `delete()`, `disableSorting()`, `export()`, `filterString()`, `generateExportFileData()`, `getCastedValue()`, `getCsvQuery()`, `getCsvSeparator()`, `getExtraLinkParams()`, `getPermissions()`, `getQuery()`, `index()`, `isFieldSortable()`, `performReadonlyTransformation()`, `permissions_for_object()`, `printall()`, `removeCsvHeader()`, `removeSummary()`, `setCSVFieldFormatting()`, `setClick_AjaxLoad()`, `setClick_PopupLoad()`, `setCsvSeparator()`, `setCustomCsvQuery()`, `setCustomQuery()`, `setCustomSourceItems()`, `setExtraLinkParams()`, `setFieldCasting()`, `setFieldFormatting()`, `setFieldList()`, `setFieldListCsv()`, `setHighlightConditions()`, `setPageSize()`, `setPermissions()`, `setShowPagination()`, `setTemplate()`, `sourceItems()`

### Methods inherited from FormField

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

### 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 mixed` | $addTitle | # Determines the fields of the detail pop-up form. It can take many forms: - A FieldSet object: Use that field set directly. - A method name, eg, 'getCMSFields': Call that method on the child object to get the fields. Determines the fields of the detail pop-up form. It can take many forms: - A FieldSet object: Use that field set directly. - A method name, eg, 'getCMSFields': Call that method on the child object to get the fields.
`protected mixed` | $detailFormFields | #
`protected mixed` | $viewAction | #
`protected mixed` | $sourceJoin | #
`protected mixed` | $sourceItems | #
`protected `Controller`` | $controller | #
`public string` | $parentClass | # Classname of the parent-relation to correctly link new records. Classname of the parent-relation to correctly link new records.
`protected string` | $parentIdName | # Database column name for the used relation (e.g. FamilyID if one Family has_many Individuals). Database column name for the used relation (e.g. FamilyID if one Family has_many Individuals).
`protected array` | $permissions | # Influence output without having to subclass the template. Influence output without having to subclass the template.
`protected string` | $template | # Template for main rendering Template for main rendering
`public string` | $templatePopup | # Template for popup (form rendering) Template for popup (form rendering)
`public string` | $itemClass | # Classname for each row/item Classname for each row/item
`public string` | $popupClass | # Classname for the popup form Classname for the popup form
`protected boolean` | $showPagination | # Trigger pagination (defaults to true for ComplexTableField) Trigger pagination (defaults to true for ComplexTableField)
`protected string` | $popupCaption | # Caption the popup will show (defaults to the selected action). This is set by javascript and used by greybox. Caption the popup will show (defaults to the selected action). This is set by javascript and used by greybox.
`public callable` | $requirementsForPopupCallback | # A function callback invoked after initializing the popup and its base calls to the `Requirements` class. A function callback invoked after initializing the popup and its base calls to the `Requirements` class.
`protected mixed` | $detailFormValidator | # Validator Validator
`protected boolean` | $relationAutoSetting | # Automatically detect a has-one relationship in the popup (=child-class) and save the relation ID. Automatically detect a has-one relationship in the popup (=child-class) and save the relation ID.
`protected integer` | $popupWidth | # Default size for the popup box Default size for the popup box
`protected integer` | $popupHeight | #
`public string` | $defaultAction | # String Action being executed when clicking on table-row (defaults to "show"). Mostly needed in ComplexTableField-subclass. String Action being executed when clicking on table-row (defaults to "show"). Mostly needed in ComplexTableField-subclass.
`public array` | $actions | # array Action that can be performed on a single row-entry. Has to correspond to a method in a TableListField-class (or subclass). Actions can be disabled through $permissions. Format (key is used for the methodname and CSS-class): array( 'delete' => array( 'label' => 'Delete', 'icon' => 'cms/images/delete.gif', 'icon_disabled' => 'cms/images/delete_disabled.gif', 'class' => 'deletelink', ) ) array Action that can be performed on a single row-entry. Has to correspond to a method in a TableListField-class (or subclass). Actions can be disabled through $permissions. Format (key is used for the methodname and CSS-class): array( 'delete' => array( 'label' => 'Delete', 'icon' => 'cms/images/delete.gif', 'icon_disabled' => 'cms/images/delete_disabled.gif', 'class' => 'deletelink', ) )
`public static array` | $url_handlers | # The default URL handling rules. This specifies that the next component of the URL corresponds to a method to be called on this RequestHandlingData object. The default URL handling rules. This specifies that the next component of the URL corresponds to a method to be called on this RequestHandlingData object. The keys of this array are parse rules. See `SS_HTTPRequest::match()` for a description of the rules available. The values of the array are the method to be called if the rule matches. If this value starts with a '$', then the named parameter of the parsed URL wil be used to determine the method name.

### Properties inherited from TableListField

`$IsReadOnly`, `$Markable`, `$MarkableTitle`, `$__cachedQuery`, `$cachedSourceItems`, `$clickAction`, `$csvFieldEscape`, `$csvFieldFormatting`, `$csvHasHeader`, `$csvSeparator`, `$customCsvQuery`, `$customQuery`, `$customSourceItems`, `$disableSorting`, `$exportButtonLabel`, `$extraLinkParams`, `$fieldCasting`, `$fieldFormatting`, `$fieldList`, `$fieldListCsv`, `$groupByField`, `$highlightConditions`, `$methodName`, `$pageSize`, `$paginationBaseLink`, `$readOnly`, `$sourceClass`, `$sourceFilter`, `$sourceSort`, `$summaryFieldList`, `$summaryTitle`, `$totalCount`

### Properties inherited from FormField

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

### Properties inherited from RequestHandler

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

### 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. -