# Editor example REST interface

REST interfaces are popular in CRUD applications as it provides a clean and well defined interface between the client and server. Editor can be fully integrated with a REST environment through its ability to specify different URLs for the create, edit and remove actions of Editor. This is done by giving `ajax` as an object with the `create`, `edit` and `remove` properties specified with the URL to use for each action, as shown in this example.

In addition to being able to specify a unique URL for each action, you can also specify full jQuery Ajax options for each action by giving the Ajax properties as an object. In this example the `type` option is used to specify the HTTP method to be used for each action, as REST interfaces typically require. Note also that the server returns a 400 Bad request response to invalid data, which is correctly handled by Editor.

Editor's `ajax.replacements` object can also be useful when working with a REST API - it allows a list of keys to be replaced in the URL based on the data being submitted. Each key is assigned a function that you would return the replacement value for. By default, as shown in this example, Editor will replace `{id}` with the id of the row(s) being edited or deleted.

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: { create: { type: 'POST', url: '../../controllers/rest/create.php' }, edit: { type: 'PUT', url: '../php/rest/edit.php' }, remove: { type: 'DELETE', url: '../../controllers/rest/remove.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/rest/get.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: { create: { type: 'POST', url: '../../controllers/rest/create.php' }, edit: { type: 'PUT', url: '../php/rest/edit.php' }, remove: { type: 'DELETE', url: '../../controllers/rest/remove.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/rest/get.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:

``

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.