Шаг 6
Админ-панель. Итоги.
Заготовка для админ-панели у нас уже есть, там реализована система защиты, готов модуль и шаблон. Остается только прописать необходимый функционал.
Начнем с шаблонов.
skins/tpl/admin/guest/show.tpl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<!-- ./skins/tpl/admin/guest/show.tpl begin -->
<h2>Гостевая книга</h2> <div style="text-align:center; background-color:#D5FFF0" > <form action="" method="post"> <?php echo $page_menu; ?> <?php echo $rows; ?> <?php echo $page_menu; ?> <input name="ok" type="submit" value="Удалить" onclick="return confirm('Подумай!')"/> </form> </div>
<!-- ./skins/tpl/admin/guest/show.tpl end -->
|
skins/tpl/admin/guest/rows.tpl
1
2
3
4
5
6
7
8
9
10
11
12
|
<!-- ./skins/tpl/admin/guest/rows.tpl begin -->
<div style="border:1px solid; text-align:left; width:70%; background-color:#66FFFF; min-height:100px; margin:5px; margin-left:10%; padding:5px"> <input name="form[array1][]" type="checkbox" value="<?php echo $tpl_id; ?>" /> <?php echo $tpl_date; ?> / <strong><?php echo $tpl_name; ?></strong> <br/> <?php echo $tpl_text; ?> </div>
<!-- ./skins/tpl/admin/guest/rows.tpl end -->
|
Ну и изменим ссылку в меню админки
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<!-- ./skins/tpl/admin_menu.tpl begin --> <h2>Админ-панель</h2> <div id="menu"> <ul> <li><a href="<?php echo href('page=meta', 'rem=main'); ?>">Метаданные</a></li> <li><a href="<?php echo href('page=main'); ?>">Главная страница</a></li> <li><a href="<?php echo href('page=guest'); ?>">Гостевая книга</a></li> <li><a href="<?php echo href('page=exit'); ?>">Выход</a></li> </ul> </div> <!-- ./skins/tpl/admin_menu.tpl end -->
|
А так же переключатель в индексе админки:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
<?php
/** * The switch of modules * Переключатель страниц */ switch($GET['page']) { case 'main': include IRB_ROOT .'admin/main/router.php'; break;
case 'guest': include IRB_ROOT .'admin/guest/router.php'; break;
case 'meta': include IRB_ROOT .'admin/meta/router.php'; break;
case 'exit': include IRB_ROOT .'admin/sequrity/exit.php'; break; default: include IRB_ROOT .'admin/main/router.php'; break; }
|
Теперь контроллер
admin/guest/read_controller.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
<?php
/** * The administration panel. Controller * Панель администрирования. Контроллер * @author IT studio IRBIS-team * @copyright © 2009 IRBIS-team */ /////////////////////////////////////////////////////////
/** * Generation of page of an error at access out of system * Генерация страницы ошибки при доступе вне системы */ if(!defined('IRB_KEY')) { header("HTTP/1.1 404 Not Found"); exit(file_get_contents('../../404.html')); } //////////////////////////////////////////////////////////
/** * We connect a file of the MySQL functions * Подключаем файл функций MySQL */ include IRB_ROOT .'libs/mysql.php'; /** * The data deleting block * Блок удаления информации */ if($ok) { mysqlQuery("DELETE FROM `". IRB_DBPREFIX ."guest` WHERE `id` IN (". implode(', ', array_map('intval', $POST['array1'])) .")" ); reDirect(); }
/** * The block of reading of the information * Блок чтения информации */ include IRB_ROOT .'libs/irb_paginator.php'; $paginator = new IRB_Paginator($GET['num'], IRB_NUM_POSTS); $res = $paginator -> countQuery("SELECT * FROM `". IRB_DBPREFIX ."guest` ORDER BY `id` ASC"); $page_menu = $paginator -> createMenu(); $rows = '';
if(mysql_num_rows($res) > 0) {
$cont = getTpl('admin/guest/rows'); /**
* We connect a BB-decoder
* Подключаем BB-декодер
*/
include IRB_ROOT .'bbcode/irb_bbdecoder.php';
while($row = htmlChars(mysql_fetch_assoc($res)))
{
$row['date'] = formatDate($row['date'], false);
$row['text'] = createBBtags($row['text']);
$rows .= parseTpl($cont, $row);
} }
|
Как видите, блок чтения практически не изменился. Изменились только пути.
Добавился блок удаления информации. Оператор SQL
DELETE удаляет строку в таблице, которая удовлетворяет условию в операторе
WHERE.
А там у нас еще один -
IN. Это список. То есть запрос на удаление нескольких постов сразу будет выглядеть так:
DELETE FROM `irbis_guest` WHERE `id` IN (6, 8, 10) |
И все строки, идентификаторы которых попали под раздачу, будут удалены.
А чтобы такой список создать, нужно данные отправить на сервер массивом. И принять как массив, у нас же там хитрая инициализация. Ну и обозначим это как нужно. Если успели заметить, имена у чекбоксов не как раньше,
form[value1]
а несколько иначе -
form[array1][]
Вот и в инициализацию поставим так же. Это будет семантически правильно и застрахует от ошибок.
Добавим в
variables.php пару-тройку массивов на будущее:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<?php
/** * Initialization of variables POST * Инициализация переменных POST */ $POST = array(
'value1' => '', 'value2' => '', 'value3' => '', 'value4' => '', 'array1' => array(), 'array2' => array(), 'array3' => array(), );
|
Ну и осталось подключить шаблон во вьюшке:
admin/guest/view.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 |
<?php
/** * View * Вид * @author IT studio IRBIS-team * @copyright © 2009 IRBIS-team */ /////////////////////////////////////////////////////////
/** * Generation of page of an error at access out of system * Генерация страницы ошибки при доступе вне системы */ if(!defined('IRB_KEY')) { header("HTTP/1.1 404 Not Found"); exit(file_get_contents('../../404.html')); } /////////////////////////////////////////////////////////// $POST = htmlChars($POST); /** * Includes the template * Подключаем шаблон */ include IRB_ROOT .'skins/tpl/admin/'. $modul .'/show.tpl';
|
Вот и всё. Админку можно увидеть по адресу
HTTP://Ваш_хост/admin
Подведем итог.
Конечно, одну гостевую книгу делать на такой большой структуре нерентабельно. Но мы не эту ставили цель. Цель была - показать, как работать с нашим ядром.Конечно, можно было не делать роутер и вьюшку, да и папку для модуля можно не делать. Это рентабельнее и проще. Когда будите делать боевые скрипты - учтите это. Пока для иллюстрации сойдет и так.
Примерно на таком принципе работают многие популярные фреймворки. Надеюсь теперь будет легче разобраться, как с ними воевать и с чем их есть.
Принято считать, что паттерн MVC нужно реализовывать исключительно посредством классов.
Вообще я могу с кем угодно поспорить на тему обоснованности ООП парадигмы для такого рода приложений. Как в плане ресурсоемкости, скорости, управляемости, поддержки и самое гланое прозрачности кода. Вот слова одного из разработчиков PHP Стерлинга Хьюза:
...Я предпочитаю использовать процедурную логику, кроме случаев инкапсуляции сущностей. Другими словами, когда я хочу описать объект, я использую именно объект. Я против того, чтобы использовать ООП для создания огромных,
абсолютно абстрактных моделей, вкладывая всю логику в сам объект. Такие модели, особенно применительно к Web, получаются намного
более сложными сами по себе, чем проблемы, для решения которых они создавались. |
Я с ним полностью солидарен.
Но вольному воля - каждый сходит с ума по своему, каждому своё. В любом случае, если есть желание стать настоящим программистом, изучать ООП придется.
И мы тоже будем это делать. Но чуть позже. Сейчас есть более важные дела.
Ведь мы только начали, еще очень много нового и интересного.