+# Обработка операции создания новой темы.
+#
+
+sub new_topic {
+ my ($form,$cgi,$forum) = @_;
+ #
+ # Проверяем корректность urlname и прочих полей
+ #
+ my $urlname;
+ if (!$cgi->param("urlname")) {
+ $urlname = get_uid($forum);
+ } 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 $filename = "$path_translated/$urlname.html";
+ if (-f $filename) {
+ form_error($form,$cgi,$forum,"Тема с urlname $urlname уже
+ существует");
+ }
+ if (!$cgi->param("title")) {
+ form_error($form,$cgi,$forum,"Тема должна иметь непустое название");
+ }
+ #
+ # Создаем собственно тему
+ #
+ my $tree = gettemplate($forum,"topic",$cgi->path_info."/$urlname.html");
+ # Заполнить название и аннотацию
+ 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"=>"topic");
+ my $creation_time=strftime("%d.%m.%Y %H:%M",localtime());
+ if ($subtree) {
+ 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);
+ } else {
+ substinfo($tree,["class"=>"title"],
+ _content=>$cgi->param("title"));
+ }
+ # Скрыть список сообщений.
+ hide_list($tree,"messagelist");
+ savetree($filename,$tree,undef);
+ #
+ # Добавляем элемент в список тем текущего форума
+ #
+ $tree->destroy;
+
+ my $lockfd;
+ ($tree,$lockfd)=gettree($path_translated."/".$forum->{"indexfile"});
+ my $newtopic = newlistelement($tree,"topic","topiclist");
+ substinfo($newtopic,[_tag=>"a","class"=>"title"],
+ _content=>$cgi->param("title"), href=>"$urlname.html");
+ substinfo($newtopic,["class"=>"date"], _content=>$creation_time);
+ substinfo($newtopic,["class"=>"abstract"],_content=>$abstract);
+ substitute_user_info($newtopic,$forum);
+ $newtopic->attr("id",$urlname);
+ my $controlform = $newtopic->look_down(_tag=>"form",class=>"topicinfo");
+ if ($controlform) {
+ $controlform->attr("action"=>$cgi->url(-absolute=>1,-path_info=>1).
+ "/$urlname.html");
+ substinfo($controlform,[_tag=>"input",name=>"author"],value=>
+ $forum->{authenticated}{user});
+ }
+ savetree($path_translated."/".$forum->{"indexfile"},$tree,$lockfd);
+ record_statistics($forum,"topic");
+ forum_redirect($cgi,$forum,$cgi->path_info."/$urlname.html");
+}
+#----------------------------------------------------------
+# База пользователей и права доступа
+#----------------------------------------------------------
+#
+# Записывает в базу данных пользователей, сколько каких объектов
+# создал текущий пользователь
+#
+sub record_statistics {
+ my ($forum,$type) = @_;
+ my $user = $forum->{authenticated}{user};
+ my %base;
+ dbmopen %base,datafile($forum,"passwd"),0664;
+ my $userinfo = thaw($base{$user});
+ $userinfo->{$type."s"}++;
+ $userinfo->{"last_$type"}=time;
+ $base{$user} = freeze($userinfo);
+ dbmclose %base;
+}
+#