{"id":968,"date":"2011-03-01T09:41:00","date_gmt":"2011-03-01T06:41:00","guid":{"rendered":"http:\/\/www.dhtmlx.com\/blog\/?p=968"},"modified":"2026-01-26T13:29:27","modified_gmt":"2026-01-26T10:29:27","slug":"dhtmlx-touch-tutorial","status":"publish","type":"post","link":"https:\/\/dhtmlx.com\/blog\/dhtmlx-touch-tutorial\/","title":{"rendered":"Build HTML5-Based Menu App for iPad with DHTMLX Touch"},"content":{"rendered":"<p><strong>DHTMLX Touch support and development was discontinued when all DHTMLX components became adaptive.<\/strong><\/p>\n<p>In this tutorial, we will share some experience of using the DHTMLX Touch framework for building mobile web interfaces. You will learn how to use different components, arrange them on a page, set templates, add connections, and combine the components into a single interface. As an example, we will build a restaurant menu application for iPad (it can be used on other mobile devices but the sizes are optimized for the iPad screen resolution).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2011\/02\/ipad_menu_final.jpg\" alt=\"Restaurant Menu App Built with DHTMLX Touch\" title=\"Restaurant Menu App Built with DHTMLX Touch\" width=\"600\" height=\"478\" class=\"aligncenter size-full wp-image-971\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2011\/02\/ipad_menu_final.jpg 600w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2011\/02\/ipad_menu_final-300x239.jpg 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/p>\n<h4 style=\"background-color:lightgrey\">STEP 1 &#8211; Getting Started<\/h4>\n<p>First of all, download <a href=\"https:\/\/dhtmlx.com\/x\/download\/regular\/dhtmlxTouch.zip\">the latest package of DHTMLX Touch beta<\/a>, unpack it and include touchui.js and touchui.css files into your web page:<\/p>\n<div class=\"codecolorer-container html4strict default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"html4strict codecolorer\"><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\">type<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;text\/css&quot;<\/span> <span class=\"kw3\">href<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;codebase\/touchui.css&quot;<\/span>&gt;<\/span><br \/>\n<span class=\"sc2\">&lt;<span class=\"kw2\">script<\/span> <span class=\"kw3\">src<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;codebase\/touchui.js&quot;<\/span> <span class=\"kw3\">type<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;text\/javascript&quot;<\/span>&gt;&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">script<\/span>&gt;<\/span><\/div><\/div>\n<p>Add a special meta tag for correct representation on mobile devices:<\/p>\n<div class=\"codecolorer-container html4strict default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"html4strict codecolorer\">&lt;<span class=\"kw2\">meta<\/span> <span class=\"kw3\">name<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;viewport&quot;<\/span> <span class=\"kw3\">content<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;width=device-width,minimum-scale=1.0,maximum-scale=1.0&quot;<\/span>&gt;<\/div><\/div>\n<p>Now we should decide about the layout of interface elements for our application. There should be menu categories, a list of dishes in the category, and <strong>Order<\/strong> button. So, the application interface will consist of these three sections:<\/p>\n<ul>\n<li>list of menu categories (pizza, pasta, drinks, etc) &#8211; placed on the left<\/li>\n<li>list of menu items &#8211; on the right<\/li>\n<li>total price counter and &#8220;Order&#8221; button &#8211; on the bottom left<\/li>\n<\/ul>\n<p>&nbsp;<br \/>\nWhen we place and configure the Layout component on the page, it will look like this:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2011\/02\/ipad_menu_layout.jpg\" alt=\"Restaurant Menu App - Layout of Elements\" title=\"Restaurant Menu App - Layout of Elements\" width=\"600\" height=\"478\" class=\"aligncenter size-full wp-image-974\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2011\/02\/ipad_menu_layout.jpg 600w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2011\/02\/ipad_menu_layout-300x239.jpg 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/p>\n<p>Layout defines global structure of the interface. Later we&#8217;ll add other components in the Layout cells, and connect them with each other. According to the scheme we&#8217;ve defined for our menu app, we need a Layout with 2 columns and 2 rows for the left column.<\/p>\n<p>Layout is created by <strong>dhx.ui({})<\/strong> construction. To set columns, you need to define &#8220;cols&#8221; array. If you need to arrange elements vertically one by one, use rows. The Layout structure for our menu interface will be:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">dhx.<span class=\"me1\">ui<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; cols<span class=\"sy0\">:<\/span><span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>rows<span class=\"sy0\">:<\/span><span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>...<span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>...<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#93;<\/span><span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>...<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#93;<\/span> &nbsp; &nbsp; &nbsp; &nbsp;<br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>If we don&#8217;t set width and height for columns and rows, their sizes will be equal. However, we need the left column to be more narrow than the right one. Also, height of the rows in the left column should be different. Therefore, we need to define the sizes manually.<\/p>\n<p>We will initialize Layout from the <strong>dhx.ready()<\/strong> method, since the component should be initialized when the page is completely loaded:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">dhx.<span class=\"me1\">ready<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">function<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;dhx.<span class=\"me1\">ui<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;cols<span class=\"sy0\">:<\/span><span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;width<span class=\"sy0\">:<\/span><span class=\"nu0\">275<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rows<span class=\"sy0\">:<\/span><span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;template<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;Menu categories&quot;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;template<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;Order&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;height<span class=\"sy0\">:<\/span><span class=\"nu0\">120<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#93;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;template<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;Menu items&quot;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#93;<\/span> &nbsp; &nbsp; &nbsp; &nbsp;<br \/>\n&nbsp; &nbsp;<span class=\"br0\">&#125;<\/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>So, we have placed a Layout on a page and configured it for the needs of our application.<\/p>\n<h4 style=\"background-color:lightgrey\">STEP 2 &#8211; Menu Categories<\/h4>\n<p>To display menu categories on the left part of the page, we can use any of the following components (we also call them views):<\/p>\n<ul>\n<li>DataView<\/li>\n<li>List<\/li>\n<li>PageList<\/li>\n<\/ul>\n<p>&nbsp;<br \/>\nWe&#8217;ll choose DataView, although other components can be used for this task as well. <\/p>\n<p>In our example we will load the data from XML files. Here is the snippet of XML for menu categories:<\/p>\n<div class=\"codecolorer-container xml default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"xml codecolorer\"><span class=\"sc3\"><span class=\"re1\">&lt;data<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; &nbsp;<span class=\"sc3\"><span class=\"re1\">&lt;item<\/span> <span class=\"re0\">id<\/span>=<span class=\"st0\">&quot;1&quot;<\/span><span class=\"re2\">&gt;<\/span><\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sc3\"><span class=\"re1\">&lt;Img<span class=\"re2\">&gt;<\/span><\/span><\/span><span class=\"sc2\">&lt;![CDATA[imgs\/pasta.jpg]]&gt;<\/span><span class=\"sc3\"><span class=\"re1\">&lt;\/Img<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sc3\"><span class=\"re1\">&lt;Name<span class=\"re2\">&gt;<\/span><\/span><\/span><span class=\"sc2\">&lt;![CDATA[Pasta]]&gt;<\/span><span class=\"sc3\"><span class=\"re1\">&lt;\/Name<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sc3\"><span class=\"re1\">&lt;Description<span class=\"re2\">&gt;<\/span><\/span><\/span><span class=\"sc2\">&lt;![CDATA[Lorem ipsum dolor sit amet, consectetum adipicing elit.]]&gt;<\/span><span class=\"sc3\"><span class=\"re1\">&lt;\/Description<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; &nbsp;<span class=\"sc3\"><span class=\"re1\">&lt;\/item<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; &nbsp;<span class=\"sc3\"><span class=\"re1\">&lt;item<\/span> <span class=\"re0\">id<\/span>=<span class=\"st0\">&quot;2&quot;<\/span><span class=\"re2\">&gt;<\/span><\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sc3\"><span class=\"re1\">&lt;Img<span class=\"re2\">&gt;<\/span><\/span><\/span><span class=\"sc2\">&lt;![CDATA[imgs\/pizza.jpg]]&gt;<\/span><span class=\"sc3\"><span class=\"re1\">&lt;\/Img<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sc3\"><span class=\"re1\">&lt;Name<span class=\"re2\">&gt;<\/span><\/span><\/span><span class=\"sc2\">&lt;![CDATA[Pizza]]&gt;<\/span><span class=\"sc3\"><span class=\"re1\">&lt;\/Name<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sc3\"><span class=\"re1\">&lt;Description<span class=\"re2\">&gt;<\/span><\/span><\/span><span class=\"sc2\">&lt;![CDATA[Lorem ipsum dolor sit amet, consectetum adipicing elit.]]&gt;<\/span><span class=\"sc3\"><span class=\"re1\">&lt;\/Description<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; &nbsp;<span class=\"sc3\"><span class=\"re1\">&lt;\/item<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; &nbsp;...<br \/>\n<span class=\"sc3\"><span class=\"re1\">&lt;\/data<span class=\"re2\">&gt;<\/span><\/span><\/span><\/div><\/div>\n<p>As you can see, an item in menu categories list contains 4 properties:<\/p>\n<ul>\n<li>id<\/li>\n<li>Img<\/li>\n<li>Name<\/li>\n<li>Description<\/li>\n<\/ul>\n<p>&nbsp;<br \/>\n<strong>Creating Template for DataView<\/strong><\/p>\n<p>Now we need to define a template for &#8216;menu category&#8217; item and set width, height, margin and padding for it. These settings will differ from the default ones, so we should define a new item type for DataView. Let&#8217;s create HTML template of a new type, which will look like this:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2011\/02\/dataview_item_template.png\" alt=\"DataView Item Template - Menu Category\" title=\"DataView Item Template - Menu Category\" width=\"263\" height=\"128\" class=\"aligncenter size-full wp-image-977\" \/><\/p>\n<p>This is our HTML template:<\/p>\n<div class=\"codecolorer-container html4strict default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"html4strict codecolorer\"><span class=\"sc2\">&lt;<span class=\"kw2\">div<\/span> <span class=\"kw3\">id<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_type_menu_container&quot;<\/span> <span class=\"kw3\">style<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;display:none;&quot;<\/span>&gt;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc2\">&lt;<span class=\"kw2\">div<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;menu_img&quot;<\/span> <span class=\"kw3\">style<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;background:url(#Img#) no-repeat scroll 50% 50% transparent;&quot;<\/span>&gt;<\/span><span class=\"sc1\">&amp;nbsp&lt;\/div&gt;<\/span><br \/>\n<span class=\"sc1\"> &nbsp; &nbsp;&lt;div class=&quot;menu_content&quot;&gt;<\/span><br \/>\n<span class=\"sc1\"> &nbsp; &nbsp; &nbsp; &nbsp;&lt;h3 class=&quot;menu_content_header&quot; style=&quot;&quot;&gt;#Name#&lt;\/h3&gt;&lt;p class=&quot;menu_content_description&quot;&gt;#Description#&lt;\/p&gt;<\/span><br \/>\n<span class=\"sc1\"> &nbsp; &nbsp;&lt;\/div&gt;<\/span><br \/>\n<span class=\"sc1\">&lt;\/div&gt;<\/span><\/div><\/div>\n<p>And these are CSS classes used in this template:<\/p>\n<div class=\"codecolorer-container css default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"css codecolorer\"><span class=\"re1\">.menu_img<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">float<\/span><span class=\"sy0\">:<\/span><span class=\"kw2\">left<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">width<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">108px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">height<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">108px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; -webkit-border-radius<span class=\"sy0\">:<\/span> <span class=\"re3\">3px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; -webkit-box-shadow<span class=\"sy0\">:<\/span><span class=\"re3\">2px<\/span> <span class=\"re3\">2px<\/span> <span class=\"re3\">3px<\/span> <span class=\"re0\">#2f3132<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">margin<\/span><span class=\"sy0\">:<\/span> <span class=\"re3\">5px<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"re1\">.menu_content<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">float<\/span><span class=\"sy0\">:<\/span><span class=\"kw2\">left<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">width<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">100px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">line-height<\/span><span class=\"sy0\">:<\/span> <span class=\"re3\">17px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">margin<\/span><span class=\"sy0\">:<\/span><span class=\"nu0\">0<\/span> <span class=\"re3\">8px<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"re1\">.menu_content_header<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">font-family<\/span><span class=\"sy0\">:<\/span>Georgia<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">font-size<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">27px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">font-weight<\/span><span class=\"sy0\">:<\/span><span class=\"kw2\">normal<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">color<\/span><span class=\"sy0\">:<\/span><span class=\"kw4\">white<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">margin<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">9px<\/span> <span class=\"nu0\">0<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"re1\">.menu_content_description<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">font-family<\/span><span class=\"sy0\">:<\/span>Helvetica<span class=\"sy0\">,<\/span> Tahoma<span class=\"sy0\">,<\/span> Arial<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">font-size<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">12px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">color<\/span><span class=\"sy0\">:<\/span><span class=\"kw4\">white<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>To add a new item type to the DataView, we need to use <strong>dhx.Type<\/strong> method and pass two parameters: component class and object with type properties.<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">dhx.<span class=\"me1\">Type<\/span><span class=\"br0\">&#40;<\/span>dhx.<span class=\"me1\">ui<\/span>.<span class=\"me1\">dataview<\/span><span class=\"sy0\">,<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; name<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;menu&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; template<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;html-&gt;dhx_type_menu_container&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; height<span class=\"sy0\">:<\/span> <span class=\"nu0\">120<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; width<span class=\"sy0\">:<\/span> <span class=\"nu0\">255<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; margin<span class=\"sy0\">:<\/span> <span class=\"nu0\">5<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; padding<span class=\"sy0\">:<\/span> <span class=\"nu0\">0<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p><strong>Dataview Initialiazation<\/strong><\/p>\n<p>Now we need to initialize DataView in a Layout cell:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">dhx.<span class=\"me1\">ready<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">function<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;dhx.<span class=\"me1\">ui<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;id<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;layout&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;cols<span class=\"sy0\">:<\/span><span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;width<span class=\"sy0\">:<\/span><span class=\"nu0\">275<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rows<span class=\"sy0\">:<\/span><span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;view<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;dataview&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;type<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;menu&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;id<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;menu&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;url<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;xml\/menu.xml&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;datatype<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;xml&quot;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;template<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;Order&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;height<span class=\"sy0\">:<\/span><span class=\"nu0\">120<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#93;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;template<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;Menu items&quot;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#93;<\/span> &nbsp; &nbsp; &nbsp; &nbsp;<br \/>\n&nbsp; &nbsp;<span class=\"br0\">&#125;<\/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>In DataView configuration we&#8217;ve set several properties:<\/p>\n<ul>\n<li><strong>view<\/strong> &#8211; view (component) name. In our case it&#8217;s &#8220;dataview&#8221;.<\/li>\n<li><strong>type<\/strong> &#8211; the name of used type. The type that we&#8217;ve just created is &#8220;menu&#8221;.<\/li>\n<li><strong>id<\/strong> &#8211; a view id. It&#8217;s required if you need to manipulate with the view (get the view object). We&#8217;ll need the id to filter menu items in the right column when menu category is selected.<\/li>\n<li><strong>url<\/strong> &#8211; the URL to a datasource.<\/li>\n<li><strong>datatype<\/strong> &#8211; type of data (can be XML, JSON, or CSV).<\/li>\n<\/ul>\n<p>&nbsp;<br \/>\nFinally, we can move to the dataview style. We have defined how data properties are represented in the menu template, but we also need to set a background color and rounded borders for dataview items. Besides, selected and unselected items should have different styles:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">.<span class=\"me1\">dhx_dataview<\/span> .<span class=\"me1\">dhx_dataview_default_item<\/span><span class=\"sy0\">,<\/span>.<span class=\"me1\">dhx_dataview<\/span> .<span class=\"me1\">dhx_dataview_default_item_selected<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; border<span class=\"sy0\">-<\/span>right<span class=\"sy0\">:<\/span><span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; border<span class=\"sy0\">-<\/span>bottom<span class=\"sy0\">:<\/span><span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n.<span class=\"me1\">dhx_dataview_default_item_selected<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; border<span class=\"sy0\">-<\/span>left<span class=\"sy0\">:<\/span> 1px solid #4b4b4b<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; border<span class=\"sy0\">-<\/span>top<span class=\"sy0\">:<\/span> 1px solid #4b4b4b<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; background<span class=\"sy0\">:<\/span>rgba<span class=\"br0\">&#40;<\/span><span class=\"nu0\">255<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">255<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">255<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sy0\">-<\/span>webkit<span class=\"sy0\">-<\/span>border<span class=\"sy0\">-<\/span>radius<span class=\"sy0\">:<\/span>3px<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sy0\">-<\/span>webkit<span class=\"sy0\">-<\/span>box<span class=\"sy0\">-<\/span>shadow<span class=\"sy0\">:<\/span><span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span> &nbsp; &nbsp;<br \/>\n.<span class=\"me1\">dhx_dataview_default_item<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; border<span class=\"sy0\">-<\/span>left<span class=\"sy0\">:<\/span> 1px solid #7f7f7f<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; border<span class=\"sy0\">-<\/span>top<span class=\"sy0\">:<\/span> 1px solid #7f7f7f<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; background<span class=\"sy0\">:<\/span>rgba<span class=\"br0\">&#40;<\/span><span class=\"nu0\">255<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">255<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">255<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">0.2<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sy0\">-<\/span>webkit<span class=\"sy0\">-<\/span>border<span class=\"sy0\">-<\/span>radius<span class=\"sy0\">:<\/span>3px<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sy0\">-<\/span>webkit<span class=\"sy0\">-<\/span>box<span class=\"sy0\">-<\/span>shadow<span class=\"sy0\">:<\/span>2px 2px 3px #2f3132<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; margin<span class=\"sy0\">:<\/span> <span class=\"nu0\">0<\/span> 8px<span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>This is how our page will look after all these steps:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2011\/02\/ipad_menu_cat.jpg\" alt=\"Restaurant Menu App - Menu Categories\" title=\"Restaurant Menu App - Menu Categories\" width=\"600\" height=\"478\" class=\"aligncenter size-full wp-image-978\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2011\/02\/ipad_menu_cat.jpg 600w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2011\/02\/ipad_menu_cat-300x239.jpg 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/p>\n<p>In the next step we&#8217;ll create a list of menu items that will be displayed in the right column of the Layout.<\/p>\n<h4 style=\"background-color:lightgrey\">STEP 3 &#8211; Menu Items<\/h4>\n<p>As well as in case of menu categories, we can choose between DataView, List and PageList to display menu items on the right. All these components, or views, fit our purpose, but we&#8217;ll choose PageList because it supports scrolling items one by one and controls the position of an item on the page. It means, if user scrolls through the items, the scroll will stop and display the full view of the item.<\/p>\n<p>Again, data will be loaded from XML file. Each data item will contain the following properties:<\/p>\n<ul>\n<li><strong>id<\/strong> &#8211; item id<\/li>\n<li><strong>Img<\/strong> &#8211; image for the menu item<\/li>\n<li><strong>Name<\/strong> &#8211; item name<\/li>\n<li><strong>Description<\/strong> &#8211; item description<\/li>\n<li><strong>Price<\/strong> &#8211; item price<\/li>\n<li><strong>Count<\/strong> &#8211; number of odered items (0 initially)<\/li>\n<li><strong>Group<\/strong> &#8211; name of the menu category to which this item relates. In the 5th Step we&#8217;ll use this property for filtering.<\/li>\n<\/ul>\n<p>&nbsp;<br \/>\nXML snippet for menu item:<\/p>\n<div class=\"codecolorer-container xml default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"xml codecolorer\"><span class=\"sc3\"><span class=\"re1\">&lt;data<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; &nbsp;<span class=\"sc3\"><span class=\"re1\">&lt;item<\/span> <span class=\"re0\">id<\/span>=<span class=\"st0\">&quot;1&quot;<\/span><span class=\"re2\">&gt;<\/span><\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sc3\"><span class=\"re1\">&lt;Img<span class=\"re2\">&gt;<\/span><\/span><\/span><span class=\"sc2\">&lt;![CDATA[imgs\/pizza\/pizza1.png]]&gt;<\/span><span class=\"sc3\"><span class=\"re1\">&lt;\/Img<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sc3\"><span class=\"re1\">&lt;Name<span class=\"re2\">&gt;<\/span><\/span><\/span><span class=\"sc2\">&lt;![CDATA[Pizza with spinach]]&gt;<\/span><span class=\"sc3\"><span class=\"re1\">&lt;\/Name<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sc3\"><span class=\"re1\">&lt;Description<span class=\"re2\">&gt;<\/span><\/span><\/span><span class=\"sc2\">&lt;![CDATA[Lorem ipsum dolor sit amet, ...]]&gt;<\/span><span class=\"sc3\"><span class=\"re1\">&lt;\/Description<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sc3\"><span class=\"re1\">&lt;Price<span class=\"re2\">&gt;<\/span><\/span><\/span><span class=\"sc2\">&lt;![CDATA[12]]&gt;<\/span><span class=\"sc3\"><span class=\"re1\">&lt;\/Price<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sc3\"><span class=\"re1\">&lt;Count<span class=\"re2\">&gt;<\/span><\/span><\/span><span class=\"sc2\">&lt;![CDATA[0]]&gt;<\/span><span class=\"sc3\"><span class=\"re1\">&lt;\/Count<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sc3\"><span class=\"re1\">&lt;Group<span class=\"re2\">&gt;<\/span><\/span><\/span><span class=\"sc2\">&lt;![CDATA[Pizza]]&gt;<\/span><span class=\"sc3\"><span class=\"re1\">&lt;\/Group<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; &nbsp;<span class=\"sc3\"><span class=\"re1\">&lt;\/item<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; &nbsp;...<br \/>\n<span class=\"sc3\"><span class=\"re1\">&lt;\/data<span class=\"re2\">&gt;<\/span><\/span><\/span><\/div><\/div>\n<p><strong>Creating Template<\/strong><\/p>\n<p>There are three parameters for each menu item: image, name, and description. There also should be a button for ordering this item, and we shouldn&#8217;t forget about the possibility to exclude an item from the order.<\/p>\n<p>Ordering features will be implemented in the last steps when the menu is associated with the order section. In this step, we&#8217;ll just create a list of menu items. A menu item will look like this:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2011\/02\/ipad_menu_item.jpg\" alt=\"Menu Item Template\" title=\"Menu Item Template\" width=\"600\" height=\"115\" class=\"aligncenter size-full wp-image-980\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2011\/02\/ipad_menu_item.jpg 600w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2011\/02\/ipad_menu_item-300x57.jpg 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/p>\n<p>HTML template:<\/p>\n<div class=\"codecolorer-container html4strict default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"html4strict codecolorer\"><span class=\"sc2\">&lt;<span class=\"kw2\">div<\/span> <span class=\"kw3\">id<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_type_submenu_container&quot;<\/span> <span class=\"kw3\">style<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;display:none;&quot;<\/span>&gt;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc2\">&lt;<span class=\"kw2\">div<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;landscape_img&quot;<\/span> <span class=\"kw3\">style<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;background:url(#Img#) no-repeat scroll 50% 20% transparent;&quot;<\/span>&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sc2\">&lt;<span class=\"kw2\">h3<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;landscape_price&quot;<\/span>&gt;<\/span>$#Price#<span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">h3<\/span>&gt;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">div<\/span>&gt;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc2\">&lt;<span class=\"kw2\">div<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;landscape_body&quot;<\/span>&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sc2\">&lt;<span class=\"kw2\">h3<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;landscape_body_header&quot;<\/span>&gt;<\/span>#Name#<span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">h3<\/span>&gt;&lt;<span class=\"kw2\">p<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;landscape_body_description&quot;<\/span>&gt;<\/span>#Description#<span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">p<\/span>&gt;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">div<\/span>&gt;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc2\">&lt;<span class=\"kw2\">div<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;landscape_buy&quot;<\/span>&gt;&lt;<span class=\"kw2\">div<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;buy_outside&quot;<\/span> &gt;&lt;<span class=\"kw2\">div<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;buy_inside&quot;<\/span>&gt;<\/span>+<span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">div<\/span>&gt;&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">div<\/span>&gt;&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">div<\/span>&gt;<\/span><br \/>\n<span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">div<\/span>&gt;<\/span><\/div><\/div>\n<p>We set this HTML container as a template for &#8220;submenu&#8221; type &#8211; a new type of the PageList view:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">dhx.<span class=\"me1\">Type<\/span><span class=\"br0\">&#40;<\/span>dhx.<span class=\"me1\">ui<\/span>.<span class=\"me1\">pagelist<\/span><span class=\"sy0\">,<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; css<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;content&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; margin<span class=\"sy0\">:<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; padding<span class=\"sy0\">:<\/span><span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; name<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;submenu&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; template<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;html-&gt;dhx_type_submenu_container&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; height<span class=\"sy0\">:<\/span> <span class=\"nu0\">150<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; width<span class=\"sy0\">:<\/span> <span class=\"nu0\">749<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; border<span class=\"sy0\">:<\/span><span class=\"nu0\">0<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p><strong>List Initialization<\/strong><\/p>\n<p>We&#8217;re initializing the list of menu items in the right column of the Layout. We need to set the following properties:<\/p>\n<ul>\n<li><strong>view<\/strong> &#8211; &#8220;pagelist&#8221; in this case<\/li>\n<li><strong>id<\/strong> &#8211; id of this PageList component, which will be required in the last steps when we&#8217;ll set connections between different elements of menu interface<\/li>\n<li><strong>layout<\/strong> &#8211; &#8220;y&#8221; since we need a vertical list<\/li>\n<li><strong>type<\/strong> &#8211; name of the type created above (&#8220;submenu&#8221;)<\/li>\n<li><strong>url<\/strong> and <strong>datatype<\/strong> of a datasource<\/li>\n<\/ul>\n<p>&nbsp;<br \/>\nThe initialization code will be:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">dhx.<span class=\"me1\">ready<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">function<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;dhx.<span class=\"me1\">ui<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;id<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;layout&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;cols<span class=\"sy0\">:<\/span><span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;width<span class=\"sy0\">:<\/span><span class=\"nu0\">275<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rows<span class=\"sy0\">:<\/span><span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;view<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;dataview&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;type<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;menu&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;id<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;menu&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;url<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;xml\/menu.xml&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;datatype<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;xml&quot;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;template<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;Order&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;height<span class=\"sy0\">:<\/span><span class=\"nu0\">120<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#93;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;view<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;pagelist&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;id<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;submenu&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;layout<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;y&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;type<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;submenu&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;url<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;xml\/content.xml&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;datatype<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;xml&quot;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#93;<\/span> &nbsp; &nbsp; &nbsp; &nbsp;<br \/>\n&nbsp; &nbsp;<span class=\"br0\">&#125;<\/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><strong>List CSS Definition<\/strong><\/p>\n<p>The PageList component, which we&#8217;re using to display menu items, inherits CSS classes from the List view. Therefore, we will need to define CSS classes for the List.<\/p>\n<p>By default the List, like any other view of DHTMLX Touch, has white background. Therefore, we need to redefine background for the list items, and set additional background for selected items. Also, text in the List items is single-lined by default and we need it to be multi-lined, so we&#8217;ll redefine white-space property too:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">.<span class=\"me1\">dhx_list_item<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; white<span class=\"sy0\">-<\/span>space<span class=\"sy0\">:<\/span> normal<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; font<span class=\"sy0\">-<\/span>weight<span class=\"sy0\">:<\/span>normal<span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n.<span class=\"me1\">dhx_list_content_item<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; background<span class=\"sy0\">:<\/span> #e9d4b5<span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n.<span class=\"me1\">dhx_list_content_item_selected<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; background<span class=\"sy0\">:<\/span> #fffcd0<span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>Some notes about these classes:<\/p>\n<ul>\n<li><strong>dhx_list_item<\/strong> class is applied to items of all List instances on the page. There is only one List instance in our layout, so we can set it safely. In addition, this class is applied to both unselected and selected items.<\/li>\n<li><strong>dhx_list_content_item<\/strong> class is applied only to the List instance that have type &#8220;content&#8221; in &#8220;css&#8221; property (in type &#8220;submenu&#8221; we have set css:&#8221;content&#8221;).<\/li>\n<li><strong>dhx_list_content_item_selected<\/strong> differs from the previous class because it is applied only to selected items.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h4 style=\"background-color:lightgrey\">STEP 4 &#8211; Landscape and Portrait Modes<\/h4>\n<p>Our menu application will be mostly adjusted to iPad screen size. The screen of the iPad (and other touch devices) can be switched from portrait to landscape mode. We need consider both these modes in our Layout, which works as a container for other components.<\/p>\n<p>We&#8217;ll set the fixed width for the left column which contains menu categories. Then we need to change the sizes of the right column and template for the PageList to ensure a correct look of the application in both portrait to landscape modes.<\/p>\n<p>For this reason, we&#8217;ll create two views of the menu list: <strong>&#8220;landscape&#8221;<\/strong>, which have been already described above:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2011\/02\/ipad_menu_item.jpg\" alt=\"Menu Item Template - Landscape Mode\" title=\"Menu Item Template - Landscape Mode\" width=\"600\" height=\"115\" class=\"aligncenter size-full wp-image-980\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2011\/02\/ipad_menu_item.jpg 600w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2011\/02\/ipad_menu_item-300x57.jpg 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/p>\n<p>and <strong>&#8220;portrait&#8221;<\/strong>:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2011\/02\/ipad_menu_item_port.jpg\" alt=\"Menu Item Template - Portrait Mode\" title=\"Menu Item Template - Portrait Mode\" width=\"392\" height=\"161\" class=\"aligncenter size-full wp-image-984\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2011\/02\/ipad_menu_item_port.jpg 392w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2011\/02\/ipad_menu_item_port-300x123.jpg 300w\" sizes=\"auto, (max-width: 392px) 100vw, 392px\" \/><\/p>\n<p>HTML template for the menu item in the PageList for portrait mode:<\/p>\n<div class=\"codecolorer-container html4strict default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"html4strict codecolorer\"><span class=\"sc2\">&lt;<span class=\"kw2\">div<\/span> <span class=\"kw3\">id<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_type_portrait_container&quot;<\/span> <span class=\"kw3\">style<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;display:none;&quot;<\/span>&gt;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc2\">&lt;<span class=\"kw2\">div<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;portrait_img&quot;<\/span> <span class=\"kw3\">style<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;background:url(#Img#) no-repeat scroll 50% 0% transparent;&quot;<\/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\">div<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;portrait_header&quot;<\/span>&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sc2\">&lt;<span class=\"kw2\">h3<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;portrait_header_name&quot;<\/span>&gt;<\/span>#Name#<span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">h3<\/span>&gt;&lt;<span class=\"kw2\">div<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;portrait_header_price&quot;<\/span>&gt;<\/span>$#Price#<span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">div<\/span>&gt;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">div<\/span>&gt;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc2\">&lt;<span class=\"kw2\">div<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;portrait_buy&quot;<\/span>&gt;&lt;<span class=\"kw2\">div<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;buy_outside&quot;<\/span>&gt;&lt;<span class=\"kw2\">div<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;buy_inside&quot;<\/span>&gt;<\/span>+<span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">div<\/span>&gt;&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">div<\/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\">div<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;portrait_description&quot;<\/span>&gt;<\/span>#Description#<span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">div<\/span>&gt;<\/span><br \/>\n<span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">div<\/span>&gt;<\/span><\/div><\/div>\n<p><strong>Type Definition<\/strong><\/p>\n<p>Background color and some other properties are defined in the CSS classes that are associated with &#8220;css&#8221; property of the PageList type. Both &#8220;landscape&#8221; and &#8220;portrait&#8221; types will have some common properties. Therefore, we are creating an object that contains common properties and then extend a certain type with properties defined in this object.<\/p>\n<div class=\"codecolorer-container css default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"css codecolorer\">pagelist_type <span class=\"sy0\">=<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; css<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;content&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">margin<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">padding<\/span><span class=\"sy0\">:<\/span><span class=\"nu0\">0<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>To add these properties to &#8220;landscape&#8221; and &#8220;portrait&#8221; objects, call <strong>dhx.extend<\/strong> method:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">landscape_type <span class=\"sy0\">=<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; name<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;landscape&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; template<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;html-&gt;dhx_type_landscape_container&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; height<span class=\"sy0\">:<\/span> <span class=\"nu0\">150<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; width<span class=\"sy0\">:<\/span> <span class=\"nu0\">749<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\ndhx.<span class=\"me1\">extend<\/span><span class=\"br0\">&#40;<\/span>landscape_type<span class=\"sy0\">,<\/span>pagelist_type<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nportrait_type <span class=\"sy0\">=<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; name<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;portrait&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; template<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;html-&gt;dhx_type_portrait_container&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; height<span class=\"sy0\">:<\/span> <span class=\"nu0\">210<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; width<span class=\"sy0\">:<\/span> <span class=\"nu0\">492<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\ndhx.<span class=\"me1\">extend<\/span><span class=\"br0\">&#40;<\/span>portrait_type<span class=\"sy0\">,<\/span>pagelist_type<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"coMULTI\">\/*landscape type*\/<\/span><br \/>\ndhx.<span class=\"me1\">Type<\/span><span class=\"br0\">&#40;<\/span>dhx.<span class=\"me1\">ui<\/span>.<span class=\"me1\">pagelist<\/span><span class=\"sy0\">,<\/span>landscape_type<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"coMULTI\">\/*portrait type*\/<\/span><br \/>\ndhx.<span class=\"me1\">Type<\/span><span class=\"br0\">&#40;<\/span>dhx.<span class=\"me1\">ui<\/span>.<span class=\"me1\">pagelist<\/span><span class=\"sy0\">,<\/span>portrait_type<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>Now both types have been defined and we need to set &#8220;orientationchange&#8221; event listener that will change the type of menu list according to the device orientation.<\/p>\n<p><strong>Changing List Type<\/strong><\/p>\n<p>Screen mode can be checked by window.orientation property that indicates whether the screen is in portrait or landscape mode. If window.orientation returns 0 or 180, we need to set &#8220;portrait&#8221; type, and if it is 90 or -90, the type should be &#8220;landscape&#8221;.<\/p>\n<p>To redefine configuration property of any view, you may call define method. And in this case, we&#8217;ll need the list id (&#8220;submenu&#8221;). <strong>$$(&#8220;submenu&#8221;)<\/strong> returns the object of menu list, and we then can apply methods to it. For example, <strong>$$(&#8220;submenu&#8221;).define(&#8220;type&#8221;,&#8221;portrait&#8221;)<\/strong>.<\/p>\n<p>Here is the complete function that sets appropriate type and adjusts the Layout sizes:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">function<\/span> orientation<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">var<\/span> orientation <span class=\"sy0\">=<\/span> window.<span class=\"me1\">orientation<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>orientation <span class=\"sy0\">===<\/span> <span class=\"nu0\">0<\/span> <span class=\"sy0\">||<\/span> orientation <span class=\"sy0\">===<\/span> <span class=\"nu0\">180<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; $$<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;submenu&quot;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">define<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;type&quot;<\/span><span class=\"sy0\">,<\/span><span class=\"st0\">&quot;portrait&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">else<\/span> <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>orientation <span class=\"sy0\">===<\/span> <span class=\"nu0\">90<\/span> <span class=\"sy0\">||<\/span> orientation <span class=\"sy0\">===<\/span> <span class=\"sy0\">-<\/span><span class=\"nu0\">90<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; $$<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;submenu&quot;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">define<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;type&quot;<\/span><span class=\"sy0\">,<\/span><span class=\"st0\">&quot;landscape&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"coMULTI\">\/*rendering list with the new type*\/<\/span><br \/>\n&nbsp; &nbsp; $$<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;submenu&quot;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">render<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"coMULTI\">\/*recalculating Layout sizes (Layout has &quot;layout&quot; id)*\/<\/span><br \/>\n&nbsp; &nbsp; $$<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;layout&quot;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">resize<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><br \/>\norientation<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p><strong>Setting Event Listener<\/strong><\/p>\n<p>When the screen of the device changes orientation, browser window fires &#8216;orientationchange&#8217; event. We are using DHTMLX API to set event listener &#8211; <strong>dhx.event(object,eventName,handler)<\/strong>:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">dhx.<span class=\"me1\">event<\/span><span class=\"br0\">&#40;<\/span>window<span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;orientationchange&quot;<\/span><span class=\"sy0\">,<\/span> orientation<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>So, our menu will be properly displayed in both portrait and landscape modes.<\/p>\n<h4 style=\"background-color:lightgrey\">STEP 5 &#8211; Linking Categories and List<\/h4>\n<p>Since the restaurant menu may contain a large number of different items\/dishes, in our application we&#8217;ll filter and display them by categories (pizza, pasta, drinks, etc.). In the right column we&#8217;ll show the list of items (the view with &#8220;submenu&#8221; id) that belong to a menu category selected from the list in the left column (the view with &#8220;menu&#8221; id).<\/p>\n<p>There are two possible ways to implement this functionality. The first one is to set onItemClick event handler for the &#8220;menu&#8221; and call filter method for the &#8220;submenu&#8221;. However, in this tutorial we want to demonstrate the other way &#8211; linking views by DataProcessor.<\/p>\n<p>In the DataProcessor configuration we need to define the master view. It will be &#8220;menu&#8221;, since the list of menu items displayed in &#8220;submenu&#8221; depends on the category selected by user in &#8220;menu&#8221;.<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">var<\/span> dp <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> dhx.<span class=\"me1\">DataProcessor<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; master<span class=\"sy0\">:<\/span>$$<span class=\"br0\">&#40;<\/span><span class=\"st0\">'menu'<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>Then we need to call <strong>link()<\/strong> method to associate master and linked views with each other. Views can be linked by some property, for example, &#8220;Group&#8221; property of &#8220;submenu&#8221; view relates to &#8220;Name&#8221; property of &#8220;menu&#8221;: &#8220;Pasta&#8221;, &#8220;Pizza&#8221;, &#8220;Drinks&#8221; or &#8220;Coffee&#8221;.<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">dp.<span class=\"me1\">link<\/span><span class=\"br0\">&#40;<\/span>$$<span class=\"br0\">&#40;<\/span><span class=\"st0\">'submenu'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span> <span class=\"kw1\">function<\/span><span class=\"br0\">&#40;<\/span>master<span class=\"sy0\">,<\/span> linked<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">return<\/span> linked.<span class=\"me1\">Group<\/span><span class=\"sy0\">==<\/span>master.<span class=\"me1\">Name<\/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 order to filter the list by default we set &#8220;onXLE&#8221; event handler for master view and select one of its items:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">$$<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;menu&quot;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">attachEvent<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;onXLE&quot;<\/span><span class=\"sy0\">,<\/span><span class=\"kw1\">function<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">this<\/span>.<span class=\"me1\">select<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">2<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><\/div><\/div>\n<p>Actually linking views by DataProcessor solves the problem of asynchronous loading of two different data sources, because &#8220;onXLE&#8221; event is called after datasource of a certain component has been loaded to the client side. <\/p>\n<p>In our example we need to filter the menu items only when data for both components &#8211; &#8220;menu&#8221; and &#8220;submenu&#8221; &#8211; has been loaded to the browser. If views are linked by DataProcessor, the loading process is managed by inner methods and we don&#8217;t have to worry about asynchronous loading.<\/p>\n<h4 style=\"background-color:lightgrey\">STEP 6 &#8211; Adding Order Button<\/h4>\n<p>Now let&#8217;s add an order confirmation section to our menu. We&#8217;ll place it in the bottom row of the left column of our Layout. It will contain the total order price and <strong>Order<\/strong> button. This is how our order pane will look:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2011\/02\/menu_app_order.png\" alt=\"Restaurant Menu App - Order Button\" title=\"Restaurant Menu App - Order Button\" width=\"273\" height=\"110\" class=\"aligncenter size-full wp-image-987\" \/><\/p>\n<p>We will use &#8220;template&#8221; view, as we need to display only one data item with total price. This view will contain the following properties:<\/p>\n<ul>\n<li><strong>view<\/strong> &#8211; &#8220;template&#8221;<\/li>\n<li><strong>id<\/strong> &#8211; &#8220;order&#8221;<\/li>\n<li><strong>css<\/strong> &#8211; here we&#8217;ll define the CSS class for view, since we need to set background color and remove view borders<\/li>\n<li><strong>template<\/strong> &#8211; template that defines how total price counter and button will look<\/li>\n<li><strong>data<\/strong> &#8211; data object for the template<\/li>\n<li><strong>height<\/strong> &#8211; row hieght<\/li>\n<\/ul>\n<p>&nbsp;<br \/>\nIn our previous steps we have used HTML templates. However, a template can also be defined by JavaScript function that takes data object as a parameter. So, now we&#8217;ll use this  second approach:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">dhx.<span class=\"me1\">ui<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; id<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;layout&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; cols<span class=\"sy0\">:<\/span><span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; width<span class=\"sy0\">:<\/span><span class=\"nu0\">275<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rows<span class=\"sy0\">:<\/span><span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"coMULTI\">\/*this is dataview with categories*\/<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; view<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;template&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; id<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;order&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; css<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;order_row&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; template<span class=\"sy0\">:<\/span><span class=\"kw1\">function<\/span><span class=\"br0\">&#40;<\/span>obj<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">var<\/span> str <span class=\"sy0\">=<\/span> <span class=\"st0\">'&lt;h3 class=&quot;order_container_header&quot;&gt;Total: '<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; str <span class=\"sy0\">+=<\/span> <span class=\"st0\">'&lt;span id=&quot;order&quot; style=&quot;color:#ffc937;&quot;&gt;'<\/span><span class=\"sy0\">+<\/span>obj.<span class=\"me1\">total<\/span><span class=\"sy0\">+<\/span><span class=\"st0\">'$&lt;\/span&gt;'<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; str <span class=\"sy0\">+=<\/span> <span class=\"st0\">'&lt;\/h3&gt;'<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; str <span class=\"sy0\">+=<\/span> <span class=\"st0\">'&lt;a href=&quot;javascript:void(0)&quot; class=&quot;order_container_button&quot; onclick=&quot;saveOrder();&quot;&gt;Order&lt;\/a&gt;'<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> str<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; data<span class=\"sy0\">:<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; total<span class=\"sy0\">:<\/span><span class=\"nu0\">0<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; height<span class=\"sy0\">:<\/span><span class=\"nu0\">120<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#93;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"coMULTI\">\/*this is menu list*\/<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#93;<\/span> &nbsp; &nbsp; &nbsp; &nbsp;<br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>Now, when all interface elements have taken their places, we should add a logic for making an order. For that we need to associate the menu list and order view. So, let&#8217;s move to the last step.<\/p>\n<h4 style=\"background-color:lightgrey\">STEP 7 &#8211; Improving Menu Templates and Setting Event Handlers<\/h4>\n<p><strong>Changing &#8220;Portrait&#8221; and &#8220;Landscape&#8221; Types<\/strong><\/p>\n<p>In the steps 3 and 4 we have created &#8220;landscape&#8221; and &#8220;portrait&#8221; types for the list of menu items. Now we need to modify them a bit. Icon in the right part of the menu item template should be clickbable and display the number of ordered items. Besides, there should be a button to decrease the number of ordered items.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2011\/02\/ipad_menu_item_order.jpg\" alt=\"Restaurant Menu App - Menu Item Order\" title=\"Restaurant Menu App - Menu Item Order\" width=\"600\" height=\"115\" class=\"aligncenter size-full wp-image-989\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2011\/02\/ipad_menu_item_order.jpg 600w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2011\/02\/ipad_menu_item_order-300x57.jpg 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/p>\n<p>Here is the final template for the &#8220;landscape&#8221; type:<\/p>\n<div class=\"codecolorer-container html4strict default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"html4strict codecolorer\"><span class=\"sc2\">&lt;<span class=\"kw2\">div<\/span> <span class=\"kw3\">id<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_type_landscape_container&quot;<\/span> <span class=\"kw3\">style<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;display:none;&quot;<\/span>&gt;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc2\">&lt;<span class=\"kw2\">div<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;landscape_img&quot;<\/span> <span class=\"kw3\">style<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;background:url(#Img#) no-repeat scroll 50% 20% transparent;&quot;<\/span>&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sc2\">&lt;<span class=\"kw2\">h3<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;landscape_price&quot;<\/span>&gt;<\/span>$#Price#<span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">h3<\/span>&gt;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">div<\/span>&gt;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc2\">&lt;<span class=\"kw2\">div<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;landscape_body&quot;<\/span>&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sc2\">&lt;<span class=\"kw2\">h3<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;landscape_body_header&quot;<\/span>&gt;<\/span>#Name#<span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">h3<\/span>&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sc2\">&lt;<span class=\"kw2\">p<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;landscape_body_description&quot;<\/span>&gt;<\/span>#Description#<span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">p<\/span>&gt;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">div<\/span>&gt;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc2\">&lt;<span class=\"kw2\">div<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;landscape_buy&quot;<\/span>&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sc2\">&lt;<span class=\"kw2\">div<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;buy_outside&quot;<\/span> &gt;&lt;<span class=\"kw2\">div<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;buy_inside&quot;<\/span>&gt;<\/span>{common.count()}<span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">div<\/span>&gt;&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">div<\/span>&gt;<\/span>{common.state()}<br \/>\n&nbsp; &nbsp; <span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">div<\/span>&gt;<\/span><br \/>\n<span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">div<\/span>&gt;<\/span><\/div><\/div>\n<p>and this is &#8220;portrait&#8221; template:<\/p>\n<div class=\"codecolorer-container html4strict default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"html4strict codecolorer\">&lt;<span class=\"kw2\">div<\/span> <span class=\"kw3\">id<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_type_portrait_container&quot;<\/span> <span class=\"kw3\">style<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;display:none;&quot;<\/span>&gt;<br \/>\n&nbsp; &nbsp; &lt;<span class=\"kw2\">div<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;portrait_img&quot;<\/span> <span class=\"kw3\">style<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;background:url(#Img#) no-repeat scroll 50% 0% transparent;&quot;<\/span>&gt;&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">div<\/span>&gt;<br \/>\n&nbsp; &nbsp; &lt;<span class=\"kw2\">div<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;portrait_header&quot;<\/span>&gt;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &lt;<span class=\"kw2\">h3<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;portrait_header_name&quot;<\/span>&gt;#Name#&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">h3<\/span>&gt;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &lt;<span class=\"kw2\">div<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;portrait_header_price&quot;<\/span>&gt;$#Price#&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">div<\/span>&gt;<br \/>\n&nbsp; &nbsp; &lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">div<\/span>&gt;<br \/>\n&nbsp; &nbsp; &lt;<span class=\"kw2\">div<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;portrait_buy&quot;<\/span>&gt;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &lt;<span class=\"kw2\">div<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;buy_outside&quot;<\/span>&gt;&lt;<span class=\"kw2\">div<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;buy_inside&quot;<\/span>&gt;<span class=\"br0\">&#123;<\/span>common.count<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#125;<\/span>&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">div<\/span>&gt;&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">div<\/span>&gt;<span class=\"br0\">&#123;<\/span>common.state<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">div<\/span>&gt;<br \/>\n&nbsp; &nbsp; &lt;<span class=\"kw2\">div<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;portrait_description&quot;<\/span>&gt;#Description#&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">div<\/span>&gt;<br \/>\n&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">div<\/span>&gt;<\/div><\/div>\n<p>These templates differ from the templates that have been created in the 3th and 4th steps by <strong>{common.count()}<\/strong> and <strong>{common.state()}<\/strong> constructions (here common represents a view type). <\/p>\n<p><strong>{common.state()}<\/strong> is a result which is returned by state method of a list type. <strong>count()<\/strong> method returns &#8220;+&#8221; or number of ordered items, <strong>state()<\/strong> returns empty string or HTML container that will be used to decrease the number of ordered items.<\/p>\n<p>&#8220;landscape&#8221; and &#8220;portrait&#8221; types need <strong>count()<\/strong> and <strong>state()<\/strong> methods. We are defining these methods in the object which properties are inherited by both types:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">var<\/span> pagelist_type <span class=\"sy0\">=<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; css<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;content&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; margin<span class=\"sy0\">:<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; padding<span class=\"sy0\">:<\/span><span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; state<span class=\"sy0\">:<\/span><span class=\"kw1\">function<\/span><span class=\"br0\">&#40;<\/span>obj<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>obj.<span class=\"me1\">Count<\/span><span class=\"sy0\">&gt;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"st0\">&quot;&lt;div class='buy_dec_outside'&gt;&lt;div class='buy_dec_inside'&gt;&amp;nbsp;&lt;\/div&gt;&lt;\/div&gt;&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"st0\">&quot;&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; count<span class=\"sy0\">:<\/span><span class=\"kw1\">function<\/span><span class=\"br0\">&#40;<\/span>obj<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>obj.<span class=\"me1\">Count<\/span><span class=\"sy0\">&gt;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> obj.<span class=\"me1\">Count<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"st0\">&quot;+&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\ndhx.<span class=\"me1\">extend<\/span><span class=\"br0\">&#40;<\/span>landscape_type<span class=\"sy0\">,<\/span>pagelist_type<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\ndhx.<span class=\"me1\">extend<\/span><span class=\"br0\">&#40;<\/span>portrait_type<span class=\"sy0\">,<\/span>pagelist_type<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\ndhx.<span class=\"me1\">Type<\/span><span class=\"br0\">&#40;<\/span>dhx.<span class=\"me1\">ui<\/span>.<span class=\"me1\">pagelist<\/span><span class=\"sy0\">,<\/span>landscape_type<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\ndhx.<span class=\"me1\">Type<\/span><span class=\"br0\">&#40;<\/span>dhx.<span class=\"me1\">ui<\/span>.<span class=\"me1\">pagelist<\/span><span class=\"sy0\">,<\/span>portrait_type<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>Now we need to link menu items with the Order section. <\/p>\n<p><strong>Setting Event Listeners for HTML Elements Inside Menu Item<\/strong><\/p>\n<p>We need to set onclick event listener to the div container with &#8220;buy_outside&#8221; CSS class. This listener will add a menu item in the order. In the &#8220;landscape&#8221; and &#8220;portrait&#8221; types we have defined <strong>count()<\/strong> method that returns value of this container. This value depends on Count property of data items, number of ordered items. So, in the event handler we need to increase Count property and redraw menu item to display data modifications. Also, we may highlight ordered item by <strong>select()<\/strong> method.<\/p>\n<p>The DHTMLX Touch library provides a ready solution to set onclick event listener &#8211; on_click object. You need to add className of a necessary HTML container into this object and set event handler as a property value:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">$$<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;submenu&quot;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">on_click<\/span><span class=\"br0\">&#91;<\/span><span class=\"st0\">&quot;buy_outside&quot;<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw1\">function<\/span><span class=\"br0\">&#40;<\/span>e<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"coMULTI\">\/*id of the data item by event object*\/<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">var<\/span> id <span class=\"sy0\">=<\/span> <span class=\"kw1\">this<\/span>.<span class=\"me1\">locate<\/span><span class=\"br0\">&#40;<\/span>e<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"coMULTI\">\/*data item by its id*\/<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">var<\/span> data <span class=\"sy0\">=<\/span> <span class=\"kw1\">this<\/span>.<span class=\"kw1\">get<\/span><span class=\"br0\">&#40;<\/span>id<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"coMULTI\">\/*incresing number of ordered items*\/<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>data.<span class=\"me1\">Count<\/span> <span class=\"sy0\">==<\/span> <span class=\"nu0\">99<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span> <span class=\"kw1\">else<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; i <span class=\"sy0\">=<\/span> parseInt<span class=\"br0\">&#40;<\/span>data.<span class=\"me1\">Count<\/span><span class=\"sy0\">,<\/span><span class=\"nu0\">10<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; data.<span class=\"me1\">Count<\/span> <span class=\"sy0\">=<\/span> i<span class=\"sy0\">+<\/span><span class=\"nu0\">1<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; <span class=\"coMULTI\">\/*changing the total price of the order*\/<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">var<\/span> currentOrder <span class=\"sy0\">=<\/span> $$<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;order&quot;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">data<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; $$<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;order&quot;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">data<\/span>.<span class=\"me1\">total<\/span> <span class=\"sy0\">+=<\/span> parseInt<span class=\"br0\">&#40;<\/span>data.<span class=\"me1\">Price<\/span><span class=\"sy0\">,<\/span><span class=\"nu0\">10<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"coMULTI\">\/*redrawing &quot;order&quot; view*\/<\/span><br \/>\n&nbsp; &nbsp; $$<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;order&quot;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">render<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; <span class=\"coMULTI\">\/*If an item is already ordered, redraw it (apply count).<br \/>\n&nbsp; &nbsp; In the other case, the item is selected (selection causes redrawing)*\/<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span><span class=\"kw1\">this<\/span>.<span class=\"me1\">isSelected<\/span><span class=\"br0\">&#40;<\/span>id<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">this<\/span>.<span class=\"me1\">refresh<\/span><span class=\"br0\">&#40;<\/span>id<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">else<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">this<\/span>.<span class=\"me1\">select<\/span><span class=\"br0\">&#40;<\/span>id<span class=\"sy0\">,<\/span> <span class=\"kw2\">true<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"kw2\">true<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>A similar approach can be used for the container with &#8220;buy_dec_outside&#8221; className which is defined in the <strong>state()<\/strong> method of list types. Its onlick listener will remove menu item from the order:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">$$<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;submenu&quot;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">on_click<\/span><span class=\"br0\">&#91;<\/span><span class=\"st0\">&quot;buy_dec_outside&quot;<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw1\">function<\/span><span class=\"br0\">&#40;<\/span>e<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"coMULTI\">\/*id of the clicked item by event*\/<\/span> <br \/>\n&nbsp; &nbsp; <span class=\"kw1\">var<\/span> id <span class=\"sy0\">=<\/span> <span class=\"kw1\">this<\/span>.<span class=\"me1\">locate<\/span><span class=\"br0\">&#40;<\/span>e<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"coMULTI\">\/*decrease number of ordered items*\/<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">var<\/span> data <span class=\"sy0\">=<\/span> <span class=\"kw1\">this<\/span>.<span class=\"kw1\">get<\/span><span class=\"br0\">&#40;<\/span>id<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; data.<span class=\"me1\">Count<\/span> <span class=\"sy0\">--;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"coMULTI\">\/*changing the total price of the order*\/<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">var<\/span> currentOrder <span class=\"sy0\">=<\/span> $$<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;order&quot;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">data<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; $$<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;order&quot;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">data<\/span>.<span class=\"me1\">total<\/span> <span class=\"sy0\">-=<\/span> parseInt<span class=\"br0\">&#40;<\/span>data.<span class=\"me1\">Price<\/span><span class=\"sy0\">,<\/span><span class=\"nu0\">10<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; $$<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;order&quot;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">render<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; <span class=\"coMULTI\">\/*If the last instance of the item is removed from an order, its selection is cleared.<br \/>\n&nbsp; &nbsp; &nbsp;In the other case, it is refreshed*\/<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span><span class=\"sy0\">!<\/span>data.<span class=\"me1\">Count<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">this<\/span>.<span class=\"me1\">unselect<\/span><span class=\"br0\">&#40;<\/span>id<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">else<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">this<\/span>.<span class=\"me1\">refresh<\/span><span class=\"br0\">&#40;<\/span>id<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>Now items can be placed in the order and removed, if needed. The total price is displayed above the <strong>Order<\/strong> button. <\/p>\n<p>Finally, our restaurant menu application is ready. Its sizes are configured mostly for iPad, but it will also run on other touch devices and in WebKit browsers.<br \/>\n<small>Posted by Alexandra Klenova<\/small><\/p>\n","protected":false},"excerpt":{"rendered":"<p>DHTMLX Touch support and development was discontinued when all DHTMLX components became adaptive. In this tutorial, we will share some experience of using the DHTMLX Touch framework for building &#8230;<\/p>\n","protected":false},"author":2,"featured_media":3428,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[71,1],"tags":[33,14,23,22],"class_list":["post-968","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorials","category-uncategorized","tag-all-posts","tag-tips","tag-mobile","tag-touch"],"_links":{"self":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/968","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=968"}],"version-history":[{"count":3,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/968\/revisions"}],"predecessor-version":[{"id":14996,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/968\/revisions\/14996"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media\/3428"}],"wp:attachment":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media?parent=968"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/categories?post=968"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/tags?post=968"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}