| Новости | FAQ | Авторы | Документация | В действии | Библиотека |
| Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
Sumo 25.08.2007 08:56 / 26.08.2007 11:54
В предыдущей заметке мы поговорили о том, как происходит выбор для экшнов в PF. Простая обработка не вызывает сложностей, но на практике возникает необходимость промежуточного преобразования url перед выбором обработчиков. Самый известный инструмент для этого Апачевский модуль mod_rewrite. Но работа с ним вызывает сложности у многих разработчиков. PF предоставляет внутренний rewrite-механизм, который сильно облегчает жизнь программистам./traffic/192.168.0.1/ /traffic/192.168.0.1/2007/ /traffic/192.168.0.1/2007/8/ /traffic/192.168.0.1/2007/8/22/При всем многообразии вариантов вывод информации легко делается одним методом, да и штатный метод написания обработчиков нам не подойдет - в URLе постоянная часть только "/traffic/". В этом случае нам помогут rewrite patterns:
@CLASS
internetModule
@USE
pf/web/pfSiteModule.p
@BASE
pfSiteModule
@create[aOptions][lIPPattern]
^BASE:create[$aOptions]
$lIPPattern[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}]
^addRewritePattern[traffic/:ip<$lIPPattern>;traffic]
^addRewritePattern[traffic/:ip<$lIPPattern>/:year<\d{4}>;traffic]
^addRewritePattern[traffic/:ip<$lIPPattern>/:year<\d{4}>/:month<\d{1,2}>;traffic]
^addRewritePattern[traffic/:ip<$lIPPattern>/:year<\d{4}>/:month<\d{1,2}>/:day<\d{1,2}>;traffic]
...
@onINDEX[aActionArgs]
По-умолчанию...
@onTraffic[aActionArgs]
В переменную $aActionArgs попадет такой хэш:
$aActionArgs[
$.ip[192.168.0.1]
$.year[2007]
$.month[8]
$.day[22]
]
Это в случае с самым длинным URLом. В остальных случаях полей бедет поменьше.Есть еще и побочный эффект: если наши экшны не совпадет ни с одним из шаблонов, то onTraffic не будет вызван, а управление перейдет к onINDEX. path1/(path2|path3)/:arg1/:arg2<regex>/:{arg3}-arg4
:arg1, :arg2 - имя переменной в выходном хеше
<regex> - регулярное выражение, которое уточняет формат в котором должна
прийти переменная.
(path|path3) - выражение, которое интерпретируется как регулярное выражение,
при этом левая скобка будет заменена на "(?:".
Не рекомендуется использовать!
Возможно будет исключено в следующих версиях, поскольку затрудняет
обратное преобразование урлов.
:{arg4} - аналогично штатному синтаксису Парсера, отделяет имя переменной от
ненужных символов.Возможны и статические преобразования. Если при добавлении шаблона указать опцию $aOptions.isStatic(1), то шаблон будет считаться регулярным выражением, которое должно совпать с экшном. При этом из экшна не будут "выкусываться" никакие переменные, редирект пройдет на $aNewAction, а вкачестве аргументов для обработчика будут использованы $aOptions.args. # Мы изменили имя функции добавления сообщения # в блог с "add" на "new", но хотим, чтобы у киентов работали # старые закладки. ^addRewritePattern[add;new;$.isStatic(1)]Библиотека PF