Рассмотрим процесс обработки запроса в PHP Compiler на простом примере. Пример будет разобран весьма подробно, по шагам, начиная со строки HTTP-запроса, пришедшего на сервер, и заканчивая готовой HTML-страницей.
Предположим, что на наш сервер пришел следующий HTTP-запрос:
GET /gallery/space/page1
В базе данных при этом имеются следующие данные:
1. Страница gallery:
| id | name | template | bundles | title |
|---|
| 5 | gallery | gallery | gallery | Фотогалерея |
2. Правило представления ссылки, связанное со страницей gallery:
| pageid | pattern |
|---|
| 5 | gallery/$name/page$page |
3. Таблица photos со следующими данными:
| id | gallery | filename | title |
|---|
| 1 | animals | cat.jpg | Кошка |
| 2 | animals | dog.jpg | Собака |
| 3 | animals | owl.jpg | Сова |
| 4 | space | earth.jpg | Земля |
| 5 | space | moon.jpg | Луна |
| 6 | space | sun.jpg | Солнце |
| 7 | space | stars.jpg | Звезды |
4. Пакет gallery со следующим содержимым:
$name=acceptAlphaParameter("name");
$page=acceptIntParameter("page",1,10);
$offset=($page-1)*20;
$photos=$database->getLinesRange("photos",$offset,20,"gallery=".slashes($name));5. Шаблон gallery со следующим текстом:
<title><var:currentPage:title></title>
<table border="1">
<tr align="center">
<logic:iterator property=photos item="photo">
<td>
<img src="/photos/<var:photo:gallery>/<var:photo:filename>"><br>
<var:photo:title><br>
</td>
</logic:iterator>
</tr>
</table>Приступим.
Первым делом PHP Compiler определяет, какой из страниц адресован пришедший GET-запрос. В простейшем случае строка запроса совпадает с названием одной из PHPC-страниц в таблице pages (учтите только, что все запросы и все ссылки начинаются со слеша, тогда как названия страниц с этого символа никогда не начинаются). Но в нашем случае было использовано одно из правил "красивых ссылок", и для этого правила есть запись в таблице linkstyles:
| pageid | pattern |
|---|
| 5 | gallery/$name/page$page |
Путем несложной проверки движок определяет, что этот паттерн и пришедший GET-запрос (/gallery/space/page1) соответствуют друг другу и странице с ID=5:
gallery/$name/page$page
gallery/space/page1
При этом два дополнительных параметра были переданы неявно:
| Параметр | Значение |
|---|
| name | "space" |
| page | 1 |
Кроме неявных дополнительных параметров, правило представления ссылки может генерировать и явные параметры. Они должны быть перечислены в поле "Набор умолчаний" в форме создания нового представления ссылок в панели управления.
Все дополнительные параметры, а в нашем случае их два, name и page, добавляются в массив $_REQUEST:
$_REQUEST=array(
"name"=>"space",
"page"=>1
)
Движок же получает подсказку, что была запрошена страница gallery (поскольку у этой страницы ID=5).
Вообще, запрос "/gallery/space/page1" эквивалентен запросу:
GET /gallery?name=space&page=1
Используя правила представления ссылок (таблица linkstyles), движок автоматически приводит все "красивые" запросы к обыкновенным.
Наконец, зная, что была запрошена страница с ID=5, движок выбирает данные об этой странице:
| id | name | template | bundles | title |
|---|
| 5 | gallery | gallery | gallery | Фотогалерея |
Эти данные будут доступны в пакете и в шаблоне, в переменной $currentPage. Кроме того, движок теперь знает, как этот пакет и шаблон называются (gallery и там, и там). Можно приступать к следующему шагу.
Поскольку в свойствах страницы указан пакет gallery, движок запускает этот пакет на выполнение. Как мы помним, текст пакета состоит из четырех несложных PHP-команд:
$name=acceptAlphaParameter("name");
$page=acceptIntParameter("page",1,10);
$offset=($page-1)*20;
$photos=$database->getLinesRange("photos",$offset,20,"gallery=".slashes($name));Первые две команды, используя массив $_REQUEST, принимают два внешних параметра − "name" и "page". Внешние параметры − это параметры, присланные посетителем, их надо всегда тщательно проверять. Поэтому пакет не использует массив $_REQUEST, а использует стандартные функции acceptAlphaParameter и acceptIntParameter. Это гарантирует, что посетитель не сможет передать нам заведомо неверные или проблемные значения.
Третья строка, используя номер страницы, определяет начало диапазона выборки данных. Подробнее об этом можно почитать в описании к методу getLinesRange. Поскольку посетитель запросил первую страницу галереи, диапазон выборки начинается с 0. Таким образом, наш пакет можно мысленно свести к таким командам:
$name="space";
$page=1;
$offset=0;
$photos=$database->getLinesRange("photos",0,20,"gallery='space'");Последняя команда делает выборку из таблицы photos, ограниченную условием и диапазоном из 20 записей. Но в нашем примере подходящих записей и того меньше − всего 4, поэтому результат выборки будет иметь вид:
| id | gallery | filename | title |
|---|
| 4 | space | earth.jpg | Земля |
| 5 | space | moon.jpg | Луна |
| 6 | space | sun.jpg | Солнце |
| 7 | space | stars.jpg | Звезды |
Этот двухмерный массив будет сохранен в переменной $photos, и будет автоматически доступен к шаблоне.
Последний этап работы PHP Compiler − это выполнение шаблона gallery. В нем будут автоматически доступны все переменные, которые мы создали в пакете − в частности, переменная $photos с данными фотогалереи, а также переменная $currentPage с данными текущей страницы, которая понадобится нам для вывода заголовка.
После подстановки переменных и отработки циклических тегов <logic:iterator>, результат будет иметь вид:
<title>Фотогалерея</title>
<table border="1">
<tr align="center">
<td>
<img src="/photos/space/earth.jpg"><br>
Земля<br>
</td>
<td>
<img src="/photos/space/moon.jpg"><br>
Луна<br>
</td>
<td>
<img src="/photos/space/sun.jpg"><br>
Солнце<br>
</td>
<td>
<img src="/photos/space/stars.jpg"><br>
Звезды<br>
</td>
</tr>
</table>Полученный текст HTML-страницы уже не содержит никаких специальных тегов. Он отправляется посетителю.
Посетитель, получив готовую HTML-страницу, увидит у себя на экране что-нибудь наподобие:
