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