Гостевая книга с премодерацией
На форуме DevArt одному из участников потребовалась гостевая с премодерацией. Решено было на скорую руку добавить функционал к уже имеющейся гостевой книге от wr-script
Шаг 0
Скачиваем скрипт гостевой книги с сайта wr-script и устанавливаем согласно прилагаемой инструкции.
Шаг 1
Затем открываем index.php и добавляем новую ячейку, в которые будем записывать 0 или 1, аналог true или false, или проще говоря — разрешена или нет публикация сообщения. И так, ищем похожий код и заменяем:
$msg=str_replace("|","I",$msg);
$name=wordwrap($name,24,' ',1); // разрываем слишком длинные строки
$msg=wordwrap($msg,75,' ',1);
$today=mktime();
$moderat="0";
// производим запись данных в файл по шаблону: собщение|имя|емайл|дата|время|МКТАЙМ|МоРОдерство
$text="$msg|$name|$email|$date|$time|$today|$moderat|";
Здесь мы объявили переменную $moderat, которая по умолчанию будет равно 0, т.е. не проверенная модератором и добавили ее (переменную) в конец строки записи данных в файл.
Шаг 2
Ищем строчку:
if (strlen($dt[0])>5) { // Если строчка потерялась в скрипте (пустая строка) - то просто её НЕ выводим
И после нее вставляем:
if (($dt[6]) == 0) {$dt[0] = "Сообщение на проверке";} // Если понадобиться можно и др $dt заменить
Здесь мы делаем проверку при чтение сообщений из базы и, если мы видим, что сообщение не проверено, а говорит нам об этом новая ячейка, которая в данном скрипте обзывается $dt[6], то далее говорим скрипту, что бы он ячейке присвоил новое значение. В нашем случае ячейке $dt[0] текст «Сообщение на проверке». Таким образом человек разместивший сообщение, будет знать что его сообщение добавлено. Ну и просто лень было искать решение, хотя оно наверняка очень простое, «не вывода» сообщения вообще. Ну согласитесь, здесь лень оказалась весьма полезной. Ведь человек не увидит, что его сообщение попало в гостевую, может и еще раз попытаться разместить его, и не увидев его, может расстроиться, разреветься, впасть в истерику и больше ни когда не прийти на ваш сайт. А может оказаться настырным человеком и много много раз пытаться добавить сообщение. А еще с учетом встроенного антиспама в гостевую, еще хуже привести человека в недовольство вашим сайтом. Ну ладно, думаю, написанная тут графомания понятна.
Шаг 3
Переходим в admin.php. Добавляем блок который обрабатывает живодерство мородерство модерство тьфу блин на это слово, можно после блока удаления.
// Блок ОДОБРЕНИЯ выбранного сообщения
if (isset($_GET['on'])) { $page=$_GET['page'];
$file=file("guest.dat"); $itogo=count($file)-1;
if ($msginout==1) {$on=$itogo-$_GET['on'];} else {$on=$itogo-$_GET['on']+2;}
$dt=explode("|",$file[$on]);
$text="$dt[0]|$dt[1]|$dt[2]|$dt[3]|$dt[4]|$dt[5]|1|";
$fp=fopen("guest.dat","w");
ftruncate ($fp,0);//УДАЛЯЕМ СОДЕРЖИМОЕ ФАЙЛА
flock ($fp,LOCK_EX);
for ($i=0;$i< sizeof($file);$i++) { if ($i==$on) {unset($file[$i]);} }
fputs($fp, implode("",$file));
flock ($fp,LOCK_UN);
fclose($fp);
$fp=fopen("guest.dat","a+");
flock ($fp,LOCK_EX);
for ($i=0;$i< sizeof($file);$i++) { if ($i==$on) {unset($file[$i]);} }
fputs($fp,"$textrn");
fflush ($fp);//очищение файлового буфера
flock ($fp,LOCK_UN);
fclose($fp);
@chmod("guest.dat", 0644);
Header("Location: admin.php?page=$page"); exit; }
// Блок ОТКЛОНЕНИЯ выбранного сообщения
if (isset($_GET['off'])) { $page=$_GET['page'];
$file=file("guest.dat"); $itogo=count($file)-1;
if ($msginout==1) {$off=$itogo-$_GET['off'];} else {$off=$itogo-$_GET['off']+2;}
$dt=explode("|",$file[$off]);
$text="$dt[0]|$dt[1]|$dt[2]|$dt[3]|$dt[4]|$dt[5]|0|";
$fp=fopen("guest.dat","w");
ftruncate ($fp,0);//УДАЛЯЕМ СОДЕРЖИМОЕ ФАЙЛА
flock ($fp,LOCK_EX);
for ($i=0;$i< sizeof($file);$i++) { if ($i==$off) {unset($file[$i]);} }
fputs($fp, implode("",$file));
flock ($fp,LOCK_UN);
fclose($fp);
$fp=fopen("guest.dat","a+");
flock ($fp,LOCK_EX);
for ($i=0;$i< sizeof($file);$i++) { if ($i==$off) {unset($file[$i]);} }
fputs($fp,"$textrn");
fflush ($fp);//очищение файлового буфера
flock ($fp,LOCK_UN);
fclose($fp);
@chmod("guest.dat", 0644);
Header("Location: admin.php?page=$page"); exit; }
Хотелось бы обратить внимание, что тут дважды идет открытие файла и после второго открытия запись выполняется новой строкой, последней. Что не совсем правильно. Но сделано на скорую руку и при своевременном, или даже не очень, одобрение, если с наиболее поздней одобрять, происходит не заметно ни для кого.
Шаг 4
Также изменяем похожие строки в блоке «редактирования», эта строчка там два раза встречается, чтобы при редактирование сообщения не удалялось значение модерства.
$text="$msg|$name|$email|$fdate|$ftime|$moderat|";
Шаг 5
И меняем похожее, ближе к концу файла так же заменяем похожее.
print"
<TABLE width=780 align=center cellPadding=0 cellSpacing=0><TBODY>
<TR><TD width='1%'><IMG src='images/$skin/1.gif' width=14 height=12 border=0></TD><TD width='96%' background='images/$skin/2.gif'></TD><TD width='3%'><IMG src='images/$skin/3.gif' width=14 height=12 border=0></TD></TR>
<TR><TD background='images/$skin/4.gif'></TD>
<TD><B><a href='mailto:$dt[2]'>$dt[1]</a> ($dt[3] $dt[4])</B><BR>
<em>$dt[0]</em><BR>
<div align=right>
<table><TR><B><a href='admin.php?on=$num&page=$page'>.$dt[6].</a></B>";}
else {print " bgcolor='#00FF00'><B><a href='admin.php?off=$num&page=$page'>.$dt[6].</a></B>";}
print "</TD><TD> </TD>
<TD bgcolor=#22FF44><a href='admin.php?rd=$num&page=$page'>.P.</a></TD><TD> </TD>
<TD bgcolor=#FF2244><a href='admin.php?id=$num&page=$page'>.X.</a></B></TD><TD> $pnum</TD>
</TR></TABLE>
</div>
</TD>
<TD background='images/$skin/6.gif'> </TD>
</TR><TR><TD><IMG src='images/$skin/8.gif' width=14 height=12 border=0></TD><TD background='images/$skin/5.gif'></TD><TD><IMG src='images/$skin/9.gif' width=14 height=12 border=0></TD></TR>
</TBODY></TABLE>
";
Также можно добавить поле input с $dt[6] в редактирование. Где можно ручками ставить 0 или 1
Если возникнут какие-то вопросы или дополнения, вы можете их оставить в теме одного из форумов: На DevArt где эта тема поднималсь, или на форуме WR-SCRIPT где продублирована данная тема. комментариях, ибо темы на форумах ушли в небытие.