Строим свою CMS на PHP и MySQL. Часть 8

В предыдущих уроках серии мы начала добавлять функционал категорий в нашу простую CMS. Сделаем следующий шаг - модифицируем скрипты серверной и клиентской частей.

Модифицируем скрипт index.php клиентской части


Добавим в скрипт клиентской части index.php функционал для отображения категорий. Вот так будет выглядеть готовый файл index.php в папке cms:

Код

<?php
   
require( "config.php" );
$action = isset( $_GET['action'] ) ? $_GET['action'] : "";
   
switch ( $action ) {
  case 'archive':
  archive();
  break;
  case 'viewArticle':
  viewArticle();
  break;
  default:
  homepage();
}
   
function archive() {
  $results = array();
  $categoryId = ( isset( $_GET['categoryId'] ) && $_GET['categoryId'] ) ? (int)$_GET['categoryId'] : null;
  $results['category'] = Category::getById( $categoryId );
  $data = Article::getList( 100000, $results['category'] ? $results['category']->id : null );
  $results['articles'] = $data['results'];
  $results['totalRows'] = $data['totalRows'];
  $data = Category::getList();
  $results['categories'] = array();
  foreach ( $data['results'] as $category ) $results['categories'][$category->id] = $category;
  $results['pageHeading'] = $results['category'] ? $results['category']->name : "Article Archive";
  $results['pageTitle'] = $results['pageHeading'] . " | Widget News";
  require( TEMPLATE_PATH . "/archive.php" );
}
   
function viewArticle() {
  if ( !isset($_GET["articleId"]) || !$_GET["articleId"] ) {
  homepage();
  return;
  }
   
  $results = array();
  $results['article'] = Article::getById( (int)$_GET["articleId"] );
  $results['category'] = Category::getById( $results['article']->categoryId );
  $results['pageTitle'] = $results['article']->title . " | Widget News";
  require( TEMPLATE_PATH . "/viewArticle.php" );
}
   
function homepage() {
  $results = array();
  $data = Article::getList( HOMEPAGE_NUM_ARTICLES );
  $results['articles'] = $data['results'];
  $results['totalRows'] = $data['totalRows'];
  $data = Category::getList();
  $results['categories'] = array();
  foreach ( $data['results'] as $category ) $results['categories'][$category->id] = $category;
  $results['pageTitle'] = "Widget News";
  require( TEMPLATE_PATH . "/homepage.php" );
}
   
?>

Рассмотрим подробно изменения функций в index.php:

archive()
Оригинальная функция archive() просто выводила список всех статей в CMS. Мы адаптируем функцию archive() так, чтобы она принимала опциональный параметр categoryId. Если categoryId задан, то функция возвращает соответствующий объект Category с помощью вызова Category::getById(), и если действие было успешным, передает ID категории в функцию Article::getList() для получения статей только из соответствующей категории.

Также добавляем код в функцию archive() для получения всех категорий в базе данных и сохранения их в $results['categories'] с ID категории в качестве ключа. Шаблон страницы архива archive.php использует банный массив для вывода имени категории для каждой статьи.

Создаем переменную $results['pageHeading'], которая содержит либо имя категории (если categoryId было задано), либо текст "Article Archive". Данное значение будет отображаться в заголовке страницы архива. Также создаем переменную $results['pageTitle'] для использования в элементе . Просто для вывода названия сайта "Widget News" в заголовке страницы. <br /><br /> <br /><br /> viewArticle() <br /> Здесь мы делаем только одно добавление: возвращаем объект Category соответствующий статье с помощью вызова метода Category::getById(), передавая ему значение свойства статьи $categoryId. Полученный объект Category сохраняем $results['category']. Будем использовать данный объект для вывода названия категории в шаблоне viewArticle.php. <br /><br /> homepage() <br /> В функцию homepage() добавляем три строки. Данный код вызывает Category::getList() для получения всех категорий в CMS, затем сохраняем категории в $results['categories'] с ID категории в качестве ключа. То есть мы можем вывести названия категорий для каждой статьи на главной странице. <br /><br /> <br /><br /> <b>Модифицируем скрипт серверной части admin.php</b><hr /> <br /><br /> Файл admin.php содержит все функции администратора для нашей CMS. Нужно сделать несколько изменений и добавлений в данной файле для обработки категорий. <br /><br /> Новый код файла admin.php, будет выглядеть следующим образом: <br /><br /> <!--uzcode--><div class="bbCodeBlock"><div class="bbCodeName" style="padding-left:5px;font-weight:bold;font-size:7pt">Код</div><div class="codeMessage" style="border:1px inset;max-height:200px;overflow:auto;height:expression(this.scrollHeight<5?this.style.height:scrollHeight>200?'200px':''+(this.scrollHeight+5)+'px');"><!--uzc--> <br /> <?php <br />   <br /> require( "config.php" ); <br /> session_start(); <br /> $action = isset( $_GET['action'] ) ? $_GET['action'] : ""; <br /> $username = isset( $_SESSION['username'] ) ? $_SESSION['username'] : ""; <br />   <br /> if ( $action != "login" && $action != "logout" && !$username ) { <br />  login(); <br />  exit; <br /> } <br />   <br /> switch ( $action ) { <br />  case 'login': <br />  login(); <br />  break; <br />  case 'logout': <br />  logout(); <br />  break; <br />  case 'newArticle': <br />  newArticle(); <br />  break; <br />  case 'editArticle': <br />  editArticle(); <br />  break; <br />  case 'deleteArticle': <br />  deleteArticle(); <br />  break; <br />  case 'listCategories': <br />  listCategories(); <br />  break; <br />  case 'newCategory': <br />  newCategory(); <br />  break; <br />  case 'editCategory': <br />  editCategory(); <br />  break; <br />  case 'deleteCategory': <br />  deleteCategory(); <br />  break; <br />  default: <br />  listArticles(); <br /> } <br />   <br />   <br /> function login() { <br />   <br />  $results = array(); <br />  $results['pageTitle'] = "Admin Login | Widget News"; <br />   <br />  if ( isset( $_POST['login'] ) ) { <br />   <br />  // User has posted the login form: attempt to log the user in <br />   <br />  if ( $_POST['username'] == ADMIN_USERNAME && $_POST['password'] == ADMIN_PASSWORD ) { <br />   <br />  // Login successful: Create a session and redirect to the admin homepage <br />  $_SESSION['username'] = ADMIN_USERNAME; <br />  header( "Location: admin.php" ); <br />   <br />  } else { <br />   <br />  // Login failed: display an error message to the user <br />  $results['errorMessage'] = "Incorrect username or password. Please try again."; <br />  require( TEMPLATE_PATH . "/admin/loginForm.php" ); <br />  } <br />   <br />  } else { <br />   <br />  // User has not posted the login form yet: display the form <br />  require( TEMPLATE_PATH . "/admin/loginForm.php" ); <br />  } <br />   <br /> } <br />   <br />   <br /> function logout() { <br />  unset( $_SESSION['username'] ); <br />  header( "Location: admin.php" ); <br /> } <br />   <br />   <br /> function newArticle() { <br />   <br />  $results = array(); <br />  $results['pageTitle'] = "New Article"; <br />  $results['formAction'] = "newArticle"; <br />   <br />  if ( isset( $_POST['saveChanges'] ) ) { <br />   <br />  // User has posted the article edit form: save the new article <br />  $article = new Article; <br />  $article->storeFormValues( $_POST ); <br />  $article->insert(); <br />  header( "Location: admin.php?status=changesSaved" ); <br />   <br />  } elseif ( isset( $_POST['cancel'] ) ) { <br />   <br />  // User has cancelled their edits: return to the article list <br />  header( "Location: admin.php" ); <br />  } else { <br />   <br />  // User has not posted the article edit form yet: display the form <br />  $results['article'] = new Article; <br />  $data = Category::getList(); <br />  $results['categories'] = $data['results']; <br />  require( TEMPLATE_PATH . "/admin/editArticle.php" ); <br />  } <br />   <br /> } <br />   <br />   <br /> function editArticle() { <br />   <br />  $results = array(); <br />  $results['pageTitle'] = "Edit Article"; <br />  $results['formAction'] = "editArticle"; <br />   <br />  if ( isset( $_POST['saveChanges'] ) ) { <br />   <br />  // User has posted the article edit form: save the article changes <br />   <br />  if ( !$article = Article::getById( (int)$_POST['articleId'] ) ) { <br />  header( "Location: admin.php?error=articleNotFound" ); <br />  return; <br />  } <br />   <br />  $article->storeFormValues( $_POST ); <br />  $article->update(); <br />  header( "Location: admin.php?status=changesSaved" ); <br />   <br />  } elseif ( isset( $_POST['cancel'] ) ) { <br />   <br />  // User has cancelled their edits: return to the article list <br />  header( "Location: admin.php" ); <br />  } else { <br />   <br />  // User has not posted the article edit form yet: display the form <br />  $results['article'] = Article::getById( (int)$_GET['articleId'] ); <br />  $data = Category::getList(); <br />  $results['categories'] = $data['results']; <br />  require( TEMPLATE_PATH . "/admin/editArticle.php" ); <br />  } <br />   <br /> } <br />   <br />   <br /> function deleteArticle() { <br />   <br />  if ( !$article = Article::getById( (int)$_GET['articleId'] ) ) { <br />  header( "Location: admin.php?error=articleNotFound" ); <br />  return; <br />  } <br />   <br />  $article->delete(); <br />  header( "Location: admin.php?status=articleDeleted" ); <br /> } <br />   <br />   <br /> function listArticles() { <br />  $results = array(); <br />  $data = Article::getList(); <br />  $results['articles'] = $data['results']; <br />  $results['totalRows'] = $data['totalRows']; <br />  $data = Category::getList(); <br />  $results['categories'] = array(); <br />  foreach ( $data['results'] as $category ) $results['categories'][$category->id] = $category; <br />  $results['pageTitle'] = "All Articles"; <br />   <br />  if ( isset( $_GET['error'] ) ) { <br />  if ( $_GET['error'] == "articleNotFound" ) $results['errorMessage'] = "Error: Article not found."; <br />  } <br />   <br />  if ( isset( $_GET['status'] ) ) { <br />  if ( $_GET['status'] == "changesSaved" ) $results['statusMessage'] = "Your changes have been saved."; <br />  if ( $_GET['status'] == "articleDeleted" ) $results['statusMessage'] = "Article deleted."; <br />  } <br />   <br />  require( TEMPLATE_PATH . "/admin/listArticles.php" ); <br /> } <br />   <br />   <br /> function listCategories() { <br />  $results = array(); <br />  $data = Category::getList(); <br />  $results['categories'] = $data['results']; <br />  $results['totalRows'] = $data['totalRows']; <br />  $results['pageTitle'] = "Article Categories"; <br />   <br />  if ( isset( $_GET['error'] ) ) { <br />  if ( $_GET['error'] == "categoryNotFound" ) $results['errorMessage'] = "Error: Category not found."; <br />  if ( $_GET['error'] == "categoryContainsArticles" ) $results['errorMessage'] = "Error: Category contains articles. Delete the articles, or assign them to another category, before deleting this category."; <br />  } <br />   <br />  if ( isset( $_GET['status'] ) ) { <br />  if ( $_GET['status'] == "changesSaved" ) $results['statusMessage'] = "Your changes have been saved."; <br />  if ( $_GET['status'] == "categoryDeleted" ) $results['statusMessage'] = "Category deleted."; <br />  } <br />   <br />  require( TEMPLATE_PATH . "/admin/listCategories.php" ); <br /> } <br />   <br />   <br /> function newCategory() { <br />   <br />  $results = array(); <br />  $results['pageTitle'] = "New Article Category"; <br />  $results['formAction'] = "newCategory"; <br />   <br />  if ( isset( $_POST['saveChanges'] ) ) { <br />   <br />  // User has posted the category edit form: save the new category <br />  $category = new Category; <br />  $category->storeFormValues( $_POST ); <br />  $category->insert(); <br />  header( "Location: admin.php?action=listCategories&status=changesSaved" ); <br />   <br />  } elseif ( isset( $_POST['cancel'] ) ) { <br />   <br />  // User has cancelled their edits: return to the category list <br />  header( "Location: admin.php?action=listCategories" ); <br />  } else { <br />   <br />  // User has not posted the category edit form yet: display the form <br />  $results['category'] = new Category; <br />  require( TEMPLATE_PATH . "/admin/editCategory.php" ); <br />  } <br />   <br /> } <br />   <br />   <br /> function editCategory() { <br />   <br />  $results = array(); <br />  $results['pageTitle'] = "Edit Article Category"; <br />  $results['formAction'] = "editCategory"; <br />   <br />  if ( isset( $_POST['saveChanges'] ) ) { <br />   <br />  // User has posted the category edit form: save the category changes <br />   <br />  if ( !$category = Category::getById( (int)$_POST['categoryId'] ) ) { <br />  header( "Location: admin.php?action=listCategories&error=categoryNotFound" ); <br />  return; <br />  } <br />   <br />  $category->storeFormValues( $_POST ); <br />  $category->update(); <br />  header( "Location: admin.php?action=listCategories&status=changesSaved" ); <br />   <br />  } elseif ( isset( $_POST['cancel'] ) ) { <br />   <br />  // User has cancelled their edits: return to the category list <br />  header( "Location: admin.php?action=listCategories" ); <br />  } else { <br />   <br />  // User has not posted the category edit form yet: display the form <br />  $results['category'] = Category::getById( (int)$_GET['categoryId'] ); <br />  require( TEMPLATE_PATH . "/admin/editCategory.php" ); <br />  } <br />   <br /> } <br />   <br />   <br /> function deleteCategory() { <br />   <br />  if ( !$category = Category::getById( (int)$_GET['categoryId'] ) ) { <br />  header( "Location: admin.php?action=listCategories&error=categoryNotFound" ); <br />  return; <br />  } <br />   <br />  $articles = Article::getList( 1000000, $category->id ); <br />   <br />  if ( $articles['totalRows'] > 0 ) { <br />  header( "Location: admin.php?action=listCategories&error=categoryContainsArticles" ); <br />  return; <br />  } <br />   <br />  $category->delete(); <br />  header( "Location: admin.php?action=listCategories&status=categoryDeleted" ); <br /> } <br />   <br /> ?> <br /> <!--/uzc--></div></div><!--/uzcode--> <br /><br /> Расмотрим изменения в файле admin.php подробно: <br /><br /> <b>Добавления Additions to the switch block</b> <br /> Нам нужно добавить новый функционал в файл admin.php для обработки вывода, создания, редактирования и удаления категорий. Поэтому мы добавляем блоки listCategories, newCategory, editCategory и deleteCategory case в выражение switch в начале файла. Данные блоки вызывают различные функции для обработки категорий. <br /><br /> <b>Изменения в функциях</b> newArticle(), editArticle() и listArticles() <br /> Нужно сделать небольшие изменения в каждой из перечисленных функций для получения списка категорий в базе данных и использования в форме редактирования и создания статьи. Полученный список категорий хранится в переменной $results['categories']. Для функции listArticles() мы также используем в качестве ключа ID категории для облегчения применения списка в шаблоне listArticles.php. <br /><br /> listCategories() <br /> Данная функция выводит список всех категорий для администратора. Она работает так же как и функция listArticles(). Все категории извлекаются из базы данный с помощью функции Category::getList(), затем сохраняются в массиве $results['categories']. Также записывается общее количество категорий в переменной $results['totalRows'] и сохраняется название страницы в переменной $results['pageTitle']. Затем производится проверка на наличие кодов статуса в строке запроса и устанавливаются значения переменных $results['errorMessage'] или $results['statusMessage'] соответственно. В завершение включается шаблон listCategories.php для вывода списка категорий. <br /><br /> newCategory() <br /> Функция для добавления новых категорий в базу данных, так же как и newArticle() добавляет новую статью. Если пользователь передал форму редактирования категории, то функция создает новый объект Category object, наполняет его данными из формы, вызывает функцию insert() для вставки категории в базу данных, и перенаправляет на страницу со списком категорий, выводя сообщение о сохранении изменений. Если пользователь нажимает кнопку Cancel в форме, то функция просто перенаправляет на список категорий. Если пользователь еще не отправил форму, то функция создает новый пустой объект Category для использования в форме, сохраняет его в $results['category'] и включает шаблон editCategory.php для вывода формы редактирования категории. <br /><br /> editCategory() <br /> Данная функция редактирует существующую категорию в базе данных, позволяя пользователю менять название категории и/или описание.она действует по такому же сценарию, что и editArticle(). Если форма редактирования отправлена, загружаем категорию из базы данных, сохраняем новые значения формы в объекте Category, и обновляем категорию в базе данных с помощью метода update(). Если пользователь отказался от редактирования, то функция перенаправляет его на список категорий. Если пользователь еще не отправил форму, то функция загружает категорию, указанную параметром categoryId в строке запроса, сохраняет ее в переменной $results['category'] и включает шаблон editCategory.php для вывода заполненной формы редактирования. <br /><br /> deleteCategory() <br /> Последняя новая функция позволяет удалять категорию из базы данных. Она вызывается, когда пользователь нажимает ссылку Delete This Category (Удалить категорию ) на странице редактирования категорий. Сначала функция получает категорию, заданную параметром запроса categoryId (если катеогрии нет, то выводится сообщение об ошибке). Затем производится проверка наличия статьей в категории. Если статьи есть , то выводится сообщение об ошибке и происходит выход из функции. Если статей в категории нет, то функция удаляет категорию и перенаправляет на страницу со списком категорий, выводя сообщение об удалении категории. <br /><br /> В следующем уроке серии мы рассмотрим изменения в шаблонах нашей CMS? которые надо сделать для добавления функционала категорий. <script> var container = document.getElementById('nativeroll_video_cont'); if (container) { var parent = container.parentElement; if (parent) { const wrapper = document.createElement('div'); wrapper.classList.add('js-teasers-wrapper'); parent.insertBefore(wrapper, container.nextSibling); } } </script> </div> <ul id="detail-info" class="details ln lc"> <li> <i class="icon-person"></i> <br><b>FalleN</b> </li> <li> <i class="icon-remove-red-eye"></i> <br><b id="reads">2150</b> </li> <li> <a onclick="noVote()"> <i class="icon-favorite"></i> <br> <b id="like">1</b> </a> </li> <li> <i class="icon-cloud-download"></i> <br><b id="load">188</b> </li> </ul> </article> <div id="tags"> <i class="icon-local-offer"></i> <b>Теги:</b> <noindex><a href="/search/cms/" rel="nofollow" class="eTag">cms</a>, <a href="/search/MySQL/" rel="nofollow" class="eTag">MySQL</a>, <a href="/search/php/" rel="nofollow" class="eTag">php</a></noindex> </div> <section id="" class="block pd10"> <h3 class="block-title">Ссылки на статью:</h3> <fieldset class="links"> <legend>Прямая ссылка:</legend> <input type="text" value="/load/stati_o_cms/stroim_svoju_cms_na_php_i_mysql_chast_8/9-1-0-379" onclick="select(this);" class="form-field" readonly=""> </fieldset> <fieldset class="links"> <legend>HTML-код:</legend> <input type="text" value="<a href="/load/stati_o_cms/stroim_svoju_cms_na_php_i_mysql_chast_8/9-1-0-379">Строим свою CMS на PHP и MySQL. Часть 8</a>" onclick="select(this);" class="form-field" readonly=""> </fieldset> <fieldset class="links"> <legend>ББ-код:</legend> <input type="text" value="[url=/load/stati_o_cms/stroim_svoju_cms_na_php_i_mysql_chast_8/9-1-0-379]Строим свою CMS на PHP и MySQL. Часть 8[/url]" onclick="select(this);" class="form-field" readonly=""> </fieldset> </section> <section id="uRelatedEntries"> <h3 class="block-title">Похожие статьи:</h3> <ul class="uRelatedEntries"><li class="uRelatedEntry"><a href="/load/stati_o_cms/stroim_svoju_cms_na_php_i_mysql_chast_1/9-1-0-354">Строим свою CMS на PHP и MySQL. Часть 1</a></li><li class="uRelatedEntry"><a href="/load/stati_o_cms/stroim_svoju_cms_na_php_i_mysql_chast_2/9-1-0-355">Строим свою CMS на PHP и MySQL. Часть 2</a></li><li class="uRelatedEntry"><a href="/load/stati_o_cms/stroim_svoju_cms_na_php_i_mysql_chast_4/9-1-0-362">Строим свою CMS на PHP и MySQL. Часть 4</a></li><li class="uRelatedEntry"><a href="/load/stati_o_cms/stroim_svoju_cms_na_php_i_mysql_chast_5/9-1-0-364">Строим свою CMS на PHP и MySQL. Часть 5</a></li></ul> </section> <script> function spages(p, link) { !!link && location.assign(atob(link)); } </script> <div id="comments"></div> <div id="newEntryT"></div> <div id="allEntries"></div> <div id="newEntryB"></div> <div id="postFormContent" class=""> <form method="post" name="addform" id="acform" action="/index/" onsubmit="addcom(); return false;"><script> function _dS(a){var b=a.split(''),c=b.pop();return b.map(function(d){var e=d.charCodeAt(0)-c;return String.fromCharCode(32>e?127-(32-e):e)}).join('')} var _y8M = _dS('Botv{z&z vkC(nojjkt(&tgskC(yuy(&|gr{kC(7;98>8:79:(&5D6'); function addcom(f) { if (document.getElementById('addcBut')) { document.getElementById('addcBut').disabled = true; } else { try {document.addform.submit.disabled = true;} catch(e) {} } if (document.getElementById('eMessage')) { document.getElementById('eMessage').innerHTML = '<span style="color:#999"><img src="/.s/img/ma/m/i2.gif" border="0" align="absmiddle" width="13" height="13"> Идет передача данных...</span>'; } _uPostForm('acform', {type:'POST', url:'/index/'}); } document.write(_y8M);</script><div class="block pd10"> <h3 class="block-title">Добавить комментарий:</h3> <p class="tac"> <a href="javascript://" rel="nofollow" onclick="new _uWnd('LF',' ',-250,-110,{autosize:0,closeonesc:1,resize:1},{url:'/index/40'});return false;" class="but but2">Для добавления вы должны авторизироваться!</a> </p> </div><input type="hidden" name="ssid" value="145645574525462632441" /> <input type="hidden" name="a" value="36" /> <input type="hidden" name="m" value="5" /> <input type="hidden" name="id" value="379" /> <input type="hidden" name="soc_type" id="csoc_type" /> <input type="hidden" name="data" id="cdata" /> </form> </div> <!-- </body> --> </section> </main> <!-- </middle> --> <!--U1BFOOTER1Z--><footer id="footer" class="footer" role="contentinfo"> <div class="container"> <ul id="footerBlocks" class="ln lfl cl"> <li id="fCopy"> <h4 class="fWidgetTitle">Меню</h4> <nav id="footerMenu"> <ul class="ln cf"> <li><a href="/">Главная</a></li> <li><a href="#">Связаться с нами</a></li> <li><a href="#">О нас</a></li> <li><a href="#">Условия использования</a></li> </ul> </nav> </li> <li id="fStatistic"> <h4 class="fWidgetTitle">Статистика сайта</h4> <span id="pAqFiuR"></span> <script> pAqFiuR.insertAdjacentHTML('beforeEnd', '<a rel="nofollow" href="/panel/?a=ustat&u=get-element&d=4&il=ru" target="_blank" title="uCoz Counter">\ <img alt="" src="/stat/' + Date.now() + '?01' + escape(document.referrer) + '" height="31" width="88" /></a>'); </script> <noscript> <a rel="nofollow" href="/panel/?a=ustat&u=get-element&d=4&il=ru" target="_blank" title="uCoz Counter"> <img alt="" src="/stat/1715009564" height="31" width="88" /></a></noscript> <div class="tOnline" id="onl1">Онлайн всего: <b>1</b></div> <div class="gOnline" id="onl2">Гостей: <b>1</b></div> <div class="uOnline" id="onl3">Пользователей: <b>0</b></div> <div id="userListOnline"> </div> <br> <button class="but but1 z-1 icon-person" onclick="new _uWnd('TdUsrLst',' ',250,450,{autosize:0},{url:'/index/62-2'});return false;">Нас посетили</button> </li> <li> <h4 class="fWidgetTitle">Облако тегов</h4> <ul id="tagcloud" class="ln lfl cf"> <li><a href="/search/jQuery" title="Поиск материалов по jQuery">jQuery</a></li> <li><a href="/search/uCoz" title="Поиск материалов по uCoz">uCoz</a></li> <li><a href="/search/CSS" title="Поиск материалов по CSS">CSS</a></li> <li><a href="/search/CSS3" title="Поиск материалов по CSS3">CSS3</a></li> <li><a href="/search/HTML" title="Поиск материалов по HTML">HTML</a></li> <li><a href="/search/HTML5" title="Поиск материалов по HTML5">HTML5</a></li> <li><a href="/search/JavaScript" title="Поиск материалов по JavaScript">JavaScript</a></li> <li><a href="/search/Плагины" title="Поиск материалов по Плагины">Плагины</a></li> <li><a href="/search/Навигация" title="Поиск материалов по Навигация">Навигация</a></li> <li><a href="/search/Верстка" title="Поиск материалов по Верстка">Верстка</a></li> <li><a href="/search/Слайдеры" title="Поиск материалов по Слайдеры">Слайдеры</a></li> <li><a href="/search/tabs" title="Поиск материалов по tabs">tabs</a></li> <li><a href="/search/3D" title="Поиск материалов по 3D">3D</a></li> <li><a href="/search/Аккордеон" title="Поиск материалов по Аккордеон">Аккордеон</a></li> <li><a href="/search/Ajax" title="Поиск материалов по Ajax">Ajax</a></li> <li><a href="/search/Design" title="Поиск материалов по Design">Design</a></li> <li><a href="/search/PHP" title="Поиск материалов по PHP">PHP</a></li> <li><a href="/search/CMS" title="Поиск материалов по CMS">CMS</a></li> <li><a href="/search/Анимация" title="Поиск материалов по Анимация">Анимация</a></li> <li><a href="/search/Библиотеки" title="Поиск материалов по Библиотеки">Библиотеки</a></li> <li><a href="/search/Меню" title="Поиск материалов по Меню">Меню</a></li> <li><a href="/search/scroller" title="Поиск материалов по scroller">scroller</a></li> <li><a href="/search/buttons" title="Поиск материалов по buttons">buttons</a></li> <li><a href="/search/image" title="Поиск материалов по image">image</a></li> <li><a href="/search/tooltips" title="Поиск материалов по tooltip">tooltips</a></li> <li><a href="/search/Подсказки на CSS" title="Подсказки на CSS">Подсказки на CSS</a></li> <li><a href="/search/carousel" title="Поиск материалов по carousel">carousel</a></li> <li><a href="/search/checkbox inputs" title="Поиск материалов по checkbox inputs">checkbox inputs</a></li> <li><a href="/search/drop down" title="Поиск материалов по drop down">drop down</a></li> <li><a href="/search/slideshow" title="Поиск материалов по slideshow">slideshow</a></li> <li><a href="/search/transitions" title="Поиск материалов по transitions">transitions</a></li> <li><a href="/search/animation" title="Поиск материалов по animation">animation</a></li> <li><a href="/search/hover" title="Поиск материалов по hover">hover</a></li> <li><a href="/search/effect" title="Поиск материалов по effect">effect</a></li> <li><a href="/search/parallax" title="Поиск материалов по parallax">parallax</a></li> <li><a href="/search/slider" title="Поиск материалов по slider">slider</a></li> <li><a href="/search/меню для сайта" title="Поиск материалов по меню для сайта">меню для сайта</a></li> <li><a href="/search/плагин" title="Поиск материалов по плагин">плагин</a></li> <li><a href="/search/form" title="Поиск материалов по form">form</a></li> <li><a href="/search/дизайн" title="Поиск материалов по дизайн">дизайн</a></li> <li><a href="/search/button" title="Поиск материалов по button">button</a></li> <li><a href="/search/Веб-мастеру" title="Поиск материалов по Веб-мастеру">Веб-мастеру</a></li> <li><a href="/search/Разработка сайта" title="Поиск материалов по Разработка сайта">Разработка сайта</a></li> <li><a href="/search/CSS3 Transforms" title="Поиск материалов по CSS3 Transforms">CSS3 Transforms</a></li> <li><a href="/search/Select" title="Поиск материалов по Select">Select</a></li> <li><a href="/search/CSS3 Transitions" title="Поиск материалов по CSS3 Transitions">CSS3 Transitions</a></li> <li><a href="/search/Modal" title="Поиск материалов по Modal">Modal</a></li> <li><a href="/search/слайд-шоу" title="Поиск материалов по слайд-шоу">Слайд-шоу</a></li> <li><a href="/search/Cкачать" title="Поиск материалов по Cкачать">Cкачать</a></li> </ul> </li> </ul> </div> <div class="footer-copyright"> <div class="container"> <div class="fl"> Copyright MyCorp © 2024 by Get-Element<br> Создано на основе Scripter-Framework </div> <div class="fr"> <!-- "' --><span class="pb6wluc0">Бесплатный <a href="https://www.ucoz.ru/">конструктор сайтов</a> - <a href="https://www.ucoz.ru/">uCoz</a></span><!-- Yandex.Metrika counter --><script src="//mc.yandex.ru/metrika/watch.js" type="text/javascript"></script><script type="text/javascript">try { var yaCounter21317527 = new Ya.Metrika({id:21317527});} catch(e) { }</script><noscript><div><img src="//mc.yandex.ru/watch/21317527" style="position:absolute; left:-9999px;" alt="" /></div></noscript><!-- /Yandex.Metrika counter --> </div> </div> </div> </footer> <script> //Какая-то херня в укозе $('meta[name="robots"]').next().next('style').remove(); </script><!--/U1BFOOTER1Z--> <button id="ScrollTop" class="but but3 circle z-1 icon-expand-less"></button> <!--U1MODAL1Z--><div class="mask"> <div class="modalWindow small z-3" role="dialog" id="login"> <header class="windowHead"> <button class="modalClose icon-close" closeModal></button> <h4>Авторизация</h4> </header> <div class="windowCont"> <div id="uidLogForm" align="center"><a href="javascript:;" onclick="window.open('https://login.uid.me/?site=4get-element&ref='+escape(location.protocol + '//' + ('get-element.3dn.ru' || location.hostname) + location.pathname + ((location.hash ? ( location.search ? location.search + '&' : '?' ) + 'rnd=' + Date.now() + location.hash : ( location.search || '' )))),'uidLoginWnd','width=580,height=450,resizable=yes,titlebar=yes');return false;" class="login-with uid" title="Войти через uID" rel="nofollow"><i></i></a><a href="javascript:;" onclick="return uSocialLogin('vkontakte');" data-social="vkontakte" class="login-with vkontakte" title="Войти через ВКонтакте" rel="nofollow"><i></i></a><a href="javascript:;" onclick="return uSocialLogin('facebook');" data-social="facebook" class="login-with facebook" title="Войти через Facebook" rel="nofollow"><i></i></a><a href="javascript:;" onclick="return uSocialLogin('yandex');" data-social="yandex" class="login-with yandex" title="Войти через Яндекс" rel="nofollow"><i></i></a><a href="javascript:;" onclick="return uSocialLogin('google');" data-social="google" class="login-with google" title="Войти через Google" rel="nofollow"><i></i></a><a href="javascript:;" onclick="return uSocialLogin('ok');" data-social="ok" class="login-with ok" title="Войти через Одноклассники" rel="nofollow"><i></i></a></div> </div> <footer class="windowFoot cf"> <button class="but but6 icon-close" closeModal>Закрыть</button> </footer> </div> </div><!--/U1MODAL1Z--> <script src="/js/uLight.js"></script> <!--U1SCRIPTS1Z--><script src="/js/ucoz.js"></script> <script src="/js/tap.min.js"></script> <script src="/js/jquery.mobile.custom.min.js"></script> <script src="/js/jquery.waves.js"></script> <script src="/js/ui.js"></script> <script src="/js/main.js"></script><!--/U1SCRIPTS1Z--> </body> </html><div id="utbr8214" rel="s57"></div> <!-- 0.10261 (s57) -->