{"id":3551,"date":"2016-05-31T17:00:35","date_gmt":"2016-05-31T13:00:35","guid":{"rendered":"http:\/\/dhtmlx.com\/blog\/?p=3551"},"modified":"2025-03-28T19:42:22","modified_gmt":"2025-03-28T16:42:22","slug":"integrating-gantt-php-using-rest-api-slim-mysql","status":"publish","type":"post","link":"https:\/\/dhtmlx.com\/blog\/integrating-gantt-php-using-rest-api-slim-mysql\/","title":{"rendered":"Integrating Gantt with PHP using REST API, Slim and MySQL"},"content":{"rendered":"<p>If you&#8217;re starting a new project in PHP, you&#8217;d probably won&#8217;t build it from scratch but will use some framework instead.<\/p>\n<p>Whether you use Laravel, Symfony, CodeIgniter or any other framework, each of them provides its own means for implementing data access layer. Having such resources at hand, you may want to step aside from our traditional approach with dhtmlxConnector which may look like a &#8216;black box&#8217; to the rest of the project. You&#8217;d rather choose to build data access with tools your framework provides in order to keep everything under your control.<\/p>\n<p>Specially for working with frameworks Gantt provides a simplified protocol for CRUD operations which can be easily integrated with REST API on the server.<\/p>\n<p>To illustrate this possibility, we&#8217;ll create a web application using the <a href=\"https:\/\/www.slimframework.com\/\" target=\"_blank\">Slim<\/a> framework and REST API on the server side. MySQL will serve as a data storage. Let&#8217;s start our work.<\/p>\n<p><a href=\"\/\/dhtmlx.com\/docs\/products\/dhtmlxGantt\/download.shtml\" onclick=\"ga('send', 'event', 'link', 'click', 'download-gantt-slimPHP-blog')\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2016\/08\/download-gantt-banner.png\" alt=\"download gantt\" width=\"900\" height=\"300\" class=\"aligncenter size-full wp-image-3693\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2016\/08\/download-gantt-banner.png 900w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2016\/08\/download-gantt-banner-300x100.png 300w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2016\/08\/download-gantt-banner-768x256.png 768w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/a><\/p>\n<h4>Initializing the project<\/h4>\n<p>Running ahead of time, you may find <a href=\"https:\/\/github.com\/DHTMLX\/gantt-slim-mysql\" target=\"_blank\">a ready demo on GitHub<\/a>. To learn how it works, follow the tutorial.<\/p>\n<p>So, to begin with, we need to initialize our project. For this, let&#8217;s complete the following steps:<\/p>\n<p><strong>Step 1. Creating a project<\/strong><\/p>\n<p>Instead of creating an application from scratch, we&#8217;ll import Slim boilerplate project <a href=\"https:\/\/github.com\/slimphp\/Slim-Skeleton\" target=\"_blank\">Slim-Skeleton<\/a>.<\/p>\n<p>It can be easily installed with the help of composer using the following command:<\/p>\n<div class=\"codecolorer-container php default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"php codecolorer\">php composer<span class=\"sy0\">.<\/span>phar create<span class=\"sy0\">-<\/span>project slim<span class=\"sy0\">\/<\/span>slim<span class=\"sy0\">-<\/span>skeleton gantt<span class=\"sy0\">-<\/span>rest<span class=\"sy0\">-<\/span>php<\/div><\/div>\n<p>or<\/p>\n<div class=\"codecolorer-container php default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"php codecolorer\">composer create<span class=\"sy0\">-<\/span>project slim<span class=\"sy0\">\/<\/span>slim<span class=\"sy0\">-<\/span>skeleton gantt<span class=\"sy0\">-<\/span>rest<span class=\"sy0\">-<\/span>php<\/div><\/div>\n<p>if you have composer installed globally.<\/p>\n<p>Then we should check if it works fine and run the PHP built-in webserver. Go to the app folder and run webserver:<\/p>\n<div class=\"codecolorer-container php default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"php codecolorer\">cd gantt<span class=\"sy0\">-<\/span>rest<span class=\"sy0\">-<\/span>php<br \/>\nphp <span class=\"sy0\">-<\/span>S 0<span class=\"sy0\">.<\/span>0<span class=\"sy0\">.<\/span>0<span class=\"sy0\">.<\/span>0<span class=\"sy0\">:<\/span><span class=\"nu0\">8080<\/span> <span class=\"sy0\">-<\/span>t <span class=\"kw2\">public<\/span> <span class=\"kw2\">public<\/span><span class=\"sy0\">\/<\/span>index<span class=\"sy0\">.<\/span>php<\/div><\/div>\n<p>Now open <em>http:\/\/127.0.0.1:8080<\/em> in a browser. You should see the default Slim page.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2016\/05\/11.png\" alt=\"slim framework with gantt\" width=\"772\" height=\"419\" class=\"aligncenter size-full wp-image-3555\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2016\/05\/11.png 772w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2016\/05\/11-300x162.png 300w\" sizes=\"auto, (max-width: 772px) 100vw, 772px\" \/><\/p>\n<p><strong>Step 2. Download DHTMLX Gantt <\/strong><\/p>\n<p><a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxGantt\/download.shtml\" target=\"_blank\">Download the Gantt Chart<\/a> and unzip the archive&#8217;s content to the &#8220;public&#8221; folder. The resulting structure of folders should look as follows:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2016\/05\/2_orig.png\" alt=\"2_orig\" width=\"900\" height=\"501\" class=\"aligncenter size-full wp-image-3552\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2016\/05\/2_orig.png 900w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2016\/05\/2_orig-300x167.png 300w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<p>Alternatively, you can install it from Bower by running the next command:<\/p>\n<div class=\"codecolorer-container text default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"text codecolorer\">bower install gantt<\/div><\/div>\n<p>Or from NPM with the help of the command below:<\/p>\n<div class=\"codecolorer-container text default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"text codecolorer\">npm install dhtmlx-gantt<\/div><\/div>\n<p><strong>Step 3. Initializing Gantt and dataProcessor and setting connection between them<\/strong><\/p>\n<p>Open templates\/index.phtml and replace its content with the following one:<\/p>\n<div class=\"codecolorer-container html4strict default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"html4strict codecolorer\"><span class=\"sc0\">&lt;!DOCTYPE html&gt;<\/span><br \/>\n<span class=\"sc2\">&lt;<span class=\"kw2\">html<\/span>&gt;<\/span><br \/>\n<span class=\"sc2\">&lt;<span class=\"kw2\">head<\/span>&gt;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc2\">&lt;<span class=\"kw2\">meta<\/span> <span class=\"kw3\">http-equiv<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;Content-type&quot;<\/span> <span class=\"kw3\">content<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;text\/html; charset=utf-8&quot;<\/span>&gt;<\/span><br \/>\n<span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">head<\/span>&gt;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc2\">&lt;<span class=\"kw2\">script<\/span> <span class=\"kw3\">src<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;.\/codebase\/sources\/dhtmlxgantt.js&quot;<\/span> <span class=\"kw3\">type<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;text\/javascript&quot;<\/span> <span class=\"kw3\">charset<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;utf-8&quot;<\/span>&gt;&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">script<\/span>&gt;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc2\">&lt;<span class=\"kw2\">link<\/span> <span class=\"kw3\">rel<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;stylesheet&quot;<\/span> <span class=\"kw3\">href<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;.\/codebase\/dhtmlxgantt.css&quot;<\/span> <span class=\"kw3\">type<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;text\/css&quot;<\/span> <span class=\"kw3\">charset<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;utf-8&quot;<\/span>&gt;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc2\">&lt;<span class=\"kw2\">style<\/span> <span class=\"kw3\">type<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;text\/css&quot;<\/span>&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; html, body{ height:100%; padding:0px; margin:0px; overflow: hidden;}<br \/>\n&nbsp; &nbsp; <span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">style<\/span>&gt;<\/span><br \/>\n<span class=\"sc2\">&lt;<span class=\"kw2\">body<\/span>&gt;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc2\">&lt;<span class=\"kw2\">div<\/span> <span class=\"kw3\">id<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;gantt_here&quot;<\/span> <span class=\"kw3\">style<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">'width:100%; height:100%;'<\/span>&gt;&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">div<\/span>&gt;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc2\">&lt;<span class=\"kw2\">script<\/span> <span class=\"kw3\">type<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;text\/javascript&quot;<\/span>&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; gantt.config.xml_date = &quot;%Y-%m-%d %H:%i:%s&quot;;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; gantt.init(&quot;gantt_here&quot;);<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; gantt.load(&quot;\/data&quot;);<br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; var dp = new gantt.dataProcessor(&quot;\/data&quot;);<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; dp.init(gantt);<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; dp.setTransactionMode(&quot;REST&quot;);<br \/>\n&nbsp; &nbsp; <span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">script<\/span>&gt;<\/span><br \/>\n<span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">body<\/span>&gt;<\/span><br \/>\n<span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">html<\/span>&gt;<\/span><\/div><\/div>\n<p>In the above code we have done the following:<\/p>\n<ul>\n<li>set the <em>gantt.config.xml<\/em>_date property to the &#8220;<em>%Y-%m-%d %H:%i<\/em>&#8221; value, in order to transform the data coming from the server into the readable format for dhtmlxGantt<\/li>\n<li>created a gantt on the page and enabled data loading from the database<\/li>\n<li>initialized dataProcessor and attached the dhtmlxDataProcessor object to the dhtmlxGantt object<\/li>\n<li>set the REST mode for dataProcessor<\/li>\n<\/ul>\n<p>Now on opening <em>http:\/\/127.0.0.1:8080\/<\/em>, you should see an empty gantt.<\/p>\n<p><strong>Step 4. Configuring the database<\/strong><\/p>\n<p>Let&#8217;s proceed with preparing a database. We need to create tables. Let&#8217;s do it in the same way as it&#8217;s described in the <a href=\"https:\/\/docs.dhtmlx.com\/gantt\/desktop__howtostart_nodejs.html#step3preparingadatabase\" target=\"_blank\">documentation<\/a>. <\/p>\n<p><strong>Step 5. Populating tables with data<\/strong><\/p>\n<p>At this point we should add some test data into the gantt_tasks table. There&#8217;s a ready SQL sample that you can use for this:<\/p>\n<div class=\"codecolorer-container sql default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"sql codecolorer\"><span class=\"kw1\">INSERT<\/span> <span class=\"kw1\">INTO<\/span> <span class=\"st0\">`gantt_tasks`<\/span> <span class=\"kw1\">VALUES<\/span> <span class=\"br0\">&#40;<\/span><span class=\"st0\">'1'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'Project #1'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'2013-04-01 00:00:00'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'5'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'0.8'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'20'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'0'<\/span><span class=\"br0\">&#41;<\/span>;<br \/>\n<span class=\"kw1\">INSERT<\/span> <span class=\"kw1\">INTO<\/span> <span class=\"st0\">`gantt_tasks`<\/span> <span class=\"kw1\">VALUES<\/span> <span class=\"br0\">&#40;<\/span><span class=\"st0\">'2'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'Task #1'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'2013-04-06 00:00:00'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'4'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'0.5'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'10'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'1'<\/span><span class=\"br0\">&#41;<\/span>;<br \/>\n<span class=\"kw1\">INSERT<\/span> <span class=\"kw1\">INTO<\/span> <span class=\"st0\">`gantt_tasks`<\/span> <span class=\"kw1\">VALUES<\/span> <span class=\"br0\">&#40;<\/span><span class=\"st0\">'3'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'Task #2'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'2013-04-05 00:00:00'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'6'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'0.7'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'20'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'1'<\/span><span class=\"br0\">&#41;<\/span>;<br \/>\n<span class=\"kw1\">INSERT<\/span> <span class=\"kw1\">INTO<\/span> <span class=\"st0\">`gantt_tasks`<\/span> <span class=\"kw1\">VALUES<\/span> <span class=\"br0\">&#40;<\/span><span class=\"st0\">'4'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'Task #3'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'2013-04-07 00:00:00'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'2'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'0'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'30'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'1'<\/span><span class=\"br0\">&#41;<\/span>;<br \/>\n<span class=\"kw1\">INSERT<\/span> <span class=\"kw1\">INTO<\/span> <span class=\"st0\">`gantt_tasks`<\/span> <span class=\"kw1\">VALUES<\/span> <span class=\"br0\">&#40;<\/span><span class=\"st0\">'5'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'Task #1.1'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'2013-04-05 00:00:00'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'5'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'0.34'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'10'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'2'<\/span><span class=\"br0\">&#41;<\/span>;<br \/>\n<span class=\"kw1\">INSERT<\/span> <span class=\"kw1\">INTO<\/span> <span class=\"st0\">`gantt_tasks`<\/span> <span class=\"kw1\">VALUES<\/span> <span class=\"br0\">&#40;<\/span><span class=\"st0\">'6'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'Task #1.2'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'2013-04-11 13:22:17'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'4'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'0.491477'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'20'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'2'<\/span><span class=\"br0\">&#41;<\/span>;<br \/>\n<span class=\"kw1\">INSERT<\/span> <span class=\"kw1\">INTO<\/span> <span class=\"st0\">`gantt_tasks`<\/span> <span class=\"kw1\">VALUES<\/span> <span class=\"br0\">&#40;<\/span><span class=\"st0\">'7'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'Task #2.1'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'2013-04-07 00:00:00'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'5'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'0.2'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'10'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'3'<\/span><span class=\"br0\">&#41;<\/span>;<br \/>\n<span class=\"kw1\">INSERT<\/span> <span class=\"kw1\">INTO<\/span> <span class=\"st0\">`gantt_tasks`<\/span> <span class=\"kw1\">VALUES<\/span> <span class=\"br0\">&#40;<\/span><span class=\"st0\">'8'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'Task #2.2'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'2013-04-06 00:00:00'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'4'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'0.9'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'20'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'3'<\/span><span class=\"br0\">&#41;<\/span>;<\/div><\/div>\n<h4>Loading data into Gantt<\/h4>\n<p>The next step is to implement data loading. During Gantt initialization on step 3 from the previous chapter we added the following line:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">gantt.<span class=\"me1\">load<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;\/data&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>It will send an AJAX request to the specified url, expecting to get a JSON response with Gantt data (see the <a href=\"https:\/\/docs.dhtmlx.com\/gantt\/desktop__supported_data_formats.html#json\" target=\"_blank\">format details<\/a>). So, we should add the route for &#8220;\/data&#8221;.<\/p>\n<p>Open the <em>index.php<\/em> file and add the following code right after $app declaration:<\/p>\n<div class=\"codecolorer-container php default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"php codecolorer\"><span class=\"kw2\">function<\/span> getConnection<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re0\">$pdoSettings<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw3\">array<\/span><span class=\"br0\">&#40;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; PDO<span class=\"sy0\">::<\/span><span class=\"me2\">ATTR_ERRMODE<\/span> <span class=\"sy0\">=&gt;<\/span> PDO<span class=\"sy0\">::<\/span><span class=\"me2\">ERRMODE_EXCEPTION<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; PDO<span class=\"sy0\">::<\/span><span class=\"me2\">ATTR_DEFAULT_FETCH_MODE<\/span> <span class=\"sy0\">=&gt;<\/span> PDO<span class=\"sy0\">::<\/span><span class=\"me2\">FETCH_ASSOC<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"kw2\">new<\/span> PDO<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;mysql:host=localhost;dbname=gantt&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;root&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;root&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$pdoSettings<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"re0\">$app<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">get<\/span><span class=\"br0\">&#40;<\/span><span class=\"st_h\">'\/data'<\/span><span class=\"sy0\">,<\/span> <span class=\"kw2\">function<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$request<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$response<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re0\">$conn<\/span> <span class=\"sy0\">=<\/span> getConnection<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re0\">$result<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw3\">array<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"re0\">$result<\/span><span class=\"br0\">&#91;<\/span><span class=\"st0\">&quot;data&quot;<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw3\">array<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">foreach<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$conn<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">query<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;SELECT * FROM gantt_tasks&quot;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">as<\/span> <span class=\"re0\">$row<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$row<\/span><span class=\"br0\">&#91;<\/span><span class=\"st0\">&quot;open&quot;<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw4\">true<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw3\">array_push<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$result<\/span><span class=\"br0\">&#91;<\/span><span class=\"st0\">&quot;data&quot;<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$row<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"re0\">$result<\/span><span class=\"br0\">&#91;<\/span><span class=\"st0\">&quot;links&quot;<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw3\">array<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">foreach<\/span> <span class=\"br0\">&#40;<\/span><span class=\"re0\">$conn<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">query<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;SELECT * FROM gantt_links&quot;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">as<\/span> <span class=\"re0\">$link<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw3\">array_push<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$result<\/span><span class=\"br0\">&#91;<\/span><span class=\"st0\">&quot;links&quot;<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$link<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"re0\">$response<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">withJson<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$result<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"re0\">$response<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>In the above code we read all the tasks and links from database and set them to an object (<em>$result<\/em>). Also we specified the &#8220;open&#8221; property to define that the tasks tree should be open by default. <\/p>\n<p>Finally, we sent the <em>$result<\/em> object to the client side as JSON.<\/p>\n<p>If you open <em>http:\/\/127.0.0.1:8080\/<\/em> now, you should see gantt with data added at the previous stage (see Step 5 for data details).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2016\/05\/31.png\" alt=\"gantt with slim\" width=\"793\" height=\"502\" class=\"aligncenter size-full wp-image-3558\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2016\/05\/31.png 793w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2016\/05\/31-300x189.png 300w\" sizes=\"auto, (max-width: 793px) 100vw, 793px\" \/><\/p>\n<h4>Updating data on the server<\/h4>\n<p>To make our application complete, we need to add the most important functionality &#8211; the one that will allow sending changes made on the client side to the server. For this we have added a couple of code lines in the <em>index.html<\/em> file:<\/p>\n<div class=\"codecolorer-container html4strict default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"html4strict codecolorer\">&nbsp; &nbsp; &nbsp; &nbsp; var dp = new gantt.dataProcessor(&quot;\/data&quot;);<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; dp.init(gantt);<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; dp.setTransactionMode(&quot;REST&quot;);<\/div><\/div>\n<p>For each action on the client (adding, changing or removing data in the chart) dataProcessor will send an AJAX request. This request will contain all necessary data to save changes on the server. Since dataProcessor is used in the REST mode, it will send the corresponding HTTP verbs for different operations. The details for CRUD requests are given in the <a href=\"https:\/\/docs.dhtmlx.com\/gantt\/desktop__server_side.html#savingdatafromrestserver\" target=\"_blank\">documentation<\/a>.<\/p>\n<p>So, let&#8217;s proceed with adding into the <em>index.php<\/em> file all the URLs and handlers we need:<\/p>\n<div class=\"codecolorer-container php default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;height:600px;\"><div class=\"php codecolorer\"><span class=\"co1\">\/\/Gets response for a CRUD action<\/span><br \/>\n<span class=\"kw2\">function<\/span> prepareResponse<span class=\"br0\">&#40;<\/span><span class=\"re0\">$res<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$action<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$tid<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw4\">NULL<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re0\">$result<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw3\">array<\/span><span class=\"br0\">&#40;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"st_h\">'action'<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"re0\">$action<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw3\">isset<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$tid<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">&amp;&amp;<\/span> <span class=\"sy0\">!<\/span><span class=\"kw3\">is_null<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$tid<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$result<\/span><span class=\"br0\">&#91;<\/span><span class=\"st_h\">'tid'<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$tid<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re0\">$res<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">withJson<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$result<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"re0\">$result<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"co1\">\/\/Gets an event from the request data<\/span><br \/>\n<span class=\"kw2\">function<\/span> getEvent<span class=\"br0\">&#40;<\/span><span class=\"re0\">$data<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"kw3\">array<\/span><span class=\"br0\">&#40;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"st_h\">':text'<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"re0\">$data<\/span><span class=\"br0\">&#91;<\/span><span class=\"st0\">&quot;text&quot;<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"st_h\">':start_date'<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"re0\">$data<\/span><span class=\"br0\">&#91;<\/span><span class=\"st0\">&quot;start_date&quot;<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"st_h\">':duration'<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"re0\">$data<\/span><span class=\"br0\">&#91;<\/span><span class=\"st0\">&quot;duration&quot;<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"st_h\">':progress'<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"kw3\">isset<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$data<\/span><span class=\"br0\">&#91;<\/span><span class=\"st0\">&quot;progress&quot;<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span> ? <span class=\"re0\">$data<\/span><span class=\"br0\">&#91;<\/span><span class=\"st0\">&quot;progress&quot;<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy0\">:<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"st_h\">':parent'<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"re0\">$data<\/span><span class=\"br0\">&#91;<\/span><span class=\"st0\">&quot;parent&quot;<\/span><span class=\"br0\">&#93;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"co1\">\/\/Gets a link from the request data<\/span><br \/>\n<span class=\"kw2\">function<\/span> getLink<span class=\"br0\">&#40;<\/span><span class=\"re0\">$data<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"kw3\">array<\/span><span class=\"br0\">&#40;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;:source&quot;<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"re0\">$data<\/span><span class=\"br0\">&#91;<\/span><span class=\"st0\">&quot;source&quot;<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;:target&quot;<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"re0\">$data<\/span><span class=\"br0\">&#91;<\/span><span class=\"st0\">&quot;target&quot;<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;:type&quot;<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"re0\">$data<\/span><span class=\"br0\">&#91;<\/span><span class=\"st0\">&quot;type&quot;<\/span><span class=\"br0\">&#93;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"co1\">\/\/Insert task action<\/span><br \/>\n<span class=\"re0\">$app<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">post<\/span><span class=\"br0\">&#40;<\/span><span class=\"st_h\">'\/data\/task'<\/span><span class=\"sy0\">,<\/span> <span class=\"kw2\">function<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$request<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$response<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re0\">$event<\/span> <span class=\"sy0\">=<\/span> getEvent<span class=\"br0\">&#40;<\/span><span class=\"re0\">$request<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">getParsedBody<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re0\">$conn<\/span> <span class=\"sy0\">=<\/span> getConnection<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re0\">$query<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;INSERT INTO gantt_tasks(text, start_date, duration, progress, parent) &quot;<\/span><span class=\"sy0\">.<\/span><br \/>\n&nbsp; <span class=\"st0\">&quot;VALUES (:text,:start_date,:duration,:progress,:parent)&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re0\">$conn<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">prepare<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$query<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">execute<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$event<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">return<\/span> prepareResponse<span class=\"br0\">&#40;<\/span><span class=\"re0\">$response<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;inserted&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$conn<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">lastInsertId<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"co1\">\/\/Update task action<\/span><br \/>\n<span class=\"re0\">$app<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">put<\/span><span class=\"br0\">&#40;<\/span><span class=\"st_h\">'\/data\/task\/{id}'<\/span><span class=\"sy0\">,<\/span> <span class=\"kw2\">function<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$request<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$response<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re0\">$sid<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$request<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">getAttribute<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;id&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re0\">$event<\/span> <span class=\"sy0\">=<\/span> getEvent<span class=\"br0\">&#40;<\/span><span class=\"re0\">$request<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">getParsedBody<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re0\">$conn<\/span> <span class=\"sy0\">=<\/span> getConnection<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re0\">$query<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;UPDATE gantt_tasks &quot;<\/span><span class=\"sy0\">.<\/span><br \/>\n&nbsp; &nbsp; <span class=\"st0\">&quot;SET text = :text, start_date = :start_date, duration = :duration, progress = :progress, parent = :parent &quot;<\/span><span class=\"sy0\">.<\/span><br \/>\n&nbsp; &nbsp; <span class=\"st0\">&quot;WHERE id = :sid&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"re0\">$conn<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">prepare<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$query<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">execute<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw3\">array_merge<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$event<\/span><span class=\"sy0\">,<\/span> <span class=\"kw3\">array<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;:sid&quot;<\/span><span class=\"sy0\">=&gt;<\/span><span class=\"re0\">$sid<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">return<\/span> prepareResponse<span class=\"br0\">&#40;<\/span><span class=\"re0\">$response<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;updated&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"co1\">\/\/Remove task action<\/span><br \/>\n<span class=\"re0\">$app<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">delete<\/span><span class=\"br0\">&#40;<\/span><span class=\"st_h\">'\/data\/task\/{id}'<\/span><span class=\"sy0\">,<\/span> <span class=\"kw2\">function<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$request<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$response<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re0\">$sid<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$request<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">getAttribute<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;id&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re0\">$conn<\/span> <span class=\"sy0\">=<\/span> getConnection<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re0\">$query<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;DELETE FROM gantt_tasks WHERE id = :sid&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"re0\">$conn<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">prepare<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$query<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">execute<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw3\">array<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;:sid&quot;<\/span><span class=\"sy0\">=&gt;<\/span><span class=\"re0\">$sid<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">return<\/span> prepareResponse<span class=\"br0\">&#40;<\/span><span class=\"re0\">$response<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;deleted&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"co1\">\/\/Insert link action<\/span><br \/>\n<span class=\"re0\">$app<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">post<\/span><span class=\"br0\">&#40;<\/span><span class=\"st_h\">'\/data\/link'<\/span><span class=\"sy0\">,<\/span> <span class=\"kw2\">function<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$request<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$response<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re0\">$link<\/span> <span class=\"sy0\">=<\/span> getLink<span class=\"br0\">&#40;<\/span><span class=\"re0\">$request<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">getParsedBody<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re0\">$conn<\/span> <span class=\"sy0\">=<\/span> getConnection<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re0\">$query<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;INSERT INTO gantt_links(source, target, type) VALUES (:source,:target,:type)&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re0\">$conn<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">prepare<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$query<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">execute<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$link<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">return<\/span> prepareResponse<span class=\"br0\">&#40;<\/span><span class=\"re0\">$response<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;inserted&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$conn<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">lastInsertId<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"co1\">\/\/Update link action<\/span><br \/>\n<span class=\"re0\">$app<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">put<\/span><span class=\"br0\">&#40;<\/span><span class=\"st_h\">'\/data\/link\/{id}'<\/span><span class=\"sy0\">,<\/span> <span class=\"kw2\">function<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$request<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$response<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re0\">$sid<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$request<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">getAttribute<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;id&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re0\">$link<\/span> <span class=\"sy0\">=<\/span> getLink<span class=\"br0\">&#40;<\/span><span class=\"re0\">$request<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">getParsedBody<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re0\">$conn<\/span> <span class=\"sy0\">=<\/span> getConnection<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re0\">$query<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;UPDATE gantt_links SET &quot;<\/span><span class=\"sy0\">.<\/span><br \/>\n&nbsp; &nbsp; <span class=\"st0\">&quot;source = :source, target = :target, type = :type &quot;<\/span><span class=\"sy0\">.<\/span><br \/>\n&nbsp; &nbsp; <span class=\"st0\">&quot;WHERE id = :sid&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"re0\">$conn<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">prepare<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$query<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">execute<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw3\">array_merge<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$link<\/span><span class=\"sy0\">,<\/span> <span class=\"kw3\">array<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;:sid&quot;<\/span><span class=\"sy0\">=&gt;<\/span><span class=\"re0\">$sid<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">return<\/span> prepareResponse<span class=\"br0\">&#40;<\/span><span class=\"re0\">$response<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;updated&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"co1\">\/\/Remove link action<\/span><br \/>\n<span class=\"re0\">$app<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">delete<\/span><span class=\"br0\">&#40;<\/span><span class=\"st_h\">'\/data\/link\/{id}'<\/span><span class=\"sy0\">,<\/span> <span class=\"kw2\">function<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$request<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$response<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re0\">$sid<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$request<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">getAttribute<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;id&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re0\">$conn<\/span> <span class=\"sy0\">=<\/span> getConnection<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re0\">$query<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;DELETE FROM gantt_links WHERE id = :sid&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"re0\">$conn<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">prepare<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$query<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">execute<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw3\">array<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;:sid&quot;<\/span><span class=\"sy0\">=&gt;<\/span><span class=\"re0\">$sid<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">return<\/span> prepareResponse<span class=\"br0\">&#40;<\/span><span class=\"re0\">$response<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;deleted&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>Since Gantt operates with two kinds of entities &#8211; tasks and links &#8211; we need two sets of routes, <\/p>\n<p>We have introduced two sets of routes: \u201c\/data\/task\u201d &#8211; for requests connected to operations with  tasks and &#8220;\/data\/link&#8221; for requests related to operations with links. <\/p>\n<p>There are also three types of requests are specified: POST &#8211; to add a new item into the database, PUT &#8211; to update an existing record and DELETE &#8211; to delete a record.<\/p>\n<p>On each action a JSON object with the type of the performed operation will come. The response for the insert action will also include the id of the new record in the database that will be applied on the client side. If the operation failed, the \u201cerror\u201d type should be returned. <\/p>\n<p>Well, everything is ready for now. Let&#8217;s run our application, open <em>http:\/\/127.0.0.1:8080<\/em> and enjoy a nice Gantt chart we\u2019ve just created.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2016\/05\/41.png\" alt=\"gantt chart with php\" width=\"900\" height=\"360\" class=\"aligncenter size-full wp-image-3559\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2016\/05\/41.png 900w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2016\/05\/41-300x120.png 300w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<p>That&#8217;s it. You may find <a href=\"https:\/\/github.com\/DHTMLX\/gantt-slim-mysql\" target=\"_blank\">a ready demo on GitHub<\/a>. We&#8217;ve tried to make our tutorial easy to reproduce and understand. There are other captivating materials are waiting ahead. Stay tuned!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>If you&#8217;re starting a new project in PHP, you&#8217;d probably won&#8217;t build it from scratch but will use some framework instead. Whether you use Laravel, Symfony, CodeIgniter or any &#8230;<\/p>\n","protected":false},"author":2,"featured_media":3561,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17,71,1,38],"tags":[33,20,14,60,49],"class_list":["post-3551","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-posts-for-codeproject-com","category-tutorials","category-uncategorized","category-visible","tag-all-posts","tag-gantt","tag-tips","tag-integrations-gantt","tag-php"],"_links":{"self":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/3551","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/comments?post=3551"}],"version-history":[{"count":5,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/3551\/revisions"}],"predecessor-version":[{"id":13633,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/3551\/revisions\/13633"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media\/3561"}],"wp:attachment":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media?parent=3551"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/categories?post=3551"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/tags?post=3551"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}