Руководство по использованию 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.