Автор: Пользователь скрыл имя, 10 Января 2012 в 22:18, дипломная работа
Бурное развитие информационных технологий и совершенствование компьютерной техники привело к глобальной интеграции их во все сферы человеческой деятельности. Не является исключением и сфера торговли.
В настоящее время очень велико разнообразие товаров и услуг в Internet. Для того, что бы организовать рекламную компанию в Internet, фирме необходимо иметь Web-страницу, где потенциальные клиенты смогли бы ознакомиться с фирмой, и узнать чем она занимается, интересны ли им предложения данной фирмы, задать (через форму обратной связи) интересующие их вопросы и т.д.
Цель данной работы является создание Web-сайта для компании ОАО «Усмань-табак». Необходимостью создания сайта ОАО «Усмань-табак» является, прежде всего, реклама продукции и услуг, которые предлагает данное предприятие. Интерактивная реклама – новый способ предложить товары и услуги потребителю. Интернет же являет собой наиболее динамично развивающуюся среду вещания. За последние пять лет кол-во пользователей сети Internet в России выросло в десятки раз, и на сегодняшний момент достигло 571 миллионов человек.
my $access=shift;
my(%parent,%pages);
my $res=$main::db->prepare("
$res->execute() or die "Error
$main::DBI::err \"$main::DBI::errstr\".";
while(my $s=$res->fetchrow_hashref){
#
Если для текущего ID
уже имеется подуровень
создаем для него ссылку
$s->{'sub'}=$pages{$s->{id}}->
#
Записываем ссылку на
значения текущего ID
$pages{$s->{id}}=$s;
#
Добавляем ссылку на
текущий ID к подуровеню
родителя
push(@{$pages{$s->{pid}}->{'
#
Записываем ID несуществующих
родителей
$parent{$s->{pid}}=0 unless defined $parent{$s->{pid}};
#
Текущий ID может является
родителем
$parent{$s->{id}}=1;
}
$res->finish();
my @not_id;#
Массив содержащий ID'ы
несуществующих родителей
foreach my $id (keys %parent){
push(@not_id,$id) unless
$parent{$id}
}
return wantarray?(\%pages,\@not_id):\
}
sub main_menu($;$$){
my ($m,$u,$l)=@_;
$u=defined($u)?($u+1):0;
my $menu=$l?'<ul
class="left">':'<ul>';
foreach my $li (@{$m}){
next if ($li->{hide}
&& $GROUP!=9);
$menu.='<li>';
$li->{name}.='<sup>*</sup>' if $li->{hide}==1;
if(defined $li->{'sub'}
&& $u <= $cfg->{menu}->{levels}){
if(LTE_IE6){
$menu.=$u?
"<a href=\"".
$li->{href}."\"
title=\"".
$li->{title}."\">".
$li->{name}."<table><tr><td>":
$li->{href}."\"
title=\"".
$li->{title}."\">".
$li->{name}."<table><tr><td>";
}else{
$menu.=
$li->{href}."\"
title=\"".
$li->{title}."\">".
$li->{name}."</a>";
}
$menu.=&main_menu($li->{'sub'}
$menu.=
}else{
$menu.="<a href=\"".
$li->{href}."\"
title=\"".
$li->{title}."\">".
$li->{name}."</a>";
}
$menu.='</li>';
}
$menu.='</ul>';
$menu;
}
##############################
sub menu($$){
my($ps,$uri) = @_;
my @link;
do{
my $p=$ps->{$furl{$uri}};
my $link='<a href="'.$p->{href}.'"
title="'.$p->{title}.'" >'.
$p->{name}.'</a>';
unshift(@link,$link);
}while($uri=~s/\/[^\/]+$//);
join($cfg->{menu}->{separator}
}
sub readfile($){
my $file=shift;
open(FILE,"$file") or die "Can't
read file \"$file\" ($!).";
flock(FILE,1);
read(FILE,$file,-s $file);
close(FILE);
$file;
}
##############################
#
Считываем страницы
с уровнем доступа $USER_GROUP
$pages=pages($GROUP);
#
Добавляем ссылки для
страниц
add_href($pages);
$pages->{0}->{href}='/';
$furl{''} =0;
$furl{'/'}=0;
#
Обрабатываем запрос
пользователя
my $uri=small_liter encode_uri(($ENV{REQUEST_URI}=
if(exists($in->{mod})){#
Передаем управление
модулю
my $module=$in->{mod};
$module=~s/[\\\/]//g;
do "./module/$module.mod";
}else{
do "apanel.pl";
unless($uri eq '/apanel'){
if(exists($furl{$uri})){
my $res=$main::db->prepare("
$res->execute() or die "Error
$main::DBI::err \"$main::DBI::errstr\".";
my $s=$res->fetchrow_hashref;
$res->finish();
$skinСоздание сайта для ОАО усмань табак = $s->{title};
$skinдоклады, рефераты, курсовые и дипломные работы, stud24 = $s->{keywords};
$skinБурное развитие информационных технологий и совершенствование компьютерной техники привело к глобальной интеграции их во все сферы человеческой деятельности. Не является исключением и сфера торговли. В настоящее время очень велико разнообразие товаров и услуг в Internet. Для того, что бы организовать рекламную компанию в Internet, фирме необходимо иметь Web-страницу, где потенциальные клиенты смогли бы ознакомиться с фирмой, и узнать чем она занимается, интересны ли им предложения данной фирмы, задать (через форму обратной связи) интересующие их вопросы и т.д. Цель данной работы является создание Web-сайта для компании ОАО «Усмань-табак». Необходимостью создания сайта ОАО «Усмань-табак» является, прежде всего, реклама продукции и услуг, которые предлагает данное предприятие. Интерактивная реклама – новый способ предложить товары и услуги потребителю. Интернет же являет собой наиболее динамично развивающуюся среду вещания. За последние пять лет кол-во пользователей сети Internet в России выросло в десятки раз, и на сегодняшний момент достигло 571 миллионов человек. = $s->{description};
$skin{CONTENT} = $s->{content};
$skin{SIDEBAR} = $s->{sidebar};
$skin{MENU} =
menu($pages,$uri);
}else{print "Нет
страницы $uri\n"}
}}
#
Формируем главное меню
$skin{MAIN_MENU}=main_menu($
$skin=readfile('/home/ausman/
$skin{ELAPSED_TIME}=sprintf("%
$skin=~s/\$([A-Z\-_]+)\$/$
print $skin;
Листинг 2. Модуль авторизации.
package Logined;
##############################
#
Настройки
##############################
our $Logined_Bot = exists($::cfg->{login}->{
our $Clean_Login = exists($::cfg->{login}->{
our $Clean_Login_time = exists($::cfg->{login}->{
our $Form_User = exists($::cfg->{login}->{Form_
our $Form_Pass = exists($::cfg->{login}->{Form_
our $Form_Action = exists($::cfg->{login}->{Form_
our $Domain_login = exists($::cfg->{login}->{
our $Session_id = exists($::cfg->{login}->{
our $IPBlock_count = exists($::cfg->{login}->{
our $IPBlock_timeout = exists($::cfg->{login}->{
our $UserBlock_count = exists($::cfg->{login}->{
our $UserBlock_timeout= exists($::cfg->{login}->{
our $Session_timeout = exists($::cfg->{login}->{
our $UserReg_timeout = exists($::cfg->{login}->{
our $UserDel_time = exists($::cfg->{login}->{
our $Block_log = exists($::cfg->{login}->{
our $Log_dir =
exists($::cfg->{login}->{Log_
our $Block_log_file = exists($::cfg->{login}->{
our $SID = '';
our $USER = '';
our $in=$::in;
##############################
#
Для усложнения подбора
паролей (вслучае перехвата
хеша MD5) используем
соль
#
Чем сложнее и длиннее
соль, тем меньше вероятность
подбора пароля!
#
Для усложнения соли
можно использовать
лювые символы \x00-\xff,
к примеру
#
управляющие символы.
#
ВНИМАНИЕ!!! Изменение
соли приведет к негодности
всех паролей!!!
our $salt = "" x 5;
##############################
if($Clean_Login){#
Чистка системы при
входе (отключать, только
если есть такое задание
в CRON'е)
my $res=$::db->prepare("SELECT
etime FROM UserBlock WHERE user='$Logined_Bot [Bot]'");
$res->execute() or die "Error
$::DBI::err \"$::DBI::errstr\".";
my($etime)=$res->fetchrow_
$res->finish();
if(time()>$etime){
$::db->do(
or die "Error
$::DBI::err \"$::DBI::errstr\".";
#
Удаляем просроченные
блокировки
$::db->do("DELETE
FROM IPBlock WHERE UNIX_TIMESTAMP()>etime AND count!=0");
$::db->do("DELETE
FROM UserBlock WHERE UNIX_TIMESTAMP()>etime AND count!=0");
#
Удаляем пользователей
невошедших в систему
в течении более $UserReg_timeout
часов после регистрации
$::db->do("DELETE
FROM User WHERE UNIX_TIMESTAMP()>(ctime+($
#
Удаляем пользователей
невходивших в систему
более более $UserDel_time
дней
$::db->do("DELETE
FROM User WHERE UNIX_TIMESTAMP()>(ltime+($
#
Удаляем просроченные
сессии
my $res=$::db->prepare("SELECT id,user,addr,ctime,atime
FROM Sessions WHERE UNIX_TIMESTAMP()>etime");
$res->execute() or die "Error $::DBI::err
\"$::DBI::errstr\".";
while(my ($id,$user,$addr,$ctime,$
$::db->do(
$::db->do("UPDATE User SET laddr='$addr',ltime=$atime,
}
$res->finish();
}
}
##############################
#
Функция форматированного
вывода времени
#
Если есть &main::lb::ftime
используем ее
sub ftime($;$){
my($f,$t)=@_;
$t=$t?$t:time();
if(exists(&main::lib::ftime)){
else{scalar localtime($t)}
}
#
Генерация идентификатора
#
Использование: $идентификатор=genUID;
или $идентификатор=genUID($длина);
# (по
умолчанию $длина равна
32)
#
Количество вариантов
идентификатора = 62^$длина
sub genUID(;$){
my $len=shift;
$len=32 unless $len;
my(@l)=('a'..'z','A'..'Z',0..9
$len=abs($len);$len--;$len=$#l if $len>$#l;
my $uid=
for(0..$len){$uid.=$l[int(
$uid;
}
##############################
#
Экранируем апостров
и обратный слешь
sub esc_txt($){
my $v=shift;
$v=~s/[\\\']/\\$1/g;
$v;
}
##############################
#
Протоколируем блокировку
sub block_log($$$$){
my($user,$blocked,$text,$time)
if($Block_log){
open(LOG,
or die
flock(LOG,2);
if($time==0){
print
LOG ftime("!d!.!MM!.'!yy!
!c!:!mm!")."\t\"$user\",
разблокирован \"$blocked\" ($text).\n"
}elsif($time<0){
print
LOG ftime("!d!.!MM!.'!yy!
!c!:!mm!")."\t\"$user\",
заблокирован \"$blocked\" навсегда ($text).\n"
}else{
print
LOG ftime("!d!.!MM!.'!yy!
!c!:!mm!")."\t\"$user\",
заблокирован \"$blocked\" на $time мин. ($text).\n"
}
close(LOG);
}
}
##############################
#
Блокировка пользователя
# user_block($пользователь,$кто_
# $время_блокировки
- время в секундах на
которе блокируется
пользователь, при этом,
если
# $время_блокировки
== 0 или не указано, то
с пользователя снимается
блокировка, а если
# $время_блокировки
< 0, то пользователь
блокируется навсегда
sub user_block($$$;$){
my($user,$blocked,$text,$time)
$time=$time?$time:
my $user_count=$time<0?0:$
$time=
my $query="REPLACE
UserBlock VALUES ('$user',$user_count,UNIX_
$::db->do($query) or die "Error $::DBI::err
\"$::DBI::errstr\".";
($user,$blocked,$text,$time)=
block_log($user,$blocked,$
exit_user($user);
}
#
Блокировка IP
#
ip_block($ip,$кто_блокирует,$
# $время_блокировки
- время в секундах на
которе блокируется
IP, при этом, если
# $время_блокировки
== 0 или не указано, то
с IP снимается блокировка,
а если
# $время_блокировки
< 0, то IP блокируется
навсегда
sub ip_block($$$;$){
my($ip,$blocked,$text,$time)=
$time=$time?$time:
my $addr_count=$time<0?0:$
$time=
my $query="REPLACE
IPBlock VALUES ('$ip',$addr_count,UNIX_
$::db->do($query) or die "Error $::DBI::err
\"$::DBI::errstr\".";
($ip,$blocked,$text,$time)=map {$_=~s/\\([\\\'])/$1/ge;$_} ($ip,$blocked,$text,$time);
block_log($ip,$blocked,$text,$
exit_ip($ip);
}
#
Возвращаем имя пользователя
по идентификатору сессии
# $user=this_session($sid);
sub this_session($){
my $id=esc_txt shift;
my $res=$::db->prepare("SELECT
user FROM Sessions WHERE id='$id' AND addr='$ENV{REMOTE_ADDR}' AND UNIX_TIMESTAMP()<=etime");
$res->execute() or die "Error
$::DBI::err \"$::DBI::errstr\".";
my $user=$res->fetchrow_array();
$res->finish();
if(defined $user){
$::db->do("UPDATE Sessions SET
atime=UNIX_TIMESTAMP(),etime=
return $user
}else{return ''}
}
##############################
#
Проверка пользователя
на существование
sub exists_user($){
my $user= esc_txt shift;
my $res=$::db->prepare("SELECT
user FROM User Where user='$user'");
$res->execute() or die "Error
$::DBI::err \"$::DBI::errstr\".";
$user=$res->fetchrow_array();
$res->finish();
if(defined $user){return 1}
else{return ''}
}
##############################
#
Регистрация пользователя
sub reg_user($$;%){
my $user = shift;
my $pass = esc_txt shift;
my(%param)=map {$_=~s/\t/
/g;esc_txt($_)} @_;
my $param=join("\t",(%param));
if(exists_user($user)){
if(wantarray){return
('',"Пользователь
\"$user\" уже существует")}
else{return ''}
}else{
$user =
esc_txt $user;
if($::db->do("INSERT INTO User
VALUES ('$user',MD5('$pass'),UNIX_
$user=~s/\\([\\\'])/$1/ge;
user_block($user,'$Logined_Bot
[Bot]','Регистрация
нового пользователя.');
if(wantarray){return (1,"Пользователь
\"$user\" зарегистрирован успешно!")}
else{return 1}
}else{
if(wantarray){return ('',"Error
$::DBI::err \"$::DBI::errstr\".")}
else{return ''}
}
}
}
##############################
#
Меняем пароль пользователя
# new_pass($user,$пароль[,$
#
Если $старый_пароль
указан не верно, возращает
ложь.
sub new_pass($$;$){
my $user = esc_txt shift;
my $npass = esc_txt shift;
my $pass = esc_txt shift;
if($pass){
my $res=$::db->prepare("SELECT pass FROM
User WHERE user='$user' AND pass=MD5('$pass')");
$res->execute() or
die "Error
$::DBI::err \"$::DBI::errstr\".";
my($user_pass)=$res->fetchrow_
$res->finish();
if(defined($user_pass)){
$::db->do(
1}else{''}
}else{
$::db->do("UPDATE User SET pass=MD5('$pass')
WHERE user='$user'")
or die "Error
$::DBI::err \"$::DBI::errstr\".";
1}
}
##############################
#
Читаем или записываем
информацию о пользователе
#
Чтобы читать информацию
о пользователе, используем %param=user_param($user);
#
Чтобы записать параметры
пользователя (Зарезервированные
имена хеша обновлению
не подлежат)
#
user_param($user,$new_param);
#
Зарезервированные
имена хеша:
#
MD5_PASSWORD - зашифрованный
пароль пользователя
#
REGISTRATION_TIME - Время регистрации
пользователя
#
AMOUNT_LOGINED - Количество
заходов в систему
#
CONDUCTED_TIME - Проведено
времени
#
LAST_LOGINED_TIME - Время последнего
входа в систему
#
LAST_LOGINED_ADDR - IP адрес с
которого последний
раз входили в систему
sub user_param($;%){
if($#_==0){
my $user = esc_txt
shift;
my $res=$::db->prepare("SELECT pass,ctime,stotal,stime,ltime,
$res->execute() or
die "Error
$::DBI::err \"$::DBI::errstr\".";
my($pass,$ctime,$stotal,$
$res->finish();
my %param=split(/\t/,$param);
$param{MD5_PASSWORD}=$pass;
$param{REGISTRATION_TIME}=$
$param{AMOUNT_LOGINED}=$
$param{CONDUCTED_TIME}=$stime;
$param{LAST_LOGINED_TIME}=$
$param{LAST_LOGINED_ADDR}=$
%param;
}else{
my $user = esc_txt
shift;
my(%param)=map {$_=~s/\t/
/g;esc_txt($_)} @_;
delete $param{MD5_PASSWORD};
delete $param{REGISTRATION_TIME};
delete $param{AMOUNT_LOGINED};
delete $param{CONDUCTED_TIME};
delete $param{LAST_LOGINED_TIME};
delete $param{LAST_LOGINED_ADDR};
my $param=join(
$::db->do("UPDATE User SET param='$param'
WHERE user='$user'")
or die "Error
$::DBI::err \"$::DBI::errstr\".";
}
}
##############################
#
Читаем группы
sub get_group(){
my $group;
my $res=$::db->prepare("SELECT
* FROM `Group`");
$res->execute() or die "Error
$::DBI::err \"$::DBI::errstr\".";
while(my $h=$res->fetchrow_hashref()){
foreach my $u (split(/\s+/,$h->{users})){
if($h->{gid}>$group->{$u}->{
$group->{$u}->{id}=$h->{gid};
$group->{$u}->{name}=$h->{
}
}
}
$res->finish();
$group;
}
#
Создаем сессию пользователя
# ($sid,$login_or_error_text)=
#
При неудачном входе $sid
пуста, а $login_or_error_text
содержит информацию
о ошибке
# $sid=new_session($user,$pass);
sub new_session($$){
my($user,$pass)=@_;
#
Защищаемся от внешних
воздействий
$user=esc_txt($user);
my $qBaddr="SELECT
etime,count,blocked,reason FROM IPBlock WHERE addr='$ENV{REMOTE_ADDR}'
AND UNIX_TIMESTAMP()<etime";
my $qBuser="SELECT
etime,count,blocked,reason FROM UserBlock WHERE user='$user' AND UNIX_TIMESTAMP()<etime";
my $res=$::db->prepare($qBaddr);
$res->execute() or die "Error
$::DBI::err \"$::DBI::errstr\".";
my($addr_etime,$addr_count,$
$res->finish();
$res=$::db->prepare($qBuser);
$res->execute() or die
my($user_etime,$user_count,$
$res->finish();
if(defined($addr_etime) && ($addr_count==
$addr_blocked=~s/\s+\[Bot\]$/<
if(wantarray){(
else{''}
}elsif(defined($user_etime) && ($user_count==0||$user_count>=
$user_blocked=~s/\s+\[Bot\]$/<
if(wantarray){(
else{''}
}else{
#
Блокировок нет
my $query="SELECT pass FROM
User WHERE user='$user' AND pass=MD5('$pass')";
$res=$::db->prepare($query);
$res->execute() or
die "Error
$::DBI::err \"$::DBI::errstr\".";
my($user_pass)=$res->fetchrow_
$res->finish();
if(defined($user_pass)){
$query="SELECT
id,addr FROM Sessions WHERE user='$user' AND UNIX_TIMESTAMP()<=etime";
$res=$::db->prepare($query);
$res->execute() or die "Error
$::DBI::err \"$::DBI::errstr\".";
my($sid,$addr)=$res->fetchrow_
$res->finish();
if($addr eq $ENV{REMOTE_ADDR}){
$::db->do("UPDATE
Sessions SET id='$sid',etime=UNIX_
die "UserUpdate
session is stoped.\nError $::DBI::err \"$::DBI::errstr\"." if defined($::DBI::err);
}else{ #
создаем новую сессию
для пользователя
#
Если имеется сессия
на другом компьютере
выходим из нее
exit_session($sid) if defined($sid);
my $i=0;
do{#
Генерируем идентификатор
сессии
$sid=genUID;
$i++;
}until($::db->do("INSERT
INTO Sessions VALUES('$sid','$user','$ENV{
die "UserIdentifier
selection is stopped on $i attempt.\nError $::DBI::err \"$::DBI::errstr\"." if defined($::DBI::err);
#
Обновляем информацию
о количистве заходов
$::db->do("UPDATE
User SET stotal=(stotal+1) WHERE user='$user'")
or die "Error
$::DBI::err \"$::DBI::errstr\".";
}
if(wantarray){($sid,'')}
else{$sid}
}else{ #
Пароль неподошел, или
пользователь несуществует
my $query="SELECT
pass FROM User WHERE user='$user'";
$res=$::db->prepare($query);
$res->execute() or die "Error
$::DBI::err \"$::DBI::errstr\".";
my($user_pass)=$res->fetchrow_
$res->finish();
if(!defined($user_pass)){
if(wantarray){('',"
else{''}
}else{ #
Пароль неподошел, протоколируем
попытку входа.
my $val="Неправильный
пароль.";
$val.="<br
/>Попытка взлома запротоколирована" if (defined($user_etime) || defined($addr_etime));
$user_count++;
$addr_count++;
$query="REPLACE
UserBlock VALUES ('$user',$user_count,UNIX_
$::db->do($query) or die "Error
$::DBI::err \"$::DBI::errstr\".";
block_log($user,'$Logined_Bot
[Bot]','Попытка
подбора пароля',$UserBlock_timeout)
if $user_count>=$UserBlock_count;
$query=
$::db->do($query) or die "Error
$::DBI::err \"$::DBI::errstr\".";
block_log($ENV{REMOTE_ADDR},'$
if(wantarray){('',$val)}
else{''}
}
}
}
}
##############################
#
Завершаем сессию по
пользователю
# exit_user($user);
sub exit_user($){
my $user=esc_txt shift;
my $query="SELECT
id,addr,ctime,atime FROM Sessions WHERE user='$user'";
my $res=$::db->prepare($query);
$res->execute() or die "Error
$::DBI::err \"$::DBI::errstr\".";
my($id,$addr,$ctime,$atime)=$
$res->finish();
if(defined($id)){
$::db->do(
$::db->do("UPDATE User SET laddr='$addr',ltime=$atime,
}
}
##############################
#
Завершаем сессию по IP
# exit_user($user);
sub exit_ip($){
my $addr=esc_txt shift;
my $query="SELECT
user,id,ctime,atime FROM Sessions WHERE addr='$addr'";
my $res=$::db->prepare($query);
$res->execute() or die "Error
$::DBI::err \"$::DBI::errstr\".";
my($user,$id,$ctime,$atime)=$
$res->finish();
if(defined($user)){
$::db->do(
$::db->do("UPDATE User SET laddr='$addr',ltime=$atime,
}
}
##############################
#
Завершаем сессию
# exit_session($sid);
sub exit_session($){
my $id=esc_txt shift;
my $query="SELECT
user,addr,ctime,atime FROM Sessions WHERE id='$id'";
my $res=$::db->prepare($query);
$res->execute() or die "Error
$::DBI::err \"$::DBI::errstr\".";
my($user,$addr,$ctime,$atime)=
$res->finish();
if(defined($user)){
$::db->do(
$::db->do("UPDATE User SET laddr='$addr',ltime=$atime,
}
}
##############################
#
Время через N минут,
в GMT формате
sub expires_time(;$){
my $t=shift;
$t=$t?$t:0;
$t*=60;
$t+=time();
my @t=gmtime($t);
my @wday=qw 'Sun
Mon Tue Wed Thu Fri Sat';
my @month=qw 'Jan
Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec';
$t[5]+=1900;
($t[0],$t[1],$t[2],$t[3])=map {$_<10?"0$_":$_} ($t[0],$t[1],$t[2],$t[3]);
"$wday[$t[6]],
$t[3]-$month[$t[4]]-$t[5] $t[2]:$t[1]:$t[0] GMT"
}
##############################
#
Обновляем Cookie
sub cookie_up($){
my $sid=shift;
print "Set-Cookie:
$Session_id=$sid; domain=$Domain_login; path=/; expires=".expires_time($
}
##############################
#
Удаляем Cookie
sub cookie_del(){
print "Set-Cookie:
$Session_id=; domain=$Domain_login; path=/; expires=".expires_time(-1440).
}
##############################
#
Читаем SID из Cookies
sub sid_cookie(){
my $sid='';
foreach my $cookies (split(/;\s+/,$ENV{HTTP_
my($name,$value)=map
{$_=~s/\%([\dA-F]{
$sid=$value if $Session_id
eq $name;
}
$sid;
}
##############################
#
Страничка перезагрузки
sub page_refresh($;$){
my($user,$a)=@_;
$a=$a?$a:'Login';
my $referer=$ENV{HTTP_REFERER};
print "Content-Type:
text/html\n\n";
print "<!DOCTYPE
html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/
"<head>\n".
"<title>Web
$a [$user]</title>\n".
"<meta
http-equiv=\"refresh\" content=\"0; url=$referer\"
/>\n".
"</head>\n".
"<body>\n".
"<div
style=\"text-align: center;\">\n".
"<h3>Web
$a [$user]</h3>\n".
"<br
/>\n".
"Please
click <a href=\"$referer\">here</a> to proceed...\n".
"</div>\n".
"</body>\n".
"</html>";
exit;
}
##############################
#
Значение формы exit
sub exit_value(;$){
my $id=shift;
$id=$id?$id:$SID;
my $p=ord($id)-48;
while($p>30){$p-=31}
$id=crypt($id,substr($id,$p,2)
$id=~s/[^\w\d]//g;
$id;
}
# Web Login
sub web_login(){
my $val='';
my $sid=sid_cookie();
my $user=$sid?this_session($sid):
my %in=();
$in{user} = $in->{$Form_User};
$in{pass} = $in->{$Form_Pass};
$in{action} = $in->{$Form_Action};
$in{exit} = $in->{exit};
if($user && exists $in{exit} &&
exit_value($sid) eq $in{exit}){exit_session($sid);
elsif($user){cookie_up($sid);$
elsif($in{action} eq
($sid,$val)=new_session($in{
if($sid){cookie_up($sid);page_
(
else{('','')}
}
1;
Листинг 3. Библиотека процедур ‘mylib.pl’.
#!/usr/bin/perl
use strict;
use locale; use POSIX qw(locale_h); setlocale(LC_CTYPE,"ru_RU.
use CGI qw(escapeHTML);
use Data::Dumper;
####
use DBI; #
Модуль для работы с
БД
#
Глобальные переменные
our %skin=();
our($cfg,$db,$skin,$pages,%
$cfg={
#
Настройка SQL
##############################
sql=>{
type => 'mysql', #
Тип БД
name => 'ausman_tabak', #
Имя БД
host => 'localhost', #
Хост БД
user => 'ausman_tabak', #
Имя пользователя для
доступа к БД
pass => 'Yyh3x0e0', #
Пароль для доступа
к БД
},
##############################
#
Настройка меню
##############################
menu=>{
levels => 4, #
Число вложений в главном
меню
separator => '
→ ', #
Разделитель в дополнительном
меню
},
##############################
};
#
Подключаемся к БД
$db=DBI->connect('DBI:'.$cfg->
die
$db->do("SET
NAMES cp1251");
##############################
#
Обявляем глобальные
переменные
our $in={}; #
Анонимный хешь данных
форм
our $CONTENT=0; #
Печатали или нет 'Content-Type'
##############################
#
Считываем данные форм
{#
Обрабатываем формы.
sub urlencode($){
my $val=shift;
$val=~s/([=\+\&\%\/\\\|\0-\
$val=~tr/ /\+/;
$val;
}
sub urldecode($){
my $val=shift;
$val=~tr/\+/ /;
$val=~s/%([\dA-F]{2})/pack('C'
$val;
}
sub query2in($){
my $query=shift;
foreach my $pair (split(/&/,$query)){
my($n,$v)=map {urldecode($_)}
split(/=/,$pair);
if(defined $in->{$n}){
if(ref
$in->{$n} eq 'ARRAY'){push(@{$in->{$n}},$v)
else{$in->{$n}=[$in->{$n},$v]}
}else{$in->{$n}=$v}
}
}
query2in($ENV{
if ($ENV{REQUEST_METHOD} eq
seek(STDIN,0,0);
read(STDIN,my $buffer,$ENV{'CONTENT_LENGTH'}
seek(STDIN,
query2in($buffer);
}
}
##############################
#
Печатаем 'Content-Type'
sub content(;$){
my $content=shift;
$content=$content?$content:'
unless($CONTENT){
$CONTENT++;
print "Cache-Control:
no-cache, max-age=0\n";
print "Content-Type:
$content\n\n";
}
}
##############################
#
Считываем файл полностью
sub readfile($){
my $file=shift;
open(FILE,"$file") or die "Can't
read file \"$file\" ($!).";
flock(FILE,1);
read(FILE,$file,-s $file);
close(FILE);
$file;
}
##############################
#
Считываем файл конфигурации
sub readcfg($){
my $file=shift;
do $file.'.conf';
}
##############################
#
Записываем файл конфигурации
sub writecfg($$){
my $file=shift;
my $cfg=shift;
if(open(FILE,">$file.conf")){
flock(FILE,2);
print FILE "my
";
print FILE Dumper($cfg);
close(FILE);
return 1;
}else{return 0;}
}
##############################
#
Экранируем апостров
и обратный слешь
sub esc_sql($){
my $v=shift;
$v=~s/[\\\']/\\$1/g;
$v;
}
##############################
#
Удаляем страницу со
всеми подстраницами
sub del_page($){
my $id=esc_sql shift;
my $res=$::db->prepare("SELECT
id FROM pages WHERE pid='$id'");
$res->execute() or die "Error
$::DBI::err \"$::DBI::errstr\".";
while(my $chid=$res->fetchrow_array){&
$main::db->do(
}
##############################
#
Считываем подуровни
раздела
sub sub_page($){
my $id=esc_sql shift;
my $res=$::db->prepare("SELECT
id,name,title FROM pages WHERE pid='$id' ORDER BY sort DESC");
$res->execute() or die "Error
$main::DBI::err \"$main::DBI::errstr\".";
my @child;
while(my $child=$res->fetchrow_hashref)
push(@child,$child) unless
$child->{id}==
}
@child;
}
##############################
#
Перемещаем страницу
sub move_page($$;$){
my($pid,$newpid,$p)=map {esc_sql($_)} @_;
$p=$p?'p':'';
$main::db->do("UPDATE
pages SET pid='$newpid' WHERE ${p}id='$pid'");
}
##############################
sub get_pages($){#
Считываем структуру
страниц
my $access=esc_sql shift;
my(%parent,%pages);
my $res=$main::db->prepare("
$res->execute() or die "Error
$main::DBI::err \"$main::DBI::errstr\".";
while(my $s=$res->fetchrow_hashref){
#
Если для текущего ID
уже имеется подуровень
создаем для него ссылку
$s->{'sub'}=$pages{$s->{id}}->
#
Записываем ссылку на
значения текущего ID
$pages{$s->{id}}=$s;
#
Добавляем ссылку на
текущий ID к подуровеню
родителя
push(@{$pages{$s->{pid}}->{'
#
Записываем ID несуществующих
родителей
$parent{$s->{pid}}=0 unless defined $parent{$s->{pid}};
#
Текущий ID может являться
родителем
$parent{$s->{id}}=1;
}
$res->finish();
my @not_id;#
Массив содержащий ID'ы
несуществующих родителей
foreach my $id (keys %parent){
push(@not_id,$id) unless
$parent{$id}
}
return wantarray?(\%pages,\@not_id):\
}
#
Создаем дерево страниц
для select'а
sub s_razdel($;$){
my ($m,$c)=@_;
$c=defined($c)?$c:'';
my $menu='';
for my $i (0..$#{$m}){
my $li=$m->[$i];
$menu.='<option
value="'.$li->{'id'}.'" >';
$menu.=$c;
$menu.=$i==$#{$m}?'└':'
my $hide=$li->{hide}?' ■':'';
if(defined $li->{'sub'}){
$menu.='┬ '.$li->{name}.$hide.'</option>
$menu.=&s_razdel($li->{'sub'},
}else{
$menu.='─ '.$li->{name}.$hide.'</option>
}
}
$menu;
}
##############################
#
Создаем дерево страниц
для select'а с оринтацией
sub so_razdel($;$){
my ($m,$c)=@_;
$c=defined($c)?$c:'';
my $menu='';
for my $i (0..$#{$m}){
my $li=$m->[$i];
$menu.='<option
value="'.$li->{'id'}.'" >';
$menu.=$c;
$menu.=$i==$#{$m}?'└':'
my $left=$li->{left}?' ←':'
→';
if(defined $li->{'sub'}){
$menu.='┬ '.$li->{name}.$left.'</option>
$menu.=&so_razdel($li->{'sub'}
}else{
$menu.='─ '.$li->{name}.$left.'</option>
}
}
$menu;
}
##############################
1; #
Сообщение об успешной
загрузке (не удалять)
Листинг 4. Администраторская панель.
#!/usr/bin/perl
#use strict;
my $print='';
my $title='';
my $head='';
my $sidebar='';
my $amenu=[];
if($::GROUP==9){
if($in->{a} eq 'add_apage'){
$title= "Добавление
страницы";
if(exists($in->{r}) && exists($in->{name})){
my($pid,$name,$title,$key,$
$in->{r},$in->{name},$in->{
$in->{content});
if($main::db->do(
$print.= "<h3>Страница
успешно добавлена</h3><br />".
"<h4>Не забудте
ее опубликовать (разел <a href='?a=public_apage'>
}else{
$print.= "<h3>Ошибка
добавления</h3><br />";
$print.= "<p>Error
$main::DBI::err \"$main::DBI::errstr\".</p>";
}
}else{
$head.= '<script
type="text/javascript" src="/js/ckeditor/ckeditor.js"
$print.= "<form
action=\'/apanel\' method='post'><input type='hidden' name='a'
value='$in->{a}' />";
$print.= "<table>";
$print.= "<tr><td>Родительский
раздел:</td>";
$print.= "<td><select
name='r' ><option value='0'>Основной раздел</option>";
my $apages=get_apages(0);
$print.= s_razdel($apages->{0}->{sub});
$print.=
$print.= "<tr><td>Краткое
имя (для меню):</td><td><input name='name'
/></td></tr>";
$print.= "<tr><td>Заголовок
страницы:</td><td><input name='title' /></td></tr>";
$print.= "<tr><td>Ключевые
слова:</td><td><textarea name='keywords'></textarea></
$print.= "<tr><td>Описание:</td><td><
$print.= "<tr><td>Наполнение:</td><td><
$print.= "<script
type=\"text/javascript\">\n".
"CKEDITOR.replace(
'editor',{filebrowserBrowseUrl : '/js/imglib/index.html?path=/'
"</script>";
$print.= "<tr><td>\ </td><td><
$print.= "</table></form>";
$print.= "<p>*
Символом \"■\" обозначены не
опубликованные страницы.</p>";
}
}elsif($in->{a} eq 'edit_apage'){
$title="Редактирование
страницы";
if(exists($in->{id}) && exists($in->{name})){
my($id,$name,$title,$key,$
$in->{id},$in->{name},$in->{
$in->{content});
if($main::db->do(
$print.= "<h3>Страница
успешно обновлена</h3>";
}else{
$print.= "<h3>Ошибка
обновлеия</h3>";
$print.= "<p>Error
$main::DBI::err \"$main::DBI::errstr\".</p>";
}
}elsif(exists($in->{id})){
my $id=esc_sql($in->{id});
my $res=$main::db->prepare("
$res->execute() or die "Error
$main::DBI::err \"$main::DBI::errstr\".";
my($name,$title,$keywords,$
$head.=
$print.= "<form
action=\'/apanel\' method='post'><input type='hidden' name='a'
value='$in->{a}' />";
$print.= "<input
type='hidden' name='id' value='$in->{id}' /><table>";
$print.= "<tr><td>Краткое
имя (для меню):</td><td><input name='name'
value='$name' /></td></tr>";
$print.= "<tr><td>Заголовок
страницы:</td><td><input name='title' value='$title'
/></td></tr>";
$print.= "<tr><td>Ключевые
слова:</td><td><textarea name='keywords'>$keywords</
$print.= "<tr><td>Описание:</td><td><
$print.= "<tr><td>Наполнение:</td><td><
$print.= "<script
type=\"text/javascript\">\n".
"CKEDITOR.replace(
'editor',{filebrowserBrowseUrl : '/js/imglib/index.html?path=/'
"</script>";
$print.= "<tr><td>\ </td><td><
$print.= "</table></form>";
}else{
$print.= "<form
action=\'/apanel\' method='post'><input type='hidden' name='a'
value='$in->{a}' />";
$print.= "<table>";
$print.= "<tr><td>Выберите
страницу для редактирования:</td>";
$print.= "<td><select
name='id' ><option value='0'>Главная</option>";
my $apages=get_apages(0);
my $option=s_razdel($apages->{0}-
$print.= $option;
$print.= "</select></td></tr>";
$print.= "<tr><td>\ </td><td><
$print.= "</table></form>";
$print.= "<p>*
Символом \"■\" обозначены не
опубликованные страницы.</p>";
}
}elsif($in->{a} eq 'move_apage'){
$title="Перемещение
страниц";
if(exists($in->{id}) && exists($in->{move})){
my($id,$pid)=map
{esc_sql($_)} ($in->{id},$in->{move});
if($id==0){
$print.= "<h3>Вы
не можите переместить <b>Основной раздел</b></h3>";
}elsif($id==$pid){
$print.= "<h3>Вы
не можите переместить раздел сам в себя</h3>";
}else{
move_apage($id,$pid,$in->{how}
$print.=
}
}else{
$print.= "<form
action=\'/apanel\' method='post'><input type='hidden' name='a'
value='$in->{a}' />";
$print.= "<table>";
$print.= "<tr><td>Переносимый
раздел:</td>";
$print.= "<td><select
name='id' ><option value='0'>Основной раздел</option>";
my $apages=get_apages(0);
my $option=s_razdel($apages->{0}-
$print.= $option;
$print.= "</select></td></tr>";
$print.= "<tr><td>Куда
переносим:</td>";
$print.= "<td><select
name='move' >";
$print.= "<option
value='0'>Основной раздел</option>";
$print.= $option;
$print.= "</select></td></tr>";
$print.= "<tr><td>Как
переносим:</td>";
$print.= "<td><select
name='how' >";
$print.= "<option
value='0' selected='selected' >Раздел с подразделами</option>";
$print.= "<option
value='1'>Только подразделы</option>";;
$print.= "</select></td></tr>";
$print.= "<tr><td>\ </td><td><
$print.= "</table></form>";
$print.= "<p>*
Символом \"■\" обозначены не
опубликованные страницы.</p>";
}
}elsif($in->{a} eq 'public_apage'){
$title="Отображение
страниц";
if(exists($in->{id}) && exists($in->{o})){
my($id,$o)=map
{esc_sql($_)} ($in->{id},$in->{o});
if($id==0){
$print.= "<h3>Вы
не можите скрыть <b>Основной раздел</b></h3>";
}elsif($o==-1){
$main::db->do("UPDATE
apages SET hide=NOT hide WHERE id='$id'");
$print.= "<h3>Успешно
инвертировано</h3>";
}else{
$o=$o?1:0;
$main::db->do("UPDATE
apages SET hide='$o' WHERE id='$id'");
my @o=('Опубликовано','Скрыто');
$print.= "<h3>$o[$o]
успешно</h3>";
}
}else{
$print.= "<form
action=\'/apanel\' method='post'><input type='hidden' name='a'
value='$in->{a}' />";
$print.= "<h1>Отображение
страниц</h1><table>";
$print.= "<tr><td>Страница:</td>";
$print.= "<td><select
name='id' ><option value='0'>Основной раздел</option>";
my $apages=get_apages(0);
my $option=s_razdel($apages->{0}-
$print.= $option;
$print.= "</select></td></tr>";
$print.= "<tr><td>Отображение:</td>";
$print.= "<td><select
name='o' >";
$print.= "<option
value='-1' selected='selected'>Инверсия</
$print.= "<option
value='0'>Опубликовать</
$print.= "<option
value='1'>Скрыть</option>";
$print.= "</select></td></tr>";
$print.= "<tr><td>\ </td><td><
$print.= "</table></form>";
$print.= "<p>*
Символом \"■\" обозначены не
опубликованные страницы.</p>";
}
}elsif($in->{a} eq 'del_apage'){
$title="Удаление
страниц";
if(exists($in->{id}) && exists($in->{move})){
my($id,$pid)=map
{esc_sql($_)} ($in->{id},$in->{move});
if($id==0){
$print.= "<h3>Вы
не можите удалить <b>Основной раздел</b></h3>";
}elsif($pid==-1){
del_apage($id);
$print.= "<h3>Страница
удалена со всеми подуровнями</h3>";
}elsif($pid==$id){
$print.= "<h3>Вы
не можите перенести подразделы в удаляемый
раздел</h3>";
}else{
move_apage($id,$pid,'pid');
del_apage($id);
$print.= "<h3>Страница
удалена.</h3>\n";
$print.= "<h4>Подуровни
страницы пренесены в ID:$pid</h4>";
}
}else{
$print.= "<form
action=\'/apanel\' method='post'><input type='hidden' name='a'
value='$in->{a}' />";
$print.= "<table>";
$print.= "<tr><td>Страница
для удаления:</td>";
$print.= "<td><select
name='id' ><option value='0'>Основной раздел</option>";
my $apages=get_apages(0);
my $option=s_razdel($apages->{0}-
$print.= $option;
$print.= "</select></td></tr>";
$print.= "<tr><td>Переместить
дочерние страницы в:</td>";
$print.= "<td><select
name='move' ><option value='-1'>Не перемещать (удалить)</option>";
$print.= "<option
value='0' selected='selected' >Основной раздел</option>";
$print.= $option;
$print.= "</select></td></tr>";
$print.= "<tr><td>\ </td><td><
$print.= "</table></form>";
$print.= "<p>*
Символом \"■\" обозначены не
опубликованные страницы.</p>";
}
}elsif($in->{a} eq 'sort_menu'){
$title="Сортировка
меню";
if(exists($in->{sort}->[0])){
my(@sort)=reverse
map {esc_sql($_)} (@{$in->{sort}});
for
my $i (0..$#sort){
$main::db->do("UPDATE
apages SET sort='$i' WHERE id='$sort[$i]'");
}
$print.= "<h3>Сортировка
сохранена</h3>";
}elsif(exists($in->{id})){
my @child=sub_apage($in->{id});
$head.='<script
src="/js/jquery-1.5.1.min.js" type="text/javascript"></
$head.='<script
src="/js/jquery-ui-1.8.13.
$head.="<style
type=\"text/css\">\n";
$head.="#sortable
{ list-style-type: none; margin: 0; padding: 10; width: 390px; }\n";
$head.="#sortable
li { cursor: move; border:1px solid #000; margin: 0 3px 3px 3px; padding:
0.4em; padding-left: 1.5em; font-size: 1.4em; height: 18px; }\n";
$head.="</style><script
type=\"text/javascript\">\n";
$head.="\$(function(){\$(\"#
$head.=
$print.= "<form
action=\'/apanel\' method='post'><input type='hidden' name='a'
value='$in->{a}' />";
my $apages=get_apages(0);
$print.= "<input
type='hidden' name='id' value='$in->{id}' />";
$print.= "<h3>Сортировка
раздела: $apages->{$in->{id}}->{name}</
$print.= "<ul
id='sortable' >";
foreach my $child (@child){
$print.= "<li><a
title='$child->{title}'><input type='hidden' name='sort' value='$child->{id}'
/>$child->{name}</a></li>";
}
$print.= "</ul><br
/>";
$print.= "<input
type='submit' value='Сохранить' />";
$print.= "</form>";
}else{
$print.= "<form
action=\'/apanel\' method='post'><input type='hidden' name='a'
value='$in->{a}' />";
$print.= "<table>";
$print.= "<tr><td>Выбирите
раздел для сортировки:</td>";
$print.= "<td><select
name='id' ><option value='0'>Основной раздел</option>";
my $apages=get_apages(0);
my $option=s_razdel($apages->{0}-
$print.= $option;
$print.=
$print.= "<tr><td>\ </td><td><
$print.= "</table></form>";
$print.= "<p>*
Символом \"■\" обозначены не
опубликованные страницы.</p>";
}
}elsif($in->{a} eq 'set_menu'){
$title="Настройка
меню";
if(exists($in->{height}) && exists($in->{width})){
my $menu = {
width => $in->{width},
height => $in->{height},
mc => $in->{mc},
mbgc => $in->{mbgc},
hmc => $in->{hmc},
hmbgc => $in->{hmbgc},
cc => $in->{cc},
cbgc => $in->{cbgc},
hcc => $in->{hcc},
hcbgc => $in->{hcbgc},
scc => $in->{scc},
scbgc => $in->{scbgc},
shcc => $in->{shcc},
shcbgc => $in->{shcbgc},
};
if(writecfg('menu',$menu)){
$print.= "<h3>Сохранено
успешно</h3>";
}else{
$print.= "<h3>Не удалось
сохранить</h3>";
}
}else{
my $m=readcfg('menu');
$head.= '<script
src="/js/jquery-1.5.1.min.js" type="text/javascript"></
$head.= '<script
src="/js/iColorPickerLink.js" type="text/javascript"></
$print.= "<form
action=\'/apanel\' method='post'><input type='hidden' name='a'
value='$in->{a}' />";
$print.= "<table
width='100\%' style='text-align: center;border:1px solid #000;'>";
$print.= "<caption
style='border: 1px solid black;'><b>Размер кнопки</b></caption>";
$print.= "<tbody>";
$print.= "<tr><td>Ширина:</td><td
width='200px'><input name='width' value='$m->{width}' /></td></tr>";
$print.= "<tr><td>Высота:</td><td><
$print.= '<tr><td> </td><td><input
type=\'submit\' value=\'Сохранить\' /></td></tr>';
$print.= "</tbody></table><br
/>";
$print.= "<table
width='100\%' style='text-align: center;border:1px solid #000;'>".
"<caption
style='border: 1px solid black;'><b>Настройка цвета</b></caption><tbody>";
$print.= "<tr><th>".join('</th><th>','
$print.= "<tr><td>Основной
раздел</td>";
$print.= "<td
width='100px'><input value='$m->{mc}' id='mc' name='mc' size='7'
class='iColorPicker' /></td>";
$print.= "<td
width='100px'><input value='$m->{mbgc}' id='mbgc' name='mbgc'
size='7' class='iColorPicker' /></td></tr>";
$print.= "<tr><td>Основной
раздел (при наведении)</td>";
$print.= "<td><input
id='hmc' name='hmc' value='$m->{hmc}' size='7' class='iColorPicker'
/></td>";
$print.= "<td><input
id='hmbgc' name='hmbgc' value='$m->{hmbgc}' size='7' class='iColorPicker'
/></td></tr>";
$print.= "<tr><td>Дочерний
раздел</td>";
$print.= "<td><input
id='cc' name='cc' value='$m->{cc}' size='7' class='iColorPicker'
/></td>";
$print.= "<td><input
id='cbgc' name='cbgc' value='$m->{cbgc}' size='7' class='iColorPicker'
/></td></tr>";
$print.= "<tr><td>Дочерний
раздел (при наведении)</td>";
$print.= "<td><input
id='hcc' name='hcc' value='$m->{hcc}' size='7' class='iColorPicker'
/></td>";
$print.= "<td><input
id='hcbgc' name='hcbgc' value='$m->{hcbgc}' size='7' class='iColorPicker'
/></td></tr>";
$print.= "<tr><td>Дочерний
раздел с подразелом</td>";
$print.= "<td><input
id='scc' name='scc' value='$m->{scc}' size='7' class='iColorPicker'
/></td>";
$print.= "<td><input
id='scbgc' name='scbgc' value='$m->{scbgc}' size='7' class='iColorPicker'
/></td></tr>";
$print.= "<tr><td>Дочерний
раздел с подразелом (при наведении)</td>";
$print.= "<td><input
id='shcc' name='shcc' value='$m->{shcc}' size='7' class='iColorPicker'
/></td>";
$print.= "<td><input
id='shcbgc' name='shcbgc' value='$m->{shcbgc}' size='7' class='iColorPicker'
/></td></tr>";
$print.= '<tr><td> </td><td
colspan=\'2\'><input type=\'submit\' value=\'Сохранить\'
/></td></tr>';
$print.= "</tbody></table></form>";
}
}elsif($in->{a} eq 'left_menu'){
$title="Ориентация
выпадения меню";
if(exists($in->{id}) && exists($in->{o})){
my($id,$o)=map
{esc_sql($_)} ($in->{id},$in->{o});
if($id==0){
$print.= "<h3>Вы
не можите сорентировать выпадение подразделов
<b>Основного раздела</b>, они статичены.</h3>";
}elsif($o==-1){
$main::db->do("UPDATE
apages SET `left`=NOT `left` WHERE id='$id'");
$print.= "<h3>Выпадение
успешно инвертировано</h3>";
}else{
$o=$o?1:0;
$main::db->do("UPDATE
apages SET `left`='$o' WHERE id='$id'");
$print.= "<h3>Выполнено
успешно</h3>";
}
$print.= "</body></html>";
}else{
$print.= "<form
action=\'/apanel\' method='post'><input type='hidden' name='a'
value='$in->{a}' />";
$print.= "<table>";
$print.= "<tr><td>Раздел:</td>";
$print.= "<td><select
name='id' ><option value='0'>Основной раздел</option>";
my $apages=get_apages(0);
my $option=so_razdel($apages->{0}
$print.= $option;
$print.= "</select></td></tr>";
$print.= "<tr><td>Ориентация:</td>";
$print.= "<td><select
name='o' >";
$print.= "<option
value='-1' selected='selected'>Инверсия \↔</option>";
$print.= "<option
value='0'>Вправо \→</option>";
$print.= "<option
value='1'>Влево \←</option>";
$print.= "</select></td></tr>";
$print.= "<tr><td>\ </td><td><
$print.= "</table></form>";
$print.= "<p>*
Символами \"\←\" и \"\→\"
обозначено в какую сторону будут выпадать
дочерние разделы.</p>";
}
}else{
$title.="Панель
управления";
$print.="<p><b>$::USER</b>,
добро пожаловать в панель управления
сайтом.</p>";
$print.="<p>Выберите
нужную функцию управления.</p>";
}
$amenu=[{
name=>'Cтраницы',
'sub'
=> [
{
name=>'Добавить',
href=>'/apanel?a=add_apage',
},
{
name=>'Переместить',
href=>'/apanel?a=move_apage',
},
{
name=>'Редактировать',
href=>'/apanel?a=edit_apage',
},
{
name=>'Отображение',
href=>'/apanel?a=public_apage'
},
{
name=>
href=>'/apanel?a=del_apage',
},],},
{name=>'Меню',
'sub'
=> [
{
name=>'Сортировка',
href=>'/apanel?a=sort_menu',
},
{
name=>'Ориентация',
href=>'/apanel?a=left_menu',
},
{
name=>'Настройка',
href=>'/apanel?a=set_menu',
},],},
{name=>'Выход',
href=>"?$Logined::Form_Action=
];
unshift(@{$apages->{
}else{
$title="Вход";
$print="<h3
align='center'>$::LOGIN_ERR</
$print.="<table
width='90%'>";
$print.= '<form
action=\'/apanel\' method="post">';
$print.= "<tr><td
align='right' width='50%'>Логин::</td><td><
$print.= "<tr><td
align='right'>Пароль::</td><
$print.= "<tr><td>\ </td><td><
$print.= "<input
type='hidden' name='action' value='login' /></form>";
$print.= "</table>";
}
$skinСоздание сайта для ОАО усмань табак=$title.'
- Админка';
$skin{CONTENT}=$print;
$skin{SIDEBAR}=$sidebar;
$skin{HEAD}.=$head;
1;
Листинг 5. Модуль расширения «Поиск по сайту»
#
Модуль поиска
по содержимому
страниц
use locale; use POSIX qw(locale_h); setlocale(LC_CTYPE,"ru_RU.
package mod::search;
sub morf($){
#
Формируем окончание
слова "страниц"
в зависимости от $found
#
для фразы "Найдено
$found страниц
$_[0]=~/(\d)?(\d)$/;
my @m=($1,$2);
my $m='страниц';
if($m[0]==1){$m.=''}
elsif($m[1]==1){$m.='а'}
elsif($m[1] && $m[1]<5){$m.='ы'}
else{$m.=''}
$m;
}
#
Формируем заголовок
по умолчанию
$::skinСоздание сайта для ОАО усмань табак='Поиск';
$::skin{MENU}=&::menu($::
#
Считываем строку поиска
ограничевая ее 64-мя
символами
# 64
символа пользователю
будет достаточно для
поиска
my $s=substr($::in->{s},0,64);
#
Удаляем все лишнее,
оставляем только текст
и пробелы
$s=~s/[^\w\x7F-\xFF\s]/ /g;
#
Формируем массив слов
для поиска добавляя
слова более трех симовлов
my @s=grep {!/^.{1,3}$/} split(/\s+/,$s);
if($#s>=0){#
Есть что искать
#
Формируем логику поиска
my $logic=$::in->{logic}
ne 'AND'?'OR':'AND';
#
Формируем запрос
my $query="SELECT
* FROM pages WHERE content LIKE '\%".
join("\%'
$logic content LIKE '%",@s)."\%'";
#
Выполняем запрос
my $res=$::db->prepare($query);
#
Количество найденного
my $found=$res->execute();
$found=0 if !$found || $found eq '0E0';
#
Формируем окончание
слова "страниц"
в зависимости от $found
#
для фразы "Найдено
$found страниц
my $morf=morf($found);
$::skin{CONTENT}="<h3>
$::skinСоздание сайта для ОАО усмань табак.=':
"'.join("
",@s).'"';
while(my $h=$res->fetchrow_hashref){
#
Формируем список найденных
страниц
$::skin{CONTENT}.="<li><h4><a
href=\"$::pages->{$h->{id}}->{
$h->{title}."</a></h4>\n";
#
Формируем описание
my $desc=$h->{content};
#
удаляем теги из описания
$desc=~s/<(noindex|script|
$desc=~s/<.*?>//gs;
#
Подсвечиваем найденные
слова
foreach (@s){$desc=~s/($_)/<b>$1<\/b>/
$desc=~s/^(|.*\.)\s*([^\.]*<b>
#
Добовляем описание
$::skin{CONTENT}.="<p align=\"justify\">$desc</p></
}
$res->finish();
$::skin{CONTENT}.="</ol>";
}else{
$::skin{CONTENT}="<h3>Плохой
запрос</h3>".
"<p>Слова
при поиске должны быть длиннее 3-х символов</p>"
}
1;