Руководство по использованию Powtils Revision 392 (последняя на 06.11.2008)
Что необходимо для работы с Powtils
1. Скачивать последнюю ревизию с сайта
http://powtils.googlecode.com/svn/dev/2. Заходить на сайт
http://z505.com/cgi-bin/powtils/docs/1. ... neralindex, где выложена документация.
3. Читать данное руководство.
4. Спрашивать на форуме freepascal.ru
Исходные данные для начала работ
Выкаченные файлы в кладем папку /home/user/fpc/powtils, прописываем в файле fpc.cfg -Fu/home/user/fpc/powtils/main или в MSEIDE: Project->Options->Make->Directories->/home/user/fpc/powtils/main.
Проверяю работу, на следующей маленькой программе:
- Код: Выделить всё
program test;
uses pwinit, pwmain;
begin
Out('OK!');
end;
Если программа выведет что-нибудь вроде:
- Код: Выделить всё
X-Powered-By...
Contert-Ty...
OK!
Тогда все отлично! Идем дальше.
Веб-сервер должен отрабатывать cgi-файлы. Для того, что бы не исполнялось все подряд обычно задаются расширения файлов или часть имени, для которые могут исполняться на сервер (*.cgi, cgi). В особо запущенных случаях можно просто задать все на исполнение. Пример рабочей настройки для веб-сервера
- Код: Выделить всё
shttp3 (http://smallsrv.com):
# General setting:
log=/var/log/httpd.log
detail
logday
# radmin
# Direct IPs from that Web administration will be avilable:
adm_range="127.0.0.1,192.168.0.0-192.168.255.254,10.0.0.0-10.255.255.254"
adm_deny=""
# HTTP server setting:
max=32
port=80
dir="/home/user/www"
def="index.*"
# Other
# Change "none" to your password
user=admin;none;/var/shttps;A
Пример 1. Простой
- Код: Выделить всё
program test;
//pwinit и pwmain ОБЯЗАТЕЛЬНЫЕ юниты для работы Powtils!
uses pwinit, pwmain;
begin
//задаем разработчиков
SetHeader('X-Powered-By', 'Freepascal Team');
//задаем тип контента и кодировку (читать маны по веб-серверам и html)
SetHeader('Content-Type', 'text/html; charset=utf-8');
//вывод строки без знака CR-LF (т.е аналогично без нажатия Enter)
Out('Аналог Write');
//вывод строки со знаком CR-LF (т.е аналогично с нажатием Enter)
Outln('Аналог Writeln');
end.
Пример 2. Использование шаблонов
Создадим html-шаблон index.tpl:
- Код: Выделить всё
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>{$title}</title>
</head>
<body>
<!-- BEGIN BODY -->
<h2>Статья о фсягкой фигне</h2>
<div align="center">
{$text}
</div>
<!-- END BODY -->
<!-- BEGIN FOOT -->
<div align="center">
{$ps}
</div>
<!-- END FOOT -->
</body>
</html>
Наш cgi-файл index.cgi:
- Код: Выделить всё
program index;
//pwinit и pwmain ОБЯЗАТЕЛЬНЫЕ юниты для работы Powtils!
uses pwinit, pwmain;
begin
//задаем разработчиков
SetHeader('X-Powered-By', CRACKO_WAREZ Team');
//задаем тип контента и кодировку (читать маны по веб-серверам и html)
SetHeader('Content-Type', 'text/html; charset=utf-8');
//устновка значений переменных в шаблоне index.tpl
SetVar('title', 'Это наш заголовок!!!','');
SetVar('text', 'Тут должно быть бла-бла-бла','');
SetVar('ps', 'Типа постскриптум','');
//используем "TemplateRaw" чтобы никаких фильтрайий нашего кода небыло
//2-й вариант - "Template('ФАЙЛ-ШАБЛОН', УРОВЕНЬ ФИЛЬТРАЦИИ)", но тут надо эксперементировать
TemplateRaw('index.tpl');
end.
Пример 3. Получение данных из формы, отправленной веб-пользователем
В текущей версии разницы нет, какой тип отправки на сервер используется (GET или POST), в любом случае команда изъятия данный одна.
Создадим html-форму form.html:
- Код: Выделить всё
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>{$title}</title>
</head>
<body>
<!-- BEGIN BODY -->
<h2>Заполните эту гребанную форму отправьте нам!!!</h2>
<table border="1" align="center">
<form action="form.cgi" method="post" type="multipart/form-data">
<tr>
<td style="width: 150px;">Параметр</td>
<td style="width: 130px;">Значение</td>
</tr>
<tr>
<td>Ты хто?</td>
<td><input type="text" name="param1" size="20"></td>
</tr>
<tr>
<td>Пиши есчо!</td>
<td><input type="text" name="param2" size="20"></td>
</tr>
<tr>
<td colspan=2 style="text-align: right;"><input type="submit" name="action" value="Send"></td>
</tr>
</form>
</table>
<!-- END BODY -->
</body>
</html>
Наш cgi-файл form.cgi:
- Код: Выделить всё
program form;
//pwinit и pwmain ОБЯЗАТЕЛЬНЫЕ юниты для работы Powtils!
uses pwinit, pwmain, classes;
var StrLst: TStringList;
begin
StrLst := TStringList.Create;
//берем значение и добавляе в StringList
StrLst.Add(GetPostVar_S('param1',0));
//берем значение и добавляе в StringList
StrLst.Add(GetPostVar_S('param1',0));
//теперь весь вывод с формы в файле form_out.txt
StrLst.SaveToFile('form_out.txt');
end.
Метод отправления данных можно комбинировать.
Типичный пример прописывания разных форм:
...action="form.cgi?cgi_form=first"...
...action="form.cgi?cgi_form=second"...
т.е. на 1-странице можно задавать множество форм в одиноковыми именами параметров, а считывание данных обрабатывать так:
- Код: Выделить всё
if GetPostVar_S('сgi_form',0) = 'first' then Procedure1;
if GetPostVar_S('сgi_form',0) = 'second'...
Пример 4. Загрузка файлов на сервер
- Код: Выделить всё
program update;
//mode delphi - ОБЯЗАТЕЛЬНО!!!
{$mode delphi}{$H+}
uses unix, pwinit, pwmain, compactsysutils, pwenvvar;
const FUPL = 'fupl';
procedure ShowForm;
begin
Outln('<b>Обновление программы</b>');
Outln('<form method=post action="" enctype="multipart/form-data">');
Outln('<input name="'+FUPL+'" type=file size=20>');
Outln('<input type=submit value="Обновить">');
Outln('</form>');
end;
procedure ProcessUpfile;
var AbsoluteFname: string;
begin
AbsoluteFname := '/home/m230/m230n';
Out('Обновление...');
SaveUpFile(FUPL, AbsoluteFname);
if SaveUpFile(FUPL, AbsoluteFname) then
begin
Out('Обновление проведено успешно!');
end
else Out('Ошибка при обновлении!');
end;
begin
SetHeader('X-Powered-By', 'Freepascal Team');
SetHeader('Content-Type', 'text/html; charset=utf-8');
if IsUpFile(FUPL) then ProcessUpFile else ShowForm;
end.