File:  [Local Repository] / register / prgsrc / register.cgi
Revision 1.3: download - view: text, annotated - select for diffs - revision graph
Tue Sep 4 21:15:18 2001 UTC (22 years, 10 months ago) by boris
Branches: MAIN
CVS tags: HEAD
Added new bottom

    1: #!/usr/bin/perl
    2: 
    3: =pod
    4: 
    5: =head1 NAME 
    6: 
    7: register.cgi - a universal script for club regiter
    8: 
    9: =head1 SYNOPSIS
   10: 
   11: register.cgi?[I<options>]
   12: 
   13: =head1 DESCRIPTION
   14: 
   15: The script draws the hierarchy in the form suitable for WWW
   16: 
   17: =head1 AUTHOR
   18: 
   19: Boris Veytsman
   20: 
   21: =head1 DATE
   22: 
   23: $Date: 2001/09/04 21:15:18 $
   24: 
   25: =head1 REVISION
   26: 
   27: $Revision: 1.3 $
   28: 
   29: =cut
   30: 
   31: 
   32: ###################################################
   33: # Starting up
   34: ###################################################
   35: 
   36:     use strict;
   37: use CGI qw(:standard);
   38: use DBI;
   39: use POSIX qw(locale_h);
   40: 
   41: setlocale(LC_CTYPE,'russian');
   42: 
   43: my ($SENDMAIL) = "/usr/sbin/sendmail";
   44: my $TO = 'borisv@lk.net';
   45: my $FROM = 'borisv@lk.net';
   46: 
   47: my $date='$Date: 2001/09/04 21:15:18 $';
   48: $date =~ s/[^ ]* ([^ ]*) .*/$1/; 
   49: 
   50: 
   51: my $dbh = DBI->connect("DBI:mysql:chgk", "piataev", "")
   52:     or do {
   53: 	print h1("Временные проблемы") . "База данных временно не
   54: 			работает. Заходите попозже.";
   55: 	print &Include_virtual("../dimrub/db/reklama.html");
   56: 	print end_html;
   57: 	die "Can't connect to DB chgk\n";
   58:     };
   59: 
   60: print header;
   61: 
   62: 
   63: ##################################################
   64: # Printing top
   65: ##################################################
   66: print start_html(-"title"=>'Register of Clubs',
   67: 		 -author=>'borisv@lk.net',
   68: 		 -background=>"../images/map.jpg");
   69: print &Include_virtual("../dimrub/db/reklama.html");
   70: print <<END;
   71: <table>
   72: <tr>
   73: <td background=../images/compass.gif valign=top>
   74: END
   75: 
   76: ################################################
   77: # NAVIGATION PANEL
   78: ################################################
   79:     
   80: my $self=url();
   81: 
   82: 
   83: 
   84: ###############################################
   85: # The navigation panel has three special lines
   86: ###############################################
   87: print <<END;
   88: <dl>
   89: <dt><a href="$self?rid=1&level=1000&clubs=0">Все регионы</a></dt>
   90: <dt><a href="$self?rid=1&level=1000&clubs=1">Все клубы</a></dt>
   91: <dt><a href="$self?addclub=1">Добавить клуб</a></dt>
   92: END
   93: 
   94: #################################################
   95: # And the navpanel itself
   96: ##################################################
   97: 
   98:     print ListRegions(dbh=>$dbh,rid=>1,level=>1,tag=>'dt',
   99: 		      self=>$self);
  100:     
  101: print <<END;
  102: </dl>
  103: END
  104: 
  105: 
  106: 
  107:     print <<END;
  108: </td>
  109: <td width=100% valign=top>
  110: END
  111: 
  112: 
  113: ######################################################
  114: #        MAIN PANEL
  115: ######################################################
  116: 
  117: #
  118: # First, we introduce ourselves
  119: #
  120:     print <<END;
  121: 
  122: <h1 align=center><a href="http:/znatoki/klub/znat.html"><img 
  123: ismap border=0 src= "http:../images/logo.gif" 
  124: alt="Интернет Клуб Что? Где? Когда?" width=319 height=27></a>
  125: <br>ПРЕДСТАВЛЯЕТ<br>
  126: Реестр Клубов Интеллектуальных Игр
  127: </h1>
  128: END
  129: 
  130: #
  131: # Now check the parameters...
  132: #
  133:     if (param('rid')) {
  134: 	my $rid = param('rid');
  135: 	$rid =~ s/(\d*)/$1/;
  136: 	print ListRegions(dbh=>$dbh,rid=>$rid,
  137: 			  level=>param('level'),
  138: 			  clubs=>param('clubs'),
  139: 			  tag=>'h2',
  140: 			  self=>$self);
  141:     } elsif (param('cid')) {
  142: 	my $cid = param('cid');
  143: 	$cid =~ s/(\d*)/$1/;
  144: 	print ClubInfo(dbh=>$dbh,cid=>$cid,
  145: 		       self=>$self);
  146:     } elsif (param('addclub')) {
  147: 	print AddClub();
  148:     } elsif (param('Submit')) {
  149: 	print SendLetter();
  150:     } else {
  151: 	print <<END;
  152: <dl>
  153: <dt><a href="$self?rid=1&level=1000&clubs=0">Все регионы</a></dt>
  154: <dt><a href="$self?rid=1&level=1000&clubs=1">Все клубы</a></dt>
  155: <dt><a href="$self?addclub=1">Добавить клуб или изменить сведения
  156: о клубе</a></dt>
  157: </dl>
  158: END
  159: 
  160: 
  161: ####################################################################
  162: # And the bottom of the page
  163: ###################################################################
  164: 
  165:     print "<p align=center>";
  166:     print "Эту страничку посмотрели ";
  167:     print `/home/piataev/public_html/cgi-bin/counter.sh /znatoki/cgi-bin/register.cgi`;
  168:     print " раз(а)</p>\n";
  169:     
  170:     print <<END;
  171: <hr>
  172: <address>
  173: <img width = 60 height = 80 src="../images/owl.gif" alt = "owl"> 
  174: <a href="http://users.lk.net/~borisv">
  175: Boris Veytsman</a>, $date
  176: </address>
  177: </body>
  178: </html>
  179: END
  180: 
  181: 
  182:     print <<END;
  183: </td>
  184: </tr>
  185: </table>
  186: END
  187: 
  188: print end_html;
  189: 
  190: exit 0;
  191: 
  192: ###################################################
  193: # Parsing included file
  194: ##################################################
  195: sub Include_virtual {
  196:     my ($fn, $output) = (@_, '');
  197:     
  198:     open F , $fn
  199: 	or return; #die "Can't open the file $fn: $!\n";
  200:     
  201:     while (<F>) {
  202: 	if (/<!--#include/o) {
  203: 	    s/<!--#include virtual="\/(.*)" -->/&Include_virtual($1)/e;
  204: 	}
  205: 	if (/<!--#exec/o) {
  206: 	    s/<!--#exec.*cmd\s*=\s*"([^"]*)".*-->/`$1`/e;
  207: 	}
  208: 	$output .= $_;
  209:     }
  210:     return $output;
  211: }
  212: 
  213: 
  214: 
  215: #############################################################
  216: # Listing the given region and optionally its children
  217: #############################################################
  218: 
  219: 
  220: sub ListRegions {
  221:     my %args = @_;
  222:     my $sth = $args{'dbh'}->prepare("
  223: SELECT Name FROM Regions WHERE RID=$args{'rid'}");
  224:     $sth->execute;
  225:     if (!$sth->rows) {
  226: 	return "";
  227:     }
  228:     my ($name)=$sth->fetchrow_array;
  229:     $name="<a href=\"$self?rid=$args{'rid'}&level=1&clubs=1\">$name</a>";
  230:     my $result="<$args{'tag'}>$name</$args{'tag'}>\n";
  231:     if ($args{'level'}>0) { # Print children
  232: 
  233: 	# Frist, we print clubs
  234: 	if ($args{'clubs'}) {
  235: 	    $result .= ListClubs(%args);
  236: 	}
  237: 	$sth=$args{'dbh'}->prepare("
  238: SELECT Child FROM RegionRegion WHERE Parent=$args{'rid'}");
  239: 	$sth->execute;
  240: 	if ($sth->rows) {
  241: 	    my @kids=();
  242: 	    while (my ($kid)=$sth->fetchrow_array) {
  243: 		push @kids,"rid=$kid";
  244: 	    }
  245: 	    my $clause = join(' OR ', @kids);
  246: 	    $result .= "<dl>\n";
  247: 	    $sth=$args{'dbh'}->prepare("
  248: SELECT rid FROM Regions WHERE $clause ORDER BY Name");
  249: 	    $sth->execute;
  250: 	    while (my ($kid)=$sth->fetchrow_array) {
  251: 		$result .= ListRegions(
  252: 				       %args,'rid'=>$kid,
  253: 				       'level'=>$args{'level'}-1,
  254: 				       'tag'=>'dt');
  255: 	    }
  256: 	}
  257:     }
  258:     return $result;
  259: }
  260: 
  261: ############################################################
  262: # List the clubs of a given region
  263: ###########################################################
  264: sub ListClubs {
  265:     my %args = @_;
  266:     my $sth;
  267:     if ($args{'cid'}) {
  268: 	$sth = $args{'dbh'}->prepare("
  269: SELECT Child FROM ClubClub WHERE Parent=$args{'cid'}");
  270:     } else {
  271: 	$sth = $args{'dbh'}->prepare("
  272: SELECT cid FROM ClubRegion WHERE rid=$args{'rid'}");
  273:     }
  274: 
  275:     $sth->execute;
  276: 	
  277:     if (!$sth->rows) {
  278: 	return "";
  279:     }
  280:     
  281:     my $result;
  282: 	
  283:     if ($args{'cid'}) {
  284: 
  285: 	$result=<<END;
  286: <h3>Клубы:</h3>
  287: <dd><dl>\n
  288: END
  289:      } else {
  290:  
  291: 	 $result=<<END;
  292: <dl><dt>Клубы:</dt>
  293: <dd><dl>\n
  294: END
  295:     }
  296:     my @clubs=();
  297:     while (my ($club)=$sth->fetchrow_array) {
  298: 	push @clubs,"cid=$club";
  299:     }
  300:     my $clause = join(' OR ', @clubs);
  301:     $sth=$args{'dbh'}->prepare("
  302: SELECT cid, Name FROM Clubs WHERE $clause ORDER BY Name");
  303:     $sth->execute;
  304:     while (my ($cid,$Name)=$sth->fetchrow_array) {
  305: 	$result .= dt("<a href=\"$self?cid=$cid\">$Name</a>\n");
  306:     }
  307:     $result .= "</dl></dd></dl>\n";
  308: }
  309: 
  310: #############################################################
  311: # The longest subroutine in the list...
  312: #############################################################
  313: sub ClubInfo {
  314:     my %args = @_;
  315:     my $sth = $args{'dbh'}->prepare("
  316: SELECT * FROM Clubs WHERE cid=$args{'cid'}");
  317:     $sth->execute;
  318: 
  319:     if (!$sth->rows) {
  320: 	return "";
  321:     }
  322:     
  323:     my $result="";
  324:     my $club=$sth->fetchrow_hashref;
  325:     $result .= h2($club->{'Name'});
  326: 
  327:     if (my $string=$club->{'Address'}) {
  328: 	$string =~ s/\n/<br>\n/g;
  329: 	$result .= h3('Адрес')."\n".p($string);
  330:     }
  331: 
  332:     if (my $string=$club->{'URL'}) {
  333: 	$string = htmlize($string);
  334: 	$result .= h3('Домашняя страничка')."\n".p($string);
  335:     }
  336: 
  337:     if (my $string=$club->{'Phone'}) {
  338: 	$result .= h3('Телефон')."\n".p($string);
  339:     }
  340: 
  341:     if (my $string=$club->{'Fax'}) {
  342: 	$result .= h3('Факс')."\n".p($string);
  343:     }
  344: 
  345:     if (my $string=$club->{'Email'}) {
  346: 	$string = htmlize($string,'mailto:');
  347: 	$result .= h3('E-mail')."\n".p($string);
  348:     }
  349: 
  350: 
  351:     $result .= ListPeople(%args); 
  352: 
  353:     $result .= ListClubs(%args); 
  354: 
  355:     if (my $string=$club->{'DoB'}) {
  356: 	$result .= h3('История создания клуба')."\n".p($string);
  357:     }
  358: 
  359:     if (my $string=$club->{'Sponsor'}) {
  360: 	$result .= h3('Спонсор')."\n".p($string);
  361:     }
  362: 
  363:     if (my $string=$club->{'Meetings'}) {
  364: 	$result .= h3('Форма деятельности клуба')."\n".p($string);
  365:     }
  366: 
  367:     if (my $string=$club->{'AdultTeams'}) {
  368: 	$result .= h3('Взрослые команды')."\n".p($string);
  369:     
  370:     }
  371: 
  372:     if (my $string=$club->{'KidTeams'}) {
  373: 	$result .= h3('Детские команды')."\n".p($string);
  374:     
  375:     }
  376: 
  377:     if (my $string=$club->{'ForeignFests'}) {
  378: 	$result .= h3('Иногородние фестивали, традиционно посещаемые командами клуба')."\n".p($string);
  379:     
  380:     }
  381: 
  382:     if (my $string=$club->{'Braglist'}) {
  383: 	$result .= h3('Высшие достижения команд клуба')."\n".p($string);
  384:     
  385:     }
  386: 
  387:     if (my $string=$club->{'OwnFests'}) {
  388: 	$result .= h3('Фестивали, организуемые клубом')."\n".p($string);
  389:     
  390:     }
  391: 
  392: 
  393:     return $result;
  394: 
  395: }
  396: 
  397: 
  398: ##############################################################
  399: # Adding a href=... The second optional argument may be 
  400: # 'mailto:'
  401: ##############################################################
  402: 
  403: sub htmlize {
  404:     my($string,$proto)=@_;
  405:     $string =~ s/^\s+//;
  406:     $string =~ s/\s+$//;
  407:     my @entities = split /\s+/, $string;
  408:     my @hrefs=map {"<a href=\"$proto$_\">$_</a>"} @entities;
  409:     return join(", ",@hrefs);
  410: }
  411: 
  412: 
  413: ##############################################################
  414: # List the bosses....
  415: ##############################################################
  416: sub ListPeople {
  417:     my %args = @_;
  418:     my $sth = $args{'dbh'}->prepare("
  419: SELECT pid,Position FROM ClubPeople WHERE cid=$args{'cid'} ORDER BY Weight DESC");
  420:     $sth->execute;
  421: 
  422:     if (!$sth->rows) {
  423: 	return "";
  424:     }
  425: 
  426:     my $result=h3('Руководство');
  427:     while (my($pid,$Position)=$sth->fetchrow_array) {
  428: 	$result .= h4($Position);
  429: 	$result .= ListPerson(%args,pid=>$pid);
  430:     }
  431:     return $result;
  432: }
  433: 
  434: ##############################################################
  435: # Listing one person
  436: #############################################################
  437: sub ListPerson {
  438:     my %args=@_;
  439:     my $sth = $args{'dbh'}->prepare("
  440: SELECT * FROM People WHERE pid=$args{'pid'}");
  441:     $sth->execute;
  442: 
  443:     if (!$sth->rows) {
  444: 	return "";
  445:     }
  446: 
  447:     my @entries=();
  448:     my $person=$sth->fetchrow_hashref;
  449:     if (my $string = $person->{'Name'}) {
  450: 	push @entries, $string;
  451:     }
  452:     if (my $string=$person->{'Address'}) {
  453: 	push @entries, "Адрес: $string";
  454:     }
  455: 
  456:     if (my $string=$person->{'URL'}) {
  457: 	$string = htmlize($string);
  458: 	push @entries, "Домашнаяя страничка: $string";
  459:     }
  460: 
  461:     if (my $string=$person->{'Phone'}) {
  462: 	push @entries, "Телефон: $string";
  463:     }
  464: 
  465:     if (my $string=$person->{'Fax'}) {
  466: 	push @entries, "Факс: $string";
  467:     }
  468: 
  469:     if (my $string=$person->{'Email'}) {
  470: 	$string = htmlize($string,'mailto:');
  471: 	push @entries, "E-mail: $string";
  472:     }
  473: 
  474:     return p(join('; ',@entries).".");
  475: 
  476: }
  477: 
  478: 
  479: #########################################################
  480: # Adding club
  481: #########################################################
  482: sub AddClub {
  483:     my $result=h2("Добавить клуб или изменить информацию о клубе");
  484:     
  485: 
  486:     $result .= start_form;
  487: 
  488:     $result .= h3("Контактная информация");
  489:     $result .= p("Адрес, телефон, email и т.д. ниже -- НЕ адреса руководства
  490: клуба (их Вы введёте ниже), 
  491: а официальные адреса самого клуба. Если отдельного адреса,
  492: телефона, и т.д. у клуба нет, просто оставьте
  493: поля пустыми");
  494:     $result .= table(Tr(td(["Название клуба",
  495: 			    textfield(-name=>'Name',
  496: 				   -size=>60)])),
  497: 		     Tr(td(["Официальный адрес клуба",
  498: 			    textarea(-name=>'Address',
  499: 				     -rows=>5,
  500: 				     -columns=>60)])),
  501: 		     Tr(td(["Страничка клуба",
  502: 			    textfield(-name=>'URL',
  503: 				     -size=>60)])),
  504: 		     Tr(td(["Телефон клуба",
  505: 			    textfield(-name=>'Phone',
  506: 				     -size=>60)])),
  507: 		     Tr(td(["Факс клуба",
  508: 			    textfield(-name=>'Fax',
  509: 				     -size=>60)])),
  510: 		     Tr(td(["E-mail клуба",
  511: 			    textfield(-name=>'Email',
  512: 				     -size=>60)])),
  513: 		     );
  514:     $result .= h3("Руководство клуба");
  515:     $result .= p("Адреса и телефоны ниже будут опубликованы. Если Вы не хотите
  516: афишировать чьи-то адреса и телефоны, просто оставьте соответствующие поля
  517: пустыми");
  518:     $result .= "<ol>\n";
  519:     for(my $i=1;$i<=5;$i++) {
  520: 	$result .=li;
  521: 	$result .= table(
  522: 			 
  523: 			 Tr(td(["Должность",
  524: 				textfield(-name=>"Position$i",
  525: 					  -size=>50)])),
  526: 			 Tr(td(["ФИО",
  527: 				textfield(-name=>"Name$i",
  528: 					  -size=>50)])),
  529: 			 Tr(td(["Адрес",
  530: 				textarea(-name=>"Address$i",
  531: 					 -columns=>50,
  532: 					 -rows=>5)])),
  533: 			 Tr(td(["Телефон",
  534: 				textfield(-name=>"Phone$i",
  535: 					  -size=>50)])),
  536: 			 Tr(td(["Факс",
  537: 				textfield(-name=>"Fax$i",
  538: 					  -size=>50)])),
  539: 			 Tr(td(["Email",
  540: 				textfield(-name=>"Email$i",
  541: 					  -size=>50)])),
  542: 			 Tr(td(["Домашняя страничка",
  543: 				textfield(-name=>"URL$i",
  544: 					  -size=>50)])),
  545: 			 );
  546:     }
  547:     $result .= "</ol>\n";
  548:     $result .= h3("Ассоциации и объединения");
  549:     $result .= table(
  550: 		     Tr(td(["Ассоциации, членом котрых является клуб",
  551: 			    textarea(-name=>'Parents',
  552: 				     -rows=>5,
  553: 				     -columns=>60)])),
  554: 		     Tr(td(["Для ассоциаций: коллективные члены ассоциации",
  555: 			    textarea(-name=>'Members',
  556: 				     -rows=>5,
  557: 				     -columns=>60)])),
  558: 		     );
  559:     $result .= h3("Жизнь клуба");
  560:     $result .= table(
  561: 		     Tr(td(["История создания клуба",
  562: 			    textarea(-name=>'DoB',
  563: 				     -rows=>5,
  564: 				     -columns=>60)])),
  565: 		     Tr(td(["Основной спонсор клуба",
  566: 			    textarea(-name=>'Sponsor',
  567: 				     -rows=>5,
  568: 				     -columns=>60)])),
  569: 		     Tr(td(["Основные формы деятельности клуба",
  570: 			    textarea(-name=>'Meetings',
  571: 				     -rows=>5,
  572: 				     -columns=>60)])),
  573: 		     Tr(td(["Взрослые команды",
  574: 			    textarea(-name=>'AdultTeams',
  575: 				     -rows=>5,
  576: 				     -columns=>60)])),
  577: 		     Tr(td(["Детские команды",
  578: 			    textarea(-name=>'KidTeams',
  579: 				     -rows=>5,
  580: 				     -columns=>60)])),
  581: 		     Tr(td(["Иногородние фестивали, на которые ездят команды клуба",
  582: 			    textarea(-name=>'ForeignFests',
  583: 				     -rows=>5,
  584: 				     -columns=>60)])),
  585: 		     Tr(td(["Высшие достижения команд клуба",
  586: 			    textarea(-name=>'Braglist',
  587: 				     -rows=>5,
  588: 				     -columns=>60)])),
  589: 		     Tr(td(["Фестивали, которые организовывает клуб",
  590: 			    textarea(-name=>'OwnFests',
  591: 				     -rows=>5,
  592: 				     -columns=>60)])),
  593: 		     );
  594: 
  595:     $result .= h3("География клуба (для будущей карты)");
  596:     $result .= table(
  597: 		     Tr(td(["Долгота",
  598: 			    textfield(-name=>"Longitude",
  599: 				      -size=> 60)])),
  600: 		     Tr(td(["Широта",
  601: 			    textfield(-name=>"Latitude",
  602: 				      -size=> 60)])),
  603: 		     );
  604: 
  605:     $result .= h3("Дополнительные вопросы");
  606:     $result .= table(
  607: 
  608: 		     Tr(td(["Что вам больше всего нравится в журнале 'Игра'?",
  609: 			    textarea(-name=>'IgraA',
  610: 				     -rows=>5,
  611: 				     -columns=>60)])),
  612: 		     Tr(td(["Что вам больше всего не нравится в журнале 'Игра'?",
  613: 			    textarea(-name=>'IgraB',
  614: 				     -rows=>5,
  615: 				     -columns=>60)])),
  616: 		     Tr(td(["Что бы вы хотели увидеть в журнале 'Игра' - то 
  617: чего нет в настоящее время?",
  618: 			    textarea(-name=>'IgraC',
  619: 				     -rows=>5,
  620: 				     -columns=>60)])),
  621: 		     );
  622: 
  623:     $result .= p("Нажав кнопку 'Submit', Вы отправите Вашу регистрационную 
  624: карточку службе поддержки реестра. Пожалуйста, подождите несколько дней, пока
  625: Ваша информация будет обработана и попадёт в реестр");
  626:     $result .= submit(-name=>'Submit');
  627:     $result .= end_form;
  628:     return $result;
  629: }
  630: 
  631: ###################################################################
  632: # Sending the letter with results
  633: #####################################################################
  634: sub SendLetter {
  635:    open(MAIL,"| $SENDMAIL -t -n");
  636:     print MAIL <<END;
  637: To: $TO
  638: From: $FROM
  639: Subject: Registracionnaya kartochka kluba
  640: MIME-Version: 1.0
  641: Content-type: text/plain; charset=koi8-r
  642: 
  643: END
  644:     foreach my $key (param) {
  645: 	my $value = param($key);
  646: 	if ($value =~ /^\s*$/) {
  647: 	    next;
  648: 	}
  649: 	print MAIL "$key=$value\n\n";
  650:     }
  651: 	    
  652: 
  653:     close MAIL;
  654:     return p("Спасибо за регистрацию. Ваши данные приняты и после ".
  655: 	     "обработки будут внесены в базу данных");
  656: }
  657: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>