Сегодня — наша последняя часть нашего «Bottom Menu Builder», который мы начали вчера. Мы собираемся реализовать наши последние функции: Предварительный просмотр и Экспорт (необязательно). Таким образом, веб-мастер сможет упорядочивать ссылки путем перетаскивания, а затем он может нажать кнопку «Предварительный просмотр» для предварительного просмотра (и экспорта результатов). Я переместил все ссылки в отдельный php-файл (и теперь мы можем иметь прямой доступ к этим ссылкам из PHP). В вашем случае это может быть база данных в качестве примера (в случае большого проекта). Итак, начнем..
В качестве первого, я бы предложил вам скачать исходные файлы и держать демонстрацию открытой во вкладке для лучшего понимания.
Live Demo
результат загрузки
Итак, начнем!
Шаг 1. HTML
Сегодня у нас нет статических html-файлов, я переместил содержимое нашего index.html в новый файл index.php.
Шаг 2. CSS
В дополнение к нашему файлу main.css я добавил новый файл CSS (для стилизации нашей страницы предварительного просмотра):
CSS / bmenu.css
/* menu builder styles */ .actions { border: 1px solid #CCCCCC; font-size: 24px; margin: 20px auto 5px; overflow: hidden; padding: 10px; width: 900px; /* CSS3 Box sizing property */ -moz-box-sizing: border-box; -webkit-box-sizing: border-box; -o-box-sizing: border-box; box-sizing: border-box; } .columns { margin: 0 auto; overflow: hidden; width: 900px; } .column { border: 1px dotted #ccc; float: left; min-height: 100px; padding: 10px; position: relative; width: 33.3%; /* CSS3 Box sizing property */ -moz-box-sizing: border-box; -webkit-box-sizing: border-box; -o-box-sizing: border-box; box-sizing: border-box; } .column a { cursor: pointer; display: block; font-size: 16px; height: 30px; margin-bottom: 5px; position: relative; text-align: center; }
Шаг 3. JS
Пожалуйста, добавьте следующий код в наш файл main.js (внизу, сразу после вызова updateHandlerDrop):
JS / main.js
// preview button var previewBtn = document.querySelectorAll('#preview'); addEvent(previewBtn, 'click', function (event) { if (event.preventDefault) event.preventDefault(); var params = ''; var oColumns = document.querySelectorAll('div.column'); for (var i = 0; i < oColumns.length; i++) { var iCol = i+1; var sColElems = ''; for (var k = 0; k < oColumns[i].childNodes.length; k++) { if (oColumns[i].childNodes[k].nodeType == document.ELEMENT_NODE && oColumns[i].childNodes[k].tagName == 'A') { sColElems += oColumns[i].childNodes[k].id + '_'; } } params += iCol + '=' + sColElems + '&'; } // open results var http = new XMLHttpRequest(); http.open('POST', 'preview.php', true); http.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); http.setRequestHeader('Content-length', params.length); http.setRequestHeader('Connection', 'close'); http.onreadystatechange = function() { if (http.readyState == 4 && http.status == 200) { document.open(); document.write(http.responseText); return; } } http.send(params); return false; });
Это код кнопки предварительного просмотра. Как видите, он готовит все необходимые параметры для отправки в наш новый файл preview.php. По сути, это своего рода сериализация наших активных ссылок (в столбцах).
Шаг 4. PHP
Теперь пришло время ознакомиться с нашими сценариями на стороне сервера. Как я уже говорил, я переместил все ссылки в отдельный php-файл (links.php), вот он:
links.php
<? $aLinks = array( 1 => array('Link 1', '#link1'), 2 => array('Link 2', '#link2'), 3 => array('Link 3', '#link3'), 4 => array('Link 4', '#link4'), 5 => array('Link 5', '#link5'), 6 => array('Link 6', '#link6'), 7 => array('Link 7', '#link7'), 8 => array('Link 8', '#link8'), 9 => array('Link 9', '#link9'), 10 => array('Link 10', '#link10'), 11 => array('Link 11', '#link11'), 12 => array('Link 12', '#link12') );
Теперь я должен сгенерировать код для нашей индексной страницы (с помощью компоновщика) с использованием этого массива:
index.php
<?php require_once('links.php'); // include set of all possible links // prepare draggable elements $sLinks = ''; foreach ($aLinks as $i => $aPair) { list($sText, $sUrl) = $aPair; $sLinks .= '<a id="'.$i.'" draggable="true">'.$sText.'</a>'; } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title>Bottom Menu Builder (HTML5) - Step 2 (of 2) | Script Tutorials</title> <link href="css/main.css" rel="stylesheet" type="text/css" /> </head> <body> <header tabindex="0"> <h2>Bottom Menu Builder (HTML5) - Step 2 (of 2)</h2> <a href="http://www.script-tutorials.com/bottom-menu-builder-html5-2/" class="stuts">Back to original tutorial on <span>Script Tutorials</span></a> </header> <div class="actions"> Actions: <button id="preview">Preview</button> <button id="add_col">Add Column</button> </div> <div class="actions">Columns (with active elements)</div> <div class="columns"> <div class="column" id="drop_1" droppable="true"><img src="images/delete.png" onclick="removeColumn(this)" /></div> <div class="column" id="drop_2" droppable="true"><img src="images/delete.png" onclick="removeColumn(this)" /></div> <div class="column" id="drop_3" droppable="true"><img src="images/delete.png" onclick="removeColumn(this)" /></div> </div> <div style="clear:both"></div> <div class="actions">All (inactive) elements. You can drag these elements into columns.</div> <div class="inactive" droppable="true"> <?= $sLinks ?> </div> <script src="js/main.js"></script> </body> </html>
И, наконец, наша страница предварительного просмотра:
preview.php
<?php require_once('links.php'); // include set of all possible links $sColumns = ''; $iColCnt = count($_POST); // Columns count $dWidth = round(100 / $iColCnt, 1); // Column width foreach ($_POST as $sCol => $sColEls) { // walk through all POST params $iColId = (int)$sCol; // Column ID $sColumns .= '<div class="column" style="width:'.$dWidth.'%">'; $aEls = explode('_', $sColEls); // obtain elements in column if (is_array($aEls) && count($aEls)) { foreach ($aEls as $iPos => $sEl) { // walk through all elements $iEl = (int)$sEl; if ($iEl) { list($sText, $sUrl) = $aLinks[$iEl]; $sColumns .= '<a href="'.$sUrl.'">'.$sText.'</a>'; } } } $sColumns .= '</div>'; } // Here you can save current value of $sColumns into some cache file //file_put_contents('cache/bottom_menu.html', $sColumns); ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title>Bottom Menu Builder (HTML5) - Step 2 (of 2) | Script Tutorials</title> <link href="css/bmenu.css" rel="stylesheet" type="text/css" /> </head> <body> <header tabindex="0"> <h2>Bottom Menu Builder (HTML5) - Step 2 (of 2)</h2> <a href="http://www.script-tutorials.com/bottom-menu-builder-html5-2/" class="stuts">Back to original tutorial on <span>Script Tutorials</span></a> </header> <div class="actions">Result bottom menu (preview) <a href="index.php" style="float:right">Start again</a> </div> <div class="columns"> <?= $sColumns /*and finally - draw our result menu*/ ?> </div> </body> </html>
Небольшой код вверху — подготовка результирующего нижнего меню (с колонками). Как вы можете видеть, вы даже можете раскомментировать ‘file_put_contents’, чтобы сгенерировать кеш-файл меню результатов.
Live Demo
результат загрузки
Вывод
Вот и все, я надеюсь, что мы создали действительно удобный для пользователя скрипт — построитель меню html5 drag and drop. Надеюсь, что наш учебник помог вам. Не стесняйтесь делиться нашими уроками с друзьями. Удачи!