# Editor example Multi-column layout

For complex forms that have a lot of visible fields, it can be useful to style the form to show in a multi-column layout, rather than in a single column. This can readily be done using a little CSS.

There are a number options to perform multi-column layout in CSS:

- Floating elements - shown in this example. This is compatible with all browsers and the flow is left to right.
- Multi-column layout - A CSS specification for multi-column layout. Flow is top to bottom.
- Flex-box - A modern standard for repeating layouts in CSS - not supported in IE9-. Flow can be top to bottom or left to right.

This examples shows the floating options due to its wide compatibility. Click the CSS tab below the table to see the CSS used.

For completeness, if you wish to use Flex-box, the CSS to use is:

    div.DTE_Body div.DTE_Body_Content div.DTE_Field {
    	width: 50%;
    	padding: 5px 20px;
    	box-sizing: border-box;
    }

    div.DTE_Body div.DTE_Form_Content {
    	display:flex;
    	flex-direction: row;
    	flex-wrap: wrap;
    }

While for CSS columns use:

    div.DTE_Form_Content {
    	columns: 2;
    }

    div.DTE_Field {
      margin: 0;
      padding: 1em !important;
      width: 100%;
      box-sizing: border-box;
    }

Name | Position | Office | Extn. | Start date | Salary
--- | --- | --- | --- | --- | ---
Name | Position | Office | Extn. | Start date | Salary

- Javascript
- HTML
- CSS
- Ajax
- Server-side script

The Javascript shown below is used to initialise the table shown in this example:

`var editor = new DataTable.Editor({ ajax: '../../controllers/staff.php', fields: [ { label: 'First name:', name: 'first_name' }, { label: 'Last name:', name: 'last_name' }, { label: 'Position:', name: 'position' }, { label: 'Office:', name: 'office' }, { label: 'Extension:', name: 'extn' }, { label: 'Start date:', name: 'start_date', type: 'datetime' }, { label: 'Salary:', name: 'salary' } ], table: '#example' }); $('#example').DataTable({ ajax: '../../controllers/staff.php', buttons: [ { extend: 'create', editor: editor }, { extend: 'edit', editor: editor }, { extend: 'remove', editor: editor } ], columns: [ { data: null, render: function (data, type, row) { // Combine the first and last names into a single table field return data.first_name + ' ' + data.last_name; } }, { data: 'position' }, { data: 'office' }, { data: 'extn' }, { data: 'start_date' }, { data: 'salary', render: DataTable.render.number(null, null, 0, '$') } ], dom: 'Bfrtip', select: true });`
`const editor = new DataTable.Editor({ ajax: '../../controllers/staff.php', fields: [ { label: 'First name:', name: 'first_name' }, { label: 'Last name:', name: 'last_name' }, { label: 'Position:', name: 'position' }, { label: 'Office:', name: 'office' }, { label: 'Extension:', name: 'extn' }, { label: 'Start date:', name: 'start_date', type: 'datetime' }, { label: 'Salary:', name: 'salary' } ], table: '#example' }); new DataTable('#example', { ajax: '../../controllers/staff.php', buttons: [ { extend: 'create', editor }, { extend: 'edit', editor }, { extend: 'remove', editor } ], columns: [ { data: null, render: data => data.first_name + ' ' + data.last_name }, { data: 'position' }, { data: 'office' }, { data: 'extn' }, { data: 'start_date' }, { data: 'salary', render: DataTable.render.number(null, null, 0, '$') } ], dom: 'Bfrtip', select: true });`

In addition to the above code, the following Javascript library files are loaded for use in this example:

- https://code.jquery.com/jquery-3.7.0.js
- https://cdn.datatables.net/1.13.5/js/jquery.dataTables.min.js
- https://cdn.datatables.net/buttons/2.4.1/js/dataTables.buttons.min.js
- https://cdn.datatables.net/select/1.7.0/js/dataTables.select.min.js
- https://cdn.datatables.net/datetime/1.5.1/js/dataTables.dateTime.min.js
- ../../js/dataTables.editor.min.js

The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

`div.DTE_Body div.DTE_Body_Content div.DTE_Field { float: left; width: 50%; padding: 5px 20px; clear: none; box-sizing: border-box; } div.DTE_Body div.DTE_Form_Content:after { content: ' '; display: block; clear: both; }`

The following CSS library files are loaded for use in this example to provide the styling of the table:

- https://cdn.datatables.net/1.13.5/css/jquery.dataTables.min.css
- https://cdn.datatables.net/buttons/2.4.1/css/buttons.dataTables.min.css
- https://cdn.datatables.net/select/1.7.0/css/select.dataTables.min.css
- https://cdn.datatables.net/datetime/1.5.1/css/dataTables.dateTime.min.css
- ../../css/editor.dataTables.min.css

This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.