Annotation of register/prgsrc/register.cgi, revision 1.3
1.1 boris 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:
1.3 ! boris 23: $Date: 2001/09/04 19:33:18 $
1.1 boris 24:
25: =head1 REVISION
26:
1.3 ! boris 27: $Revision: 1.2 $
1.2 boris 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:
1.3 ! boris 47: my $date='$Date: 1999/06/25 23:00:36 $';
! 48: $date =~ s/[^ ]* ([^ ]*) .*/$1/;
! 49:
! 50:
1.2 boris 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();
1.3 ! boris 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:
1.2 boris 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:
1.3 ! boris 485:
1.2 boris 486: $result .= start_form;
1.3 ! boris 487:
! 488: $result .= h3("Контактная информация");
! 489: $result .= p("Адрес, телефон, email и т.д. ниже -- НЕ адреса руководства
! 490: клуба (их Вы введёте ниже),
! 491: а официальные адреса самого клуба. Если отдельного адреса,
! 492: телефона, и т.д. у клуба нет, просто оставьте
! 493: поля пустыми");
1.2 boris 494: $result .= table(Tr(td(["Название клуба",
495: textfield(-name=>'Name',
496: -size=>60)])),
1.3 ! boris 497: Tr(td(["Официальный адрес клуба",
1.2 boris 498: textarea(-name=>'Address',
499: -rows=>5,
500: -columns=>60)])),
1.3 ! boris 501: Tr(td(["Страничка клуба",
1.2 boris 502: textfield(-name=>'URL',
503: -size=>60)])),
1.3 ! boris 504: Tr(td(["Телефон клуба",
1.2 boris 505: textfield(-name=>'Phone',
506: -size=>60)])),
1.3 ! boris 507: Tr(td(["Факс клуба",
1.2 boris 508: textfield(-name=>'Fax',
509: -size=>60)])),
1.3 ! boris 510: Tr(td(["E-mail клуба",
1.2 boris 511: textfield(-name=>'Email',
512: -size=>60)])),
1.3 ! boris 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(
1.2 boris 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)])),
1.3 ! boris 558: );
! 559: $result .= h3("Жизнь клуба");
! 560: $result .= table(
1.2 boris 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)])),
1.3 ! boris 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,
1.2 boris 620: -columns=>60)])),
621: );
1.3 ! boris 622:
! 623: $result .= p("Нажав кнопку 'Submit', Вы отправите Вашу регистрационную
! 624: карточку службе поддержки реестра. Пожалуйста, подождите несколько дней, пока
! 625: Ваша информация будет обработана и попадёт в реестр");
1.2 boris 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 {
1.3 ! boris 635: open(MAIL,"| $SENDMAIL -t -n");
! 636: print MAIL <<END;
1.2 boris 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
1.3 ! boris 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:
1.2 boris 652:
1.3 ! boris 653: close MAIL;
1.2 boris 654: return p("Спасибо за регистрацию. Ваши данные приняты и после ".
1.3 ! boris 655: "обработки будут внесены в базу данных");
1.2 boris 656: }
1.1 boris 657:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>