Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
Прежде всего заготовим шаблон. Для этого откроем окно с HTML-кодом данной страницы и заменим номер урока на переменную $row[id], вместо названия "Шаблоны" вставим $row[title], весь текст от первого слова "Разделение" до последнего "встречи!" заменим на $row[body]. Вместо элементов навигации "Назад, на урок 16" и в месте, где должно было бы располагаться "Дальше, на урок 18", соответственно ставим $prev и $next. Сохраним его как page. tpl. Готовый шаблон можно скачать здесь.
Теперь работаем с PHP. Пишем:
require "class. Template. php"; // относительный путь до класса mysql_connect("host", "artem", "12345"); if ($id > 1) $prev = "<a href='?".($id - 1)."'>Назад, на урок ".($id - 1)."</a>"; $query = "SELECT COUNT(*) FROM lessons"; if ($id < $max) $next = "<a href='?".($id + 1)."'>Дальше, на урок ".($id + 1)."</a>"; |
Это простой пример страницы, имеющей несложную структуру. Но даже на таком примере видно, как шаблоны упрощают создание веб-приложений.
В заключение.
Конечно, здесь мы разобрали лишь крохотную часть этой обширной темы работы с шаблонами и рассмотрели лишь малую долю инструментов работы с шаблонами. Но хотелось бы сказать, что не так уж важно, каким образом вы работаете с шаблонами и какие средства вы используете, намного важнее то, как вы с ними работаете. Научиться грамотной работе с шаблонами не так-то просто, понимание этого приходит только с практикой, и тут я не могу дать определенных советов.
На этом все. До следующей встречи!
Урок 18. Деревья.
С человеком происходит то же, что и с деревом.
Чем больше стремится он вверх, к свету, тем глубже
уходят корни его в землю, вниз, в мрак и глубину - ко злу.
Фридрих Ницше
Сегодняшний урок будет посвящен построению так называемых деревьев данных. Этот элемент часто используется в вебпрограммировании и просто необходим для таких приложений, как каталоги сайтов, многоуровневых форумов и других скриптов, в которых данные хранятся таким образом, что каждый элемент вложен в другой.
Все, кто имел дело с компьютером, имеют представление о деревьях. Например, это файловая система операционной системы.
Графически дерево можно представить следующим образом:
элемент 1
|
+ - элемент 2
| |
| + - элемент 3
| + - элемент 4
|
+ - элемент 5
Уровень вложенности и длина дерева не ограничены.
Создание деревьев.
Существует несколько алгоритмов построения деревьев. Начнем с наиболее распространенного метода, который эффективен при создании деревьев с небольшой глубиной вложенности.
Метод заключается в том, что в каждом дочернем элементе сохраняются данные о его непосредственном родителе, то есть, рассматривая схему выше, элементы 2 и 5 содержат ссылку на элемент 1, а 3 и 4 - на элемент 2.
Запрос на создание таблицы, в которой будут храниться данные по вышеуказанному алгоритму, может выглядеть следующим образом:
CREATE TABLE catalogs ( cat_id int(11) NOT NULL auto_increment, parent_id int(11) NOT NULL default '0', cat_name varchar(200) NOT NULL default '', PRIMARY KEY (cat_id) ) |
Вставим в полученную таблицу несколько записей:
// функция для вставки записей в MySQL |
Теперь выведем полученное дерево:
function get_tree($parent_id = 0, $prefix = "") { |
Так как мы имеем многоуровневое дерево, функцию get_tree() нам приходся вызывать рекурсивно, для одноуровневых деревьев (не больше одного уровня вложенности) этого не требуется.
Как видите, алгоритм построения такого рода деревьев очень прост.
К достоинствам данного метода построения деревьев можно отнести то, что каждый элемент дерева обладает достаточной степенью обособленности, так как с родителем его связывает значение только одного поля, которое мы без проблем можем изменить и элементарно поменять тем самым родителя. К недостаткам же - крайне неудобную работу при высоких уровнях вложенности. Так что этот алгоритм оптимально подходит для одноуровневых деревьев и деревьев с невысоким уровем вложенностиуровня).
Алгоритм Nested Sets.
Алгоритм Nested Sets - более мощный инструмент работы с деревьями. Класс для работы с ним вы можете скачать здесь. Архив состоит из двух файлов: dbtree. php - собственно, класс для работы с деревьями, и database. php - класс для работы с базой данных. Во второй файл вы можете добавить свои функции работы с MySQL и всячески подстраивать для себя, только не изменяйте функции, используемые классом в файле dbtree. php.
Алгоритм Nested Sets с первого взгляда может показаться сложным, но на самом деле он предельно прост. Суть его заключается в том, что он не сохраняет id родительского элемента, а использует три дополнительных поля: cat_left, cat_right и cat_level (имена полей вы можете изменить). Использует он их следующим образом.
Представьте, что по нашему дереву данных шагает человечек с флажками в руках, причем надписями на них служат подряд идущие цифры. Проходя элемент дерева, человечек ставит на него флажок с номером, начиная с первого, доходит до самой глубины ветки и возвращается обратно, чтобы перейти к другой ветке, но при этом продолжает ставить флажки на уже пройденных элементах.
Посмотрим, как поставит флажки наш человечек в схеме дерева из начала урока (синим отмечены флажки, поставленные при первом проходе элемента, зеленым - при возвращении из ветки).
элемент 1 [1] [10]
|
+ - элемент 2 [2] [7]
| |
| + - элемент 3 [3] [4]
| + - элемент 4 [5] [6]
|
+ - элемент 5 [8] [9]
Значения синих флажков в таблице MySQL запоминаются в поле cat_left, а зеленых - в поле cat_right, уровень вложенности - в поле cat_level.
Создадим таблицу с деревом, подобному указанному выше.
include("dbtree. php"); include("database. php"); $db = new CDatabase("your_database_name", "localhost", "root", "12345"); $tree = new CDBTree ($db, "catalogs2", "cat_id"); // создаем таблицу $query="CREATE TABLE catalogs2( cat_id int not null auto_increment primary key, cat_left int not null, cat_right int not null, cat_level int not null, cat_name varchar(200) not null)"; $db->query($query); // заполняем таблицу // создаем корневой элемент $level[0][0]=$tree->clear(); // записываем основную часть дерева $level[1][0] = $tree->insert($level[0][0], array("cat_name"=>"Программирование")); $level[1][1] = $tree->insert($level[0][0], array("cat_name"=>"Базы данных")); $level[2][0] = $tree->insert($level[1][0], array("cat_name"=>"Веб программирование")); $level[2][1] = $tree->insert($level[1][0], array("cat_name"=>"Системное программирование")); $level[2][3] = $tree->insert($level[1][1], array("cat_name"=>"Oracle")); $level[2][4] = $tree->insert($level[1][1], array("cat_name"=>"MS Access")); $level[3][0] = $tree->insert($level[2][0], array("cat_name"=>"PHP")); $level[3][1] = $tree->insert($level[2][0], array("cat_name"=>"Perl")); $level[3][2] = $tree->insert($level[2][1], array("cat_name"=>"C++")); $level[3][3] = $tree->insert($level[2][1], array("cat_name"=>"Delphi")); $level[4][0] = $tree->insert($level[3][2], array("cat_name"=>"Visual C++")); // Выводим дерево $query = "SELECT * FROM catalogs2 ORDER BY cat_left"; $result = $db->query($query); while ($row = $db->fetch_array($result)){ echo str_repeat(" ", $row['cat_level']).$row['cat_name']. " <font color='#009900'>[".$row['cat_right']."]</font><br>"; } |
Использование полей cat_left и cat_right позволяет манипулировать деревом практически во всех направлениях. Например, заметьте, что у элементов, не имеющих потомков, значения этих полей отличаются на единицу. А у потомков какого-либо данного элемента значения cat_left больше значения у выбранного родителя, а cat_right - меньше, причем, чем больше ветвь потомков, тем больше разность между значениями cat_right и cat_left у данного родителя (сравните "Веб программирование" и "Базы данных"). Основываясь на этих данных, сделаем выборку всех элементов, не имеющих родителей, а также всех потомков элемента "Системное программирование":
$query = "SELECT cat_left, cat_right FROM catalogs2 ". "WHERE cat_name = 'Системное программирование'"; "' AND cat_right < '".$val['cat_right']."' ORDER BY cat_left"; $row['cat_name']."<br>";
|
Возможности этого класса вышеуказанным не ограничиваются. Можно логически домыслить, как найти всех родителей данного элемента, заканчивая корневым (что удобно при создании навигации по разделам), а также множество других возможностей. Настоятельно рекомендую перед использованием данного класса просмотреть в файле dbtree. php все комментарии перед методами класса, так как вышеприведенными методами этот класс не ограничивается.
На этом и заканчиваем наш урок. До встречи на следующем!
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 |


