Генератор вопросов и ответов для dle 10.x » Techno-Co — Всё для вебмастера, для создание сайтов с нуля. {title}

Как вы знаете в десятой версии DLE появился модуль Вопросы и ответы для защиты от спама. В котором вы создаете вопросы вручную, данный хак позволит генерировать вопросы и ответы автоматически нажав лишь на кнопку.Хак генерирует вопросы по принципу арифметических примеров:

Решите пример: 6 + 15 (ответ прописью)Решите пример: 6 + 15 (ответ числом)Решите пример: 13 — 3 (ответ прописью)

Решите пример: 13 — 3 (ответ числом)

Ответы автоматически генерируются в соответствии с вопросом , так если вопрос был Решите пример: 13 — 3 (ответ прописью) сгенированый ответ десять

Установка:

Файл engine/inc/question.phpПосле строки:

if( $member_id['user_group'] != 1 ) {
        msg( "error", $lang['addnews_denied'], $lang['db_denied'] );
}

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

/* генератор вопросов и ответов */
if ($_GET['action'] == "generate") {
if( $_REQUEST['user_hash'] == "" or $_REQUEST['user_hash'] != $dle_login_hash ) {die( "Hacking attempt! User not found" );}
for ($i = 0; $i < 40; $i++) {
$p = mt_rand(1, 15);
$m = mt_rand(1, 15);
if($p < $m) $example[] = array($p.' + '.$m ,$p+$m);
if($p > $m) $example[] = array($p.' - '.$m  ,$p-$m);
}
foreach($example as $key => $val){
$question[] = array('question' => 'Решите пример: '.$example[$key][0].' (ответ числом)','answer' => $example[$key][1]);
$question[] = array('question' => 'Решите пример: '.$example[$key][0].' (ответ прописью)','answer' => plural::asString($example[$key][1],plural::MALE));
}
foreach($question as $val){
$db->query( "INSERT INTO " . PREFIX . "_question (question, answer) VALUES ('{$val['question']}', '{$val['answer']}')" );
$db->query( "INSERT INTO " . USERPREFIX . "_admin_logs (name, date, ip, action, extras) values ('".$db->safesql($member_id['name'])."', '{$_TIME}', '{$_IP}', '84', '".htmlspecialchars($question, ENT_QUOTES, $config['charset'])."')" );
}
header( "Location: ?mod=question" ); die();
}

После строки: Вставить:


$(function(){
$('#btn-generate').click(function(){
document.location='?mod=question&user_hash={$dle_login_hash}&action=generate';
return false;
});});

Над закрывающим знаком:

?>

Вставить класс для перевода чисел в русские слова:

class Plural {
const MALE = 1;
const FEMALE = 2;
const NEUTRAL = 3;
protected static $_digits = array(
 self::MALE => array('ноль', 'один', 'два', 'три', 'четыре','пять', 'шесть', 'семь', 'восемь', 'девять'),
 self::FEMALE => array('ноль', 'одна', 'две', 'три', 'четыре','пять', 'шесть', 'семь', 'восемь', 'девять'),
 self::NEUTRAL => array('ноль', 'одно', 'два', 'три', 'четыре','пять', 'шесть', 'семь', 'восемь', 'девять')
 );
protected static $_ths = array( 0 => array('','',''), 1=> array('тысяча', 'тысячи', 'тысяч'), 2 => array('миллион', 'миллиона', 'миллионов'),
3 => array('миллиард','миллиарда','миллиардов'), 4 => array('триллион','триллиона','триллионов'), 5 => array('квадриллион','квадриллиона','квадриллионов'));
protected static $_ths_g = array(self::NEUTRAL, self::FEMALE, self::MALE, self::MALE, self::MALE, self::MALE); // hack 4 thsds
protected static $_teens = array( 0=>'десять', 1=>'одиннадцать', 2=>'двенадцать', 3=>'тринадцать', 4=>'четырнадцать', 5=>'пятнадцать', 6=>'шестнадцать', 7=>'семнадцать', 8=>'восемнадцать', 9=>'девятнадцать' );
protected static $_tens = array( 2=>'двадцать', 3=>'тридцать', 4=>'сорок', 5=>'пятьдесят', 6=>'шестьдесят', 7=>'семьдесят', 8=>'восемьдесят', 9=>'девяносто');
protected static $_hundreds = array( 1=>'сто', 2=>'двести',3=>'триста',4=>'четыреста', 5=>'пятьсот',6=>'шестьсот', 7=>'семьсот', 8=>'восемьсот', 9=>'девятьсот'
 );

 protected function _ending($value, array $endings = array()) {
$result = '';
if ($value < 2) $result = $endings[0];
 elseif ($value < 5) $result = $endings[1];
 else $result = $endings[2];
return $result; }

 protected function _triade($value, $mode = self::MALE, array $endings = array()) {
 $result = '';
 if ($value == 0) { return $result; }
 $triade = str_split(str_pad($value,3,'0',STR_PAD_LEFT));
 if ($triade[0]!=0) { $result.= (self::$_hundreds[$triade[0]].' '); }
 if ($triade[1]==1) { $result.= (self::$_teens[$triade[2]].' '); }
 elseif(($triade[1]!=0)) { $result.= (self::$_tens[$triade[1]].' '); }
 if (($triade[2]!=0)&&($triade[1]!=1)) { $result.= (self::$_digits[$mode][$triade[2]].' '); }
 if ($value!=0) { $ends = ($triade[1]==1?'1':'').$triade[2]; $result.= self::_ending($ends,$endings).' '; }
 return $result;
 }

 public function asString($value, $mode = self::MALE, array $endings = array()) {
 if (empty($endings)) { $endings = array('','',''); }
 $result = '';
 $steps = ceil(strlen($value)/3);
 $sv = str_pad($value, $steps*3, '0', STR_PAD_LEFT);
 for ($i=0; $i