вопроc про мод Check Before Posting

Автор sm84, 05 декабря 2012, 23:45:44

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

sm84

Товарищи гуры подскажите
Есть форум движок SMF 2.0.2

Есть мод Check Before Posting

В английской версии форума работает нормально в русской версии
Тоже работает вроде нормально, но показывает такое
----
Следующие ошибки возникли при попытке отправки сообщения:
Нельзя вставлять ссылки на %s
----
Т.е. в английском варианте %s заменяется на запрещенный хостинг...
Сначала думал что это ошибка в переводе, но сверил с Errors.english там тоже %s

Вопрос можно как-то исправить сие?

Vasias

Доброго времени суток!

Решил тут задать вопрос по этому моду, чтобы не плодить лишних тем. Данный мод парсит запрещенные слова в тегах: [url], [img]

обнаружил похожие строки на регулярки, но не силен в веб кодинге:
//CheckBeforePosting mod
function CheckForForbiddenElements($message){
global $context, $modSettings;

$errors['image'] = array();
$errors['link'] = array();

//check for forbidden images hosters
if ( isset($modSettings['enable_check_images']) && $modSettings['enable_check_images'] != '0' ){
$images_to_check = explode(',',$modSettings['images_to_check']);
//if images are not allowed
if ( $modSettings['enable_check_images'] == '2' )
{
foreach ( $images_to_check as $image ){
if ( preg_match('/((\[img\](.*?)'.$image.')|(\[img=(.*?)'.$image.'))/is',$message) ){
if ( !in_array($image,$errors['image']) ) array_push($errors['image'] , $image);
}
}
}
else if ( $modSettings['enable_check_images'] == '1' )
//if images are only those allowed
{
$images_found_in_list = false;
preg_match_all('/(\[img\](.+?)\[\/img\])/is',$message,$out);
$count=count($out[0]);
for($i=0;$i<$count;$i++)
{
foreach ( $images_to_check as $image ){
if ( preg_match('/((\[img\](.*?)'.$image.')|(\[img=(.*?)'.$image.'))/is',$out[0][$i]) ){
$images_found_in_list = true;
break;
}
}
}
if ( $count > 0 && $images_found_in_list == false ) $errors['only_allowed_image'] = true;
}
}

//check for forbidden websites
if ( !empty($modSettings['enable_check_links']) && $modSettings['enable_check_links'] != '0' ){
$links_to_check = explode(',',$modSettings['links_to_check']);
//if links are not allowed
if ( $modSettings['enable_check_links'] == '2' )
{
foreach ( $links_to_check as $link ){
if ( preg_match('#((\[url\](.*?).'.$link.')|(\[url\]'.$link.')|(\[url=(.*?).'.$link.')|(\[url='.$link.'))#Usi',$message) ){
if ( !in_array($link,$errors['link']) ) array_push($errors['link'] , $link);
}
}
}
else if ( $modSettings['enable_check_links'] == '1' )
//if links are only those allowed
{
$links_found_in_list = false;
preg_match_all('#((\[url\](.*)\[/url\])|(\[url=([^\]]*)\](.*)\[/url\]))#Usi',$message,$out);
$count=count($out[0]);
for($i=0;$i<$count;$i++)
{
foreach ( $links_to_check as $link ){
if ( preg_match('/((\[url\](.*).'.$link.')|(\[url\]'.$link.')|(\[url=(.*).'.$link.')|(\[url='.$link.'))/Usi',$out[0][$i]) ){
$links_found_in_list = true;
break;
}
}
}
if ( $count > 0 && $links_found_in_list == false ) $errors['only_allowed_link'] = true;
}
}
return $errors;
}


А нужно чтобы он парсил сообщение без тегов [url] и [img] и при обнаружении запрещенных слов блокировал постинг.  Может кто допиливал его.

p.s. Вообще есть стандартная функция "цензор", лучше бы ее допилить, чтобы там была возможность помимо автозамены запретного слова на выбранный вами текст еще и возможность выбора запрета на публикацию сообщения с запретным(и) словами

Vasias

#2
вообщем получилось реализовать работу мода, правда не совсем уверен что все сделал правильно, если что поправьте

в файле sourcedir/Subs.php в блоке контроля веб ссылок
ищем строку:

preg_match('#((\[url\](.*?).'.$link.')|(\[url\]'.$link.')|(\[url=(.*?).'.$link.')|(\[url='.$link.'))#Usi',$message) ){

и меняем её на:

if ( preg_match('#(('.$link.'))#Usi',$message) ){

теперь любое слово, ссылка введеная в админке будет проверяться в тексте публикуемого сообщения без тега [url].

p.s. тестовый форум ошибок не вываливал

Осталось побороть проблему, изложенную в 1 посте данной темы. Переменная %s в локализации русского языка UTF8 не отрабатывает, т.е. не выводит список хостов, слов, запрещенных к публикации. Пока даже не могу сообразить где копать.

Vasias

Так и не нашел причину, почему в стандартной локализации (eng) переменная %s работает, а в других (в моем случае) не отрабатывает. Сделал пока вывод запрещенных линков и слов рядом с сообщением об ошибке (только для проверки запрещенных ссылок и слов, другие полезности этого мода оказались мне пока не нужными):

1. в файле Themes\default\Post.template.php
найти:
// If an error occurred, explain what happened.
echo '
<div class="errorbox"', empty($context['post_error']['messages']) ? ' style="display: none"' : '', ' id="errors">
<dl>
<dt>
<strong style="', empty($context['error_type']) || $context['error_type'] != 'serious' ? 'display: none;' : '', '" id="error_serious">', $txt['error_while_submitting'], '</strong>
</dt>
<dt class="error" id="error_list">
', empty($context['post_error']['messages']) ? '' : implode('<br />', $context['post_error']['messages']), '
</dt>
</dl>

</div>';


ниже добавить:

echo '
<div> ', $txt['bad_words_links'] .$context['forbidden_link'],'</div>';


2. В файлах languagedir/Errors.LANG.php

удалить переменную %s из

$txt['error_forbidden_link'] = 'В тексте имеются запрещенные слова';
и добавить строчку для списка:
ru
$txt['bad_words_links'] = '<font color="#FF0000"><strong>Запрещенные слова:</strong></font> ';
eng
$txt['bad_words_links'] = '<font color="#FF0000"><strong>Forbidden words:</strong></font> ';

p.s. наверняка есть более простое решение этой проблемы, чем городить такие костыли, но я его пока не нашел.