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

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

             
Веб-курсы


Что это?

Оглавление

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

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

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

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

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

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



Реклама

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







Шаг 2

Инициализация GET переменных

Итак, начало у нас положено.
Продолжим-с.

Теперь у нас стоит задача выставить текущие и глобальные настройки сайта.
Основные и незыблемые две - кодировку и уровень ошибок, они прописаны первыми строчками индекса.
1
2
3
4
5
6
7
8
9
10
<?php

/** 
* We establish the charset and level of errors 
* Устанавливаем кодировку и уровень ошибок 
*/ 
    
header("Content-Type: text/html; charset=utf-8"); 
    
error_reporting(E_ALL);

Но понадобятся еще и текущие настройки. Их будет много, и чтобы не носиться по всему сайту в поисках вчерашнего дня, все настройки принято держать в одном месте, а именно в конфигурационном файле. Вот и мы не лыком шиты, у нас есть такой в корне - config.php

А теперь нам нужно сделать так, чтобы хитрый злой тать и разбойник не только не проник в конфигу, но и даже не узнал, что таковая имеется. Кстати, это касается и всех остальных файлов. Чем меньше информации у хакера, тем сложнее его никчемная, жалкая судьбинушка.

Сделать это совсем не сложно. В файл index.php первой строчкой пишем это:
1
2
3
4
5
6
7
8
9
10
<?php


/** 
* Installation of a key of access to files 
* Установка ключа доступа к файлам 
*/ 
    
define('IRB_KEY'true);
а в config.php это:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php


/** 
* 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')); 
    }
Теперь если набрать в адресной строке конфигу, сервер ответит 404-й ошибкой. А знать такого файла нет. А на нет - хака нет.
Как это работает. Функция defined() проверяет, установлена ли константа. А так, как она установлена в другом файле (index.php), то отдельно от него она вернет false. А раз у нас там инверсия (восклицательный знак), то блок начнет отрабатывать.
Сначала функция header()отправит стандартный заголовок, мол ошибка 404 - нет файла. А потом конструкция exit() остановит скрипт. А в аргумент её мы передадим содержимое нашей 404 страницы, считав предварительно функцией file_get_contents() что и увидит в конце итога юзер.

Разумеется, при особом желании можно определить наличие файла по заголовкам, но не все на это способны и еще: чем больше всяких преград, тем нерентабельнее становится взлом.

Этими строчками должен начинаться каждый файл PHP (кроме индекса) в системе. Только нужно не запутаться с путями, что бы на выдаче всегда была 404.

Вообще, конечно, проще защитить файлы на уровне сервера, положив в директории со скриптами соответствующий .htaccess, но мы пойдем другим путем, потому что скрипт должен как можно меньше зависеть от настроек сервера, да и не всегда это удобно. Допустим, тот же аякс не станет так работать.

Еще в config.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
<?php


/** 
* Includes mod rewrite 
* Включает модуль перенаправления  
*/ 
    
define('IRB_REWRITE''on');     

     
/** 
* Establishes a physical path to a root directory of a script 
* Устанавливает физический путь до корневой директории скрипта 
*/  
    
define('IRB_ROOT'str_replace('\\''/'$_SERVER['DOCUMENT_ROOT']) .'/'); 

/** 
* Establishes a path to a script root for HTTP 
* Устанавливает путь до корневой директории скрипта 
* по протоколу HTTP  
*/  
    
define('IRB_HOST''http://'$_SERVER['HTTP_HOST'] .'/');


Первая будет отвечать за опцию ЧПУ, вторая для указания полных физических путей, а третья нужна для ссылок.

А ссылки - это важно. Потому что на гет-параметрах этих ссылок и будет строиться вся навигация и переключение модулей, так как все внутренние ссылки будут вести только на один файл (точку входа) - index.php

Это значит, что нам нужно бережно принять эти параметры и обработать их.

У нас уже был такой прецидент, мы инициализировали переменную $page в файле variables.php как раз для переключения модулей. Но это было бы слишком просто для таких заправских веб-мастеров. Поэтому не станем искать легких путей, и сделаем очень интересную вещь. Для начала откройте файл variables.php и твердой рукой удалите все содержимое. Начинаем новую жизнь.

На первый взгляд все, что мы сейчас будем делать, может показаться сложным и излишним. Но это потом очень облегчит жизнь и сделает кодинг приятным занятием.

Теперь мы будем использовать не просто переменную, а целый массив. Для чего, поймете дальше. А пока файл variables.php будет смотреться так:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php


/**  
* 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'));  
    }  
/////////////////////////////////////////////////////////// 
/**  
* Array of variables for GET-parametres  
* Массив переменных для GET-параметров  
*/      
    
$GET['page'] = !empty($_GET['route']) ? $_GET['route'] : 'main';

Вот она, долгожданная переменная $_GET['route'], о которой мы говорили, рассматривая mod_rewrite Теперь изменим вид ссылок в меню:
1
2
3
4
5
6
7
8
9
10
<!-- skins/tpl/menu.tpl begin -->  
Сегодня <?php echo $date ?> года  
<ul>  
<li><a href="/main">Главная страница</a></li>  
<li><a href="/second">Вторая страница</a></li>  
</ul>  

<!-- skins/tpl/menu.tpl end -->

а заодно посмотрим, что творится в массивах. Для этого во вьюшках нужно изменить дебаггинг:
modules/main/view.php
1
2
3
4
5
6
7
8
9
10
11
12

/**   
* Подключаем шаблон   
* Includes a templates   
*/ 
    
include './skins/tpl/main/show.tpl'
     
    
dbg($_GET);     
    
dbg($GET);
и во втором модуле по аналогии.

Ну и не забыть поменять переменную в переключателе страниц главного индекса:
1
2
3
4
5
6
7
8
9
10

/** 
* The switch of modules 
* Переключатель страниц 
*/       
    
switch($GET['page'])  
    { 

Теперь запускаем и изучаем. Обратите внимание на адресную строку и переменные в массивах.

Но в таком ракурсе никаких выгод от наших телодвижений не случилось. Так для из-за чего тогда весь сыр-бор? Дело в том, что нам понадобятся различные переменные, а так же разный вид ссылок. Как с гет-параметрами, так и без оных, а'ля ЧПУ

Ну так и продолжим изыскания.
Для начала определим минимальный набор переменных, которые нам понадобятся. Это будут
1. page - переменная переключения страниц сайта
2. rem - переменная переключения разделов
3. id - идентификатор
4. num - переменная для постранички.

Поместим это все в знакомый массив
1
2
3
4
5
6
7
8
9
10
11
12
13
14

/** 
* Array of variables for GET-parametres 
* Массив переменных для GET-параметров 
*/     
    
$GET = array( 
                  
'page'  => 'main'
                  
'rem'   => 'read'
                  
'id'    => 0
                  
'num'   => 0,                             
                );
Тут нам важен порядок следования, потому что мы будем использовать ЧПУ (по желанию), а там порядок определяет переменную. Поэтому только в таком порядке, не наоборот или как то иначе.

Ну а дальше заменим в этом массиве те элементы, которые имеются в массиве $_GET
Еще раз меняем содержимое
variables.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
<?php


/** 
* 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')); 
    } 

/** 
* Array of variables for GET-parametres 
* Массив переменных для GET-параметров 
*/     
    
$GET = array( 
                  
'page'  => 'main'
                  
'rem'   => 'read'
                  
'id'    => 0
                  
'num'   => 0,                             
                ); 
/** 
* Initialization of variables GET-parametres 
* Инициализация переменных GET-параметров 
*/                    
    
if(IRB_REWRITE == 'on' && !empty($_GET['route'])) 
    { 
        
$param explode('/'trim($_GET['route'], '/')); 
        
$i 0
                 
        foreach(
$GET as $var => $val
        { 
            if(!empty(
$param[$i])) 
               
$GET[$var] = $param[$i]; 
                
            ++
$i;    
        } 
    } 
    elseif(
count($_GET)) 
    { 
        foreach(
$GET as $var => $val
            if(!empty(
$_GET[$var])) 
               
$GET[$var] = $_GET[$var];     
    } 

А теперь посмотрим, как эта штука работает.
Для наглядности еще раз изменим ссылки в меню, добавив туда разделов:

menu.tpl
1
2
3
4
5
6
7
8
9
10
<!-- skins/tpl/menu.tpl begin -->  
Сегодня <?php echo $date ?> года  
<ul>  
<li><a href="/main/full/5/4">Главная страница</a></li>  
<li><a href="/second/small/10/6">Вторая страница</a></li>  
</ul>  

<!-- skins/tpl/menu.tpl end -->


Теперь если запустить сайт без параметров, один домен, то мы увидим пустой массив $_GET и массив $GET (не путать, это разные массивы) с дефолтными (по умолчанию) значениями.
Array
(
    [page] => main
    [rem] => read
    [id] => 0
    [num] => 0
)


А если поклацать по ссылкам, то станет понятно, для чего дыли нужны эти танцы. В массиве $_GET всего одна переменная.
Array
(
    [route] => second/small/10/6
)


А вот в массиве $GET (не путать) их уже четыре:
Array
(
    [page] => second
    [rem] => small
    [id] => 10
    [num] => 6
)
и все на своих местах.

Чтобы понять, как работает этот трехколесный велосипед, нужно уже начинать разбираться во встроенных функциях. Как говорится - учить матчасть.

Массив мы уже проходили. Сейчас нам понадобятся функции explode(), trim(), empty() и цикл foreach()

Вот алгоритм:
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


/** 
* Если включен REWRITE (тогда URL будет вида: site.ru/atr1/atr2/atr3) и есть входные параметры, то 
*/ 
    
if(IRB_REWRITE == 'on' && !empty($_GET['route'])) 
    { 
    
/** 
    * Обрабатываем значение $_GET['route'], которое содержит в себе atr1/atr2/atr3. 
    * 1. Удаляем '/' в начале и конце строки функцией trim() 
    * 2. Разделяем полученную строку функцией explode() по символу     '/' 
    * 3. Записываем полученные значения во временный массив $param 
    */ 
        
$route trim($_GET['route'], '/');
        
$param explode('/'$route); 
        
$i 0
         
    
/** 
    * Проходим по массиву $GET каждому его  элементу присваиваем соответствующие эл-ты массива $param.
    * Если таковые имеются. А если нет - оставляем дефолтные. 
    */ 
        
foreach($GET as $var => $val
        { 
            if(!empty(
$param[$i])) 
               
$GET[$var] = $param[$i]; 
                
            ++
$i;    
        } 
    } 
    
/** 
    * Иначе (если рерайт не включен, но параметры передаются) 
    */ 
    
elseif(count($_GET)) 
    { 
    
/** 
    * Для каждого элемента массива $GET присваеваем соответствуещее внешнее значение $_GET (аргументы в URL-е) 
    */ 
        
foreach($GET as $var => $val
            if(!empty(
$_GET[$var])) 
               
$GET[$var] = $_GET[$var];     
    } 

Что дают нам эти телодвижения.
1. Во-первых, переменные, прописанные в массиве $GET, будут всегда определены.
2. Во-вторых мы сможем очень легко их туда добавить.
3. В-третьих. При обычной инициализации, вот так к примеру:
1
2
3
4
5
6
7

    $page 
= !empty($_GET['page'])?$_GET['page']:NULL
    
$rem = !empty($_GET['rem'])?$_GET['rem']:NULL;   
    
$id = !empty($_GET['id'])?$_GET['id']:NULL;

в последующем коде не ясно, откуда эти переменные. А так
1
2
3
4
5

    
echo $GET['page'];
всегда ясно, что это гет-параметр.

4. Ну и самое главное - мы можем теперь одним движением включить или выключить ЧПУ.

Как это сделать - в следующем разделе.
____________________________________________________
Лирическое отступление. ЧПУ это конечно круто и красиво. Но во-первых не все хостинги поддерживают это, а во-вторых рерайт сам по себе штука довольно ресурсоемкая. А многим это не нравится. Поэтому мы не будем больше греть голову кому что нужно. Сами включат или выключат в конфиге.


Этот кусочек - начало так называемого роутера, то есть переключателя модулей.

Возникшие вопросы можно задать здесь.
Рейтинг@Mail.ru Рейтинг@Mail.ru Яндекс цитирования
irbis-team © 2009