+
+sub new_forum {
+ my ($form,$cgi,$forum) = @_;
+ #
+ # Проверяем корректность urlname и прочих полей
+ #
+ my $urlname;
+ if (!$cgi->param("urlname")) {
+ form_error($form,$cgi,$forum,"Форуму необходимо задать непустое urlname");
+ }
+ if ($cgi->param("urlname") eq ".") {
+ $urlname = "."
+ } else {
+ $urlname=$1 if $cgi->param("urlname") =~ /^([-\w]+)$/ ;
+ form_error($form,$cgi,$forum,"Некорректные символы в urlname.
+ Допустимы только латинские буквы, цифры и минус") unless $urlname;
+ }
+ if (!-d $path_translated) {
+ show_error($forum,"Операция $form может быть вызвана только со
+ страницы форума");
+ }
+ my $newname = "$path_translated/$urlname";
+ $newname=$path_translated if ($urlname eq ".");
+ my $filename = "$newname/$forum->{indexfile}";
+ if (-f $filename) {
+ form_error($form,$cgi,$forum,"Форум $urlname уже существует");
+ }
+ if (!$cgi->param("title")) {
+ form_error($form,$cgi,$forum,"Форум должен иметь непустое название");
+ }
+ mkdir $newname unless -d $newname;
+ #
+ # Сохраняем логотип
+ #
+ my ($logo_name,$logo_width,$logo_height);
+ if ($cgi->param("logo")) {
+ my $userpath = $cgi->param("logo");
+ $logo_name="logo.".lc($1) if $userpath=~/\.([^.]+)$/;
+ my $in = $cgi->upload("logo");
+ if (!$in) {
+ show_error($forum,"Ошибка при загрузке картинки $userpath");
+ exit;
+ }
+ my $out;
+ open $out,">$newname/$logo_name";
+ binmode $out,":bytes";
+ local $/=undef;
+ my $data = <$in>;
+ print $out $data;
+ close $in;
+ close $out;
+ ($logo_width,$logo_height) = imgsize("$newname/$logo_name");
+ } else {
+ $logo_name = $forum->{"templatesurl"}."/1x1.gif";
+ $logo_width = 1;
+ $logo_height=1;
+ }
+
+
+ #
+ # Создаем собственно оглавление форума
+ #
+
+
+ my $tree = gettemplate($forum,"forum",$cgi->path_info."/$urlname");
+ # Заполнить название и аннотацию
+ my $abstract = input2tree($cgi,$forum,"abstract");
+ substinfo($tree,[_tag=>"meta","name"=>"description"],content=>$abstract->as_trimmed_text);
+ substinfo($tree,[_tag=>"title"],_content=>$cgi->param("title"));
+ my $subtree = $tree->look_down("class"=>"annotation")
+ or show_error($forum,"В шаблоне форума отсутствует класс annotation");
+ my $creation_time=strftime("%d.%m.%Y %H:%M",localtime());
+ substinfo($subtree,["class"=>"title"],
+ _content=>$cgi->param("title"));
+ substinfo($subtree,["class"=>"date"],
+ _content=>$creation_time);
+ # Вставляем в страницу КОПИЮ аннотации, поскольку аннотация
+ # нам еще понадобится в списке тем.
+ substinfo($subtree,["class"=>"abstract"],_content=>$abstract->clone);
+ substitute_user_info($subtree,$forum);
+ substinfo($subtree,[_tag=>"img","class"=>"logo"],
+ src=> $logo_name, width=>$logo_width, height=>$logo_height);
+ # Скрыть списки подфорумов и тем .
+ hide_list($tree,"forumlist");
+ hide_list($tree,"topiclist");
+ if ($urlname eq ".") {
+ for my $link_up ($tree->look_down(_tag=>"a",href=>"..")) {
+ $link_up->delete;
+ }
+ }
+ savetree($filename,$tree,undef);
+ $tree->destroy;
+ #
+ # Добавляем элемент в список тем текущего форума
+ #
+ if ($urlname ne ".") {
+ my $lockfd;
+ ($tree,$lockfd)=gettree($path_translated."/".$forum->{"indexfile"});
+ my $newforum = newlistelement($tree,"forum","forumlist");
+ substinfo($newforum,[_tag=>"a","class"=>"title"],
+ _content=>$cgi->param("title"), href=>"$urlname/");
+ substinfo($newforum,["class"=>"date"], _content=>$creation_time);
+ substinfo($newforum,["class"=>"abstract"],_content=>$abstract);
+ substinfo($newforum,[_tag=>"img","class"=>"logo"],src=>"$urlname/$logo_name",
+ width=>$logo_width,height=>$logo_height);
+ substitute_user_info($newforum,$forum);
+ $newforum->attr("id",$urlname);
+ my $controlform = $newforum->look_down(_tag=>"form",class=>"foruminfo");
+ if ($controlform) {
+ $controlform->attr("action"=>$cgi->url(-absolute=>1,-path_info=>1).
+ "/$urlname");
+ substinfo($controlform,[_tag=>"input",name=>"author"],value=>
+ $forum->{authenticated}{user});
+ }
+ savetree($path_translated."/".$forum->{"indexfile"},$tree,$lockfd);
+ record_statistics($forum,"forum");
+ }
+ forum_redirect($cgi,$forum,$cgi->path_info."/$urlname");
+}
+