AGAVA partners programs http://agava.ru/partners/            

Название функции

             
Веб-курсы


Что это?

Оглавление

Основы
Основы основ

Практика
Гостевая книга
Простой сайт
Структура сайта (MVC)
Ядро (Light)
Ядро
Гостевая на SQL
Статические страницы
Модуль новостей
Система регистрации

Теория
Дебаггинг
Регулярные выражения
Введение в ООП
Паттерны проектирования

Репозитарий
BB-code
Почтовый класс
Пагинатор
Всякие полезности

Download
Полезные утилиты

Разное
Видеокурсы
Последние изменения
Вопросы и замечания сюда



Реклама

Диеты для похудения
Фреймворк Kohana. Обучение. Мануал на русском.







Шаг 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, получаются намного 
более сложными сами по себе, чем проблемы, для решения которых они создавались.
Я с ним полностью солидарен.

Но вольному воля - каждый сходит с ума по своему, каждому своё. В любом случае, если есть желание стать настоящим программистом, изучать ООП придется.

И мы тоже будем это делать. Но чуть позже. Сейчас есть более важные дела. Ведь мы только начали, еще очень много нового и интересного.
Рейтинг@Mail.ru Рейтинг@Mail.ru Яндекс цитирования
irbis-team © 2009