Магазин
Правила Ответы на вопросы Конфиденциальность
Магазин
Правила Ответы на вопросы Конфиденциальность
  • Быстрые действия Ярлыки
    Общие действия
    Связаться с администрацией
    • Бот

       

Вопросы, ответы и примеры решений

  • Список форумов
  • Форумы по phpBB 3.0
  • Мод трекера ppkBB3cker
  • Вопросы, ответы и примеры решений

Насколько ресурсоемкий движок ppkBB3cker ?

Ваше мнение

26 сообщений
  • Пред.
  • 1
  • 2
  • 3
Просмотры: 1502 • 
  • atom_trek Сообщение 08.11.2010
    Нет пока не провал ,попробую вариант для яндекса , может подойдет , после отпишусь
atom_trek
  • atom_trek Сообщение 10.11.2010
    Почту настроил через smtp для яндекс-почты . Почтовые уведомление работают хорошо :)
    Но вот чего-то не отражаются сообщения в чате , когда нажимает на кнопку отправить . Стиль движка используется prosilver .
    В чем может быть причина ? :?
atom_trek
  • atom_trek Сообщение 13.11.2010
    Отчего может быть такая работа чата ?

    http://www.youtube.com/watch?v=Z2cwLi1F-UM
atom_trek
  • atom_trek Сообщение 24.11.2010
    Проблему с не появлением текста решена благодаря РРК :)
    Путем добавления части кода в message_user.php .
    Добавленный код выделен знаками равенства === :

    Код: Выделить всё

    <?php
    
    /**
    *
    * @package ppkBB3cker
    * @version $Id: message_user.php 1.000 2008-10-04 11:10:00 PPK $
    * @copyright (c) 2008 PPK
    * @license http://opensource.org/licenses/gpl-license.php GNU Public License
    *
    */
    
    error_reporting(E_ALL);
    
    $starttime = explode(' ', microtime());
    $starttime = $starttime[1] + $starttime[0];
    $startsqlcount=0;
    function_exists('date_default_timezone_set') ? date_default_timezone_set('Europe/Moscow') : '';
    
    define('IN_PHPBB', true);
    $phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './../';
    $phpEx = substr(strrchr(__FILE__, '.'), 1);
    
    require($phpbb_root_path.'config.'.$phpEx);
    
    if($dbms!='mysql')
    {
    	err('Only mysql supported');
    }
    
    $c=@mysql_connect($dbhost, $dbuser, $dbpasswd);
    if(!$c)
    {
    	err('Error connecting database: '.mysql_error());
    }
    
    $s=@mysql_select_db($dbname, $c);
    if(!$s)
    {
    	err('Error selecting database: '.mysql_error($c));
    }
    
    define('CONFIG_TABLE', $table_prefix . 'config');
    define('SMILIES_TABLE', $table_prefix . 'smilies');
    define('PPKCHAT_USERS_TABLE', $table_prefix . 'ppkchat_users');
    define('PPKCHAT_MESSAGES_TABLE', $table_prefix . 'ppkchat_messages');
    
    my_sql_query("SET NAMES 'utf8'");
    
    $config=array();
    $sql="SELECT config_name, config_value FROM ".CONFIG_TABLE." WHERE config_name IN ('smilies_path', 'script_path') OR config_name LIKE 'ppkbb\_chat%'";
    $result=my_sql_query($sql);
    while($row=mysql_fetch_row($result))
    {
    	$config[$row[0]]=$row[1];
    }
    mysql_free_result($result);
    
    $dt = time();
    $gmq_gpc = get_magic_quotes_gpc() ? 1 : 0;
    
    $forum_id=my_int_val(@$_GET['f']);
    $chat_message=$gmq_gpc ? @$_POST['message'] : mysql_real_escape_string(@$_POST['message'], $c);
    $del_message=my_int_val(@$_POST['del_mess']);
    $chat_key=$gmq_gpc ? @$_GET['chatkey'] : mysql_real_escape_string(@$_GET['chatkey'], $c);
    $lang='ru';
    
    $sql='SELECT * FROM ' .PPKCHAT_USERS_TABLE. "";
    $result=my_sql_query($sql);
    $users=$chat_user=array();
    while($row=mysql_fetch_array($result))
    {
    	if($row['room']==$forum_id)
    	{
    		if($row['chatkey']==$chat_key)
    		{
    			$chat_user=$row;
    		}
    		$users[]=$row;
    	}
    }
    mysql_free_result($result);
    
    $message_table=$user_table='';
    $timeout=0;
    intval($config['ppkbb_chat_murefresh']) > 9 ? '' : $config['ppkbb_chat_murefresh']=10;
    
    if(@$chat_user)
    {
    	list($lang, $rights)=explode('//', $chat_user['rights']);
    	!$lang ? $lang='ru' : '';
    	require_once("{$phpbb_root_path}language/$lang/mods/chat.$phpEx");
    	//0-$is_adm 1-$is_mod 2-$is_canaddchatm 3-$is_canviewchatu
    	//4-$is_canviewchatm 5-$is_candelchatm 6-$is_canskipchatktime
    	//7-$is_canhiddeninchat 8-$is_canviewhiddinchat 9-$is_cansendchatpm
    	//10-$is_canskipdisbutton 11-$is_canusesmilies 12-$is_canusebbcodes
    
    	$rights=explode(' ', $rights);
    	$user_color=$user_rights=array();
    
    	$skip_lacheck=0;
    
    	if($del_message)
    	{
    		if($rights[4] && $rights[5])//is_canviewchatm is_candelchatm
    		{
    			$sql='DELETE FROM ' .PPKCHAT_MESSAGES_TABLE. " WHERE id='$del_message' AND user_id={$chat_user['user_id']} LIMIT 1";
    			$result=my_sql_query($sql);
    		}
    	}
    	else
    	{
    		$lastpost=0;
    		if($chat_message)
    		{
    			if($rights[4] && $rights[2])//is_canviewchatm is_canaddchatm
    			{
    				if($config['ppkbb_chat_autokill_onpost'] && !$rights[10] && ($dt - $chat_user['lastpost']) < $config['ppkbb_chat_waittime'] - 1)
    				{
    					userkick(0);
    				}
    				else
    				{
    					$chat_message = str_replace('---', '- - -', $chat_message);
    					$chat_user['username'] = str_replace('---', '- - -', $chat_user['username']);
    					intval($config['ppkbb_chat_messlength']) ? '' : $config['ppkbb_chat_messlength']=255;
    					$mbstring=extension_loaded('mbstring') ? 1 : 0;
    					$chat_message_len=$mbstring ? mbstring_utf8_strlen($chat_message) : utf8_strlen($chat_message);
    
    					if($chat_message_len > $config['ppkbb_chat_messlength'])
    					{
    						$chat_message=$mbstring ? mbstring_utf8_substr($chat_message, 0, $config['ppkbb_chat_messlength']) : utf8_substr($chat_message, 0, $config['ppkbb_chat_messlength']);
    					}
    
    					$sql='INSERT INTO ' .PPKCHAT_MESSAGES_TABLE. " (message, user_id, to_user, date, rights, room, username, user_color) VALUES ('$chat_message', '{$chat_user['user_id']}', '0', '$dt', '{$chat_user['rights']}', '$forum_id', '{$chat_user['username']}', '{$chat_user['user_color']}')";
    					$result=my_sql_query($sql);
    
    					$lastpost=$dt;
    					$skip_lacheck=1;
    				}
    			}
    			else
    			{
    				userkick(1);
    			}
    		}
    
    		$sql='UPDATE ' .PPKCHAT_USERS_TABLE. ' SET lastaccess='.($lastpost ? 'lastaccess-'.$config['ppkbb_chat_murefresh'] : "'$dt'").($lastpost ? ", lastpost='$lastpost'" : '')." WHERE chatkey='{$chat_key}' AND room='{$forum_id}'";
    		$result=my_sql_query($sql);
    		if($rights[3])//is_canviewchatu
    		{
    			/*if($config['ppkbb_chat_autokill_onrefresh'] && !$skip_lacheck && ($dt - $chat_user['lastaccess']) < $config['ppkbb_chat_murefresh'] - 1)
    			{
    				userkick(2);
    			}
    			else
    			{*/
    				$config['script_path']=$config['script_path']!='/' ? $config['script_path'].'/' : '/';
    				foreach($users as $v)
    				{
    					$lcr=explode('//', $v['rights']);
    					$user_rights[$v['user_id']]=explode(' ', $lcr[1]);
    
    					$user_color[$v['user_id']]=$v['user_color'];
    
    					if($user_rights[$v['user_id']][7] && !$rights[8])//is_canhiddeninchat is_canviewhiddinchat
    					{
    
    					}
    					else
    					{
    						$v['username']=stripslashes($v['username']);
    						$v['username'] = str_replace('---', '&minus;&minus;&minus;', $v['username']);
    						$user_table.= '
    						<div><a target="new" href="'.$config['script_path'].'memberlist.'.$phpEx.'?mode=viewprofile&u='.$v['user_id'].'">&bull;</a>&nbsp;<a style="font-weight:bold;'.($v['user_color'] ? 'color:#'.$v['user_color'] : '').';" href="javascriptvoid(0);" onClick="javascriptinserttext(\''.$v['username'].': \')">'.($user_rights[$v['user_id']][7] && $rights[8] ? '<i>'.$v['username'].'</i>' : $v['username']).'</a></div>';
    					}
    				}
    			//}
    		}
    		else
    		{
    			$user_table= '<div><span class="textuser">'.$lang['CHAT_CANT_VIEWCHATU'].'</span></div>';
    		}
    		if($rights[4])//is_canviewchatm
    		{
    			/*if($config['ppkbb_chat_autokill_onrefresh'] && !$skip_lacheck && ($dt - $chat_user['lastaccess']) < $config['ppkbb_chat_murefresh'] - 1)
    			{
    				userkick(3);
    			}
    			else
    			{*/
    				$smiles=get_chat_smilies();
    				intval($config['ppkbb_chat_messdisplay']) ? '' : $config['ppkbb_chat_messdisplay']=25;
    				$sql='SELECT * FROM ' .PPKCHAT_MESSAGES_TABLE. " WHERE room='$forum_id' ORDER BY id DESC LIMIT {$config['ppkbb_chat_messdisplay']}";
    				$result=my_sql_query($sql);
    
    				$last_mess_id=0;
    				while($row=mysql_fetch_array($result))
    				{
    					if(@!$user_rights[$row['user_id']])
    					{
    						$lcr=explode('//', $row['rights']);
    						@$user_rights[$row['user_id']]=explode(' ', $lcr[1]);
    					}
    
    					$row['message']=htmlspecialchars(stripslashes($row['message']));
    					//$row['message']=wordwrap($row['message'], 32, '<wbr>', 1);
    					$row['message'] = str_replace('---', '&minus;&minus;&minus;', $row['message']);
    
    					if($config['ppkbb_chat_timecorrect'])
    					{
    						if(strpos($config['ppkbb_chat_timecorrect'], '-')===true)
    						{
    							$row['date']=$row['date'] - intval($config['ppkbb_chat_timecorrect']);
    						}
    						else
    						{
    							$row['date']=$row['date'] + intval($config['ppkbb_chat_timecorrect']);
    						}
    					}
    					if(@$user_rights[$row['user_id']][11] && $rights[11])
    					{
    						$row['message']=chat_smilies($row['message'], $smiles['match'], $smiles['replace'], $config['ppkbb_chat_maxsmiles']);
    					}
    
    					$message_table.= '
    					<div style="width:100%;" id="p'.$row['id'].'">'.date('H:i:s', $row['date']).' <b style="'.(@$user_color[$row['user_id']] ? 'color:#'.$user_color[$row['user_id']] : '').';">'.$row['username'].'</b> '.(@$rights[5] && $row['user_id']==$chat_user['user_id'] ? '<a href="javascriptvoid('.$row['id'].')" title="'.$lang['CHAT_DELMESS'].'" onclick="delete_post(\''.$row['id'].'\')">[x]</a> ' : '').$row['message'].'</div>';
    
    					$last_mess_id=$row['id'];
    				}
    				mysql_free_result($result);
    
    				$config['ppkbb_chat_marchive'] ? $config['ppkbb_chat_messdisplay']+=$config['ppkbb_chat_marchive'] : '';
    				if( ($dt - $config['ppkbb_chat_last_cleanup']) > $config['ppkbb_chat_cleanup_interval'] && ($last_mess_id - $config['ppkbb_chat_messdisplay']) > 0)
    				{
    					$sql='DELETE FROM ' .PPKCHAT_MESSAGES_TABLE. " WHERE room='$forum_id' AND id < '$last_mess_id'";
    					$result=my_sql_query($sql);
    
    					$sql='UPDATE ' .CONFIG_TABLE. " SET config_value='$dt' WHERE config_name='ppkbb_chat_last_cleanup'";
    					$result=my_sql_query($sql);
    				}
    			//}
    		}
    		else
    		{
    			$message_table= '<div><span class="textmess">'.$lang['CHAT_CANT_VIEWCHATM'].'</span></div>';
    		}
    	}
    	if(!$rights[6] && $dt - @$chat_user['lastpost'] > $config['ppkbb_chat_killtime'])
    	{
    		userkick(4);
    	}
    }
    else
    {
    	require_once("{$phpbb_root_path}language/$lang/mods/chat.$phpEx");
    	$config['ppkbb_chat_murefresh']=3600;
    	$user_table= '';
    
    	$message_table= '<table width="100%" cellpadding="0" cellspacing="1" border="0">';
    	$message_table.= '
    		<tr valign="top">
    			<td>
    				<span class="textmess">'.$lang['CHAT_LOGIN'].'</span>
    			</td>
    		</tr>';
    	$message_table.= '</table>';
    }
    
    echo "$message_table---1---$user_table---3---".($config['ppkbb_chat_murefresh']*1000)."---$timeout";
    if($c)
    {
    	mysql_close($c);
    }
    
    $mtime = explode(' ', microtime());
    $totaltime = $mtime[0] + $mtime[1] - $starttime;
    
    exit();
    
    //############################################################
    
    function get_chat_smilies()
    {
    	global $config;
    	static $match;
    	static $replace;
    
    	// See if the static arrays have already been filled on an earlier invocation
    	if (!is_array($match))
    	{
    		$match = $replace = array();
    		$smiles=array();
    
    		$sql = 'SELECT *
    			FROM ' . SMILIES_TABLE . '
    			ORDER BY LENGTH(code) DESC';
    
    		$result = my_sql_query($sql);
    
    		while($row=mysql_fetch_array($result))
    		{
    			if (empty($row['code']))
    			{
    				continue;
    			}
    
    			// (assertion)
    			$smiles['match'][] = '(?<=^|[\n .])' . preg_quote($row['code'], '#') . '(?![^<>]*>)';
    			$smiles['replace'][] = '<img src="./'.$config['smilies_path'].'/' . $row['smiley_url'] . '" alt="' . $row['code'] . '" title="' . $row['emotion'] . '" />';
    		}
    		mysql_free_result($result);
    	}
    
    	return $smiles;
    }
    
    function chat_smilies($text, $match, $replace, $max_smilies = 0)
    {
    	if (sizeof($match))
    	{
    		if ($max_smilies)
    		{
    			$num_matches = preg_match_all('#' . implode('|', $match) . '#', $text, $matches);
    			unset($matches);
    
    			if ($num_matches !== false && $num_matches > $max_smilies)
    			{
    				return $text;
    			}
    		}
    
    		// Make sure the delimiter # is added in front and at the end of every element within $match
    		$text = trim(preg_replace(explode(chr(0), '#' . implode('#' . chr(0) . '#', $match) . '#'), $replace, $text));
    	}
    
    	return $text;
    }
    
    function my_sql_query($query)
    {
    	global $startsqlcount, $c;
    
    	$startsqlcount+=1;
    
    	$result=@mysql_query($query, $c);
    
    	if(!$result)
    	{
    		err('Unknown Error');
    	}
    
    	return $result;
    }
    
    //From includes/utf/utf_tools.php
    function mbstring_utf8_substr($str, $offset, $length = null)
    {
    	if (is_null($length))
    	{
    		return mb_substr($str, $offset);
    	}
    	else
    	{
    		return mb_substr($str, $offset, $length);
    	}
    }
    
    //From includes/utf/utf_tools.php
    function mbstring_utf8_strlen($text)
    {
    	return mb_strlen($text, 'utf-8');
    }
    
    //From includes/utf/utf_tools.php
    function utf8_substr($str, $offset, $length = NULL)
    {
    	// generates E_NOTICE
    	// for PHP4 objects, but not PHP5 objects
    	$str = (string) $str;
    	$offset = (int) $offset;
    	if (!is_null($length))
    	{
    		$length = (int) $length;
    	}
    
    	// handle trivial cases
    	if ($length === 0 || ($offset < 0 && $length < 0 && $length < $offset))
    	{
    		return '';
    	}
    
    	// normalise negative offsets (we could use a tail
    	// anchored pattern, but they are horribly slow!)
    	if ($offset < 0)
    	{
    		// see notes
    		$strlen = utf8_strlen($str);
    		$offset = $strlen + $offset;
    		if ($offset < 0)
    		{
    			$offset = 0;
    		}
    	}
    
    	$op = '';
    	$lp = '';
    
    	// establish a pattern for offset, a
    	// non-captured group equal in length to offset
    	if ($offset > 0)
    	{
    		$ox = (int) ($offset / 65535);
    		$oy = $offset % 65535;
    
    		if ($ox)
    		{
    			$op = '(?:.{65535}){' . $ox . '}';
    		}
    
    		$op = '^(?:' . $op . '.{' . $oy . '})';
    	}
    	else
    	{
    		// offset == 0; just anchor the pattern
    		$op = '^';
    	}
    
    	// establish a pattern for length
    	if (is_null($length))
    	{
    		// the rest of the string
    		$lp = '(.*)$';
    	}
    	else
    	{
    		if (!isset($strlen))
    		{
    			// see notes
    			$strlen = utf8_strlen($str);
    		}
    
    		// another trivial case
    		if ($offset > $strlen)
    		{
    			return '';
    		}
    
    		if ($length > 0)
    		{
    			// reduce any length that would
    			// go passed the end of the string
    			$length = min($strlen - $offset, $length);
    
    			$lx = (int) ($length / 65535);
    			$ly = $length % 65535;
    
    			// negative length requires a captured group
    			// of length characters
    			if ($lx)
    			{
    				$lp = '(?:.{65535}){' . $lx . '}';
    			}
    			$lp = '(' . $lp . '.{'. $ly . '})';
    		}
    		else if ($length < 0)
    		{
    			if ($length < ($offset - $strlen))
    			{
    				return '';
    			}
    
    			$lx = (int)((-$length) / 65535);
    			$ly = (-$length) % 65535;
    
    			// negative length requires ... capture everything
    			// except a group of  -length characters
    			// anchored at the tail-end of the string
    			if ($lx)
    			{
    				$lp = '(?:.{65535}){' . $lx . '}';
    			}
    			$lp = '(.*)(?:' . $lp . '.{' . $ly . '})$';
    		}
    	}
    
    	if (!preg_match('#' . $op . $lp . '#us', $str, $match))
    	{
    		return '';
    	}
    
    	return $match[1];
    }
    
    //From includes/utf/utf_tools.php
    function utf8_strlen($text)
    {
    	// Since utf8_decode is replacing multibyte characters to ? strlen works fine
    	return strlen(utf8_decode($text));
    }
    ================================================================================
    /**
    * Implementation of PHP's native utf8_decode for people without XML support
    *
    * @param string $str UTF-8 encoded data
    * @return string ISO-8859-1 encoded data
    */
    function utf8_decode($str)
    {
    	$pos = 0;
    	$len = strlen($str);
    	$ret = '';
    
    	while ($pos < $len)
    	{
    		$ord = ord($str[$pos]) & 0xF0;
    		if ($ord === 0xC0 || $ord === 0xD0)
    		{
    			$charval = ((ord($str[$pos]) & 0x1F) << 6) | (ord($str[$pos + 1]) & 0x3F);
    			$pos += 2;
    			$ret .= (($charval < 256) ? chr($charval) : '?');
    		}
    		else if ($ord === 0xE0)
    		{
    			$ret .= '?';
    			$pos += 3;
    		}
    		else if ($ord === 0xF0)
    		{
    			$ret .= '?';
    			$pos += 4;
    		}
    		else
    		{
    			$ret .= $str[$pos];
    			++$pos;
    		}
    	}
    	return $ret;
    }
    
    function err($str)
    {
    	global $c;
    
    	echo $str;
    	if($c)
    	{
    		mysql_close($c);
    	}
    	exit();
    }
    ==================================================================================
    function userkick($n=0)
    {
    	global $lang;
    
    	$message_table='['.intval($n).'] '.$lang['CHAT_LA_CHECK'];
    	$user_table='';
    
    	err("$message_table---1---$user_table---3---3600000---1");
    }
    
    function my_int_val($v=0)
    {
    	if(!$v || $v < 0)
    	{
    		return 0;
    	}
    
    	return @number_format($v+0, 0, '', '');
    }
    ?>
    
    P.S
    Данное решение применительно для тех кто использует PHP + FastCGI и Inginx .

    Но появилась другая загвоздка :(
    У какого-нибудь были проблемы с очисткой сообщении в чате ? У меня почему-то не удаляются сообщения из чата в указанное время .
    В чем может быть причина ? Я думаю что это может быть связано с несовпадения с записями о таблиц в этом файле и записями таблиц в базе .
    Пробовал изменять в message_user.php :

    Код: Выделить всё

    define('CONFIG_TABLE', $table_prefix . 'config');
    define('SMILIES_TABLE', $table_prefix . 'smilies');
    define('PPKCHAT_USERS_TABLE', $table_prefix . 'ppkchat_users');
    define('PPKCHAT_MESSAGES_TABLE', $table_prefix . 'ppkchat_messages');
    в соответствии с префиксом и записями в таблицах на

    Код: Выделить всё

    define('CONFIG_TABLE', $table_prefix . 'users_config');
    define('SMILIES_TABLE', $table_prefix . 'users_smilies');
    define('PPKCHAT_USERS_TABLE', $table_prefix . 'users_ppkchat_users');
    define('PPKCHAT_MESSAGES_TABLE', $table_prefix . 'users_ppkchat_messages');
    
    Получилось :
    http://www.youtube.com/watch?v=3V8tm0gvajY

    Для решения данной проблемы , уважаемый РРК , предложил это :

    В /chat/message_user.php заменить

    Код: Выделить всё

            $config['ppkbb_chat_marchive'] ? $config['ppkbb_chat_messdisplay']+=$config['ppkbb_chat_marchive'] : '';
    на

    Код: Выделить всё

            //$config['ppkbb_chat_marchive'] ? $config['ppkbb_chat_messdisplay']+=$config['ppkbb_chat_marchive'] : '';
    Но к сожалению, это не помогло. Проблема осталась .

    Буду очень признателен если вы мне поможете разобраться с этой проблемой.
atom_trek
  • atom_trek Сообщение 24.11.2010
    atom_trek писал(а):P.S
    Данное решение применительно для тех кто использует PHP + FastCGI и Inginx .
    Опечатался я в слове Inginx , правильно Nginx :)
atom_trek
  • atom_trek Сообщение 24.11.2010
    atom_trek писал(а): У меня почему-то не удаляются сообщения из чата в указанное время .
    Еще одна опечатка в указанное время , имеется ввиду не время, а интервал :oops:
atom_trek
26 сообщений
  • Пред.
  • 1
  • 2
  • 3

Вернуться в «Вопросы, ответы и примеры решений»

Time: 0.000s | Queries: 0 | Peak Memory Usage: 0.00 МБ | GZIP: Unknown | SQL Explain
  • Список форумов
2018, made with by ThemeKita Создано на основе phpBB® Forum Software © phpBB Limited Русская поддержка phpBB (C) 2009-2026 @ PPK
  • Часовой пояс: UTC+04:00
Участники темы
Список форумов Участники темы
Перейти
Сайт ↳   Новости по сайту ↳   Новости обновлений ↳   Вопросы по сайту ↳   Non-russian speakers forum Форумы по phpBB 3.1-3.3 ↳   Расширения для phpBB 3.1-3.3 ↳   Бета-версии и расширения в разработке ↳   База расширений ↳   Поиск и запросы расширений ↳   Расширения для phpBB 3.1-3.3 для донаторов ↳   Условно-бесплатные расширения ↳   Платные расширения ↳   Расширения для подписчиков ↳   Запросы расширений, функционала и переводов для подписчиков ↳   Переводы расширений для phpBB3.1-3.3 ↳   Стили для phpBB 3.1-3.3 ↳   Вопросы по phpBB 3.1-3.3 Форумы по phpBB 3.0 ↳   Мод трекера ppkBB3cker ↳   Новости по трекеру и обновлениям ↳   Ошибки, проблемы, недочёты ↳   Предложения по новым функциям и возможностям ↳   Вопросы, ответы и примеры решений ↳   Моды и стили для трекера ↳   Готовые стили для трекера ↳   Запросы стилей для трекера ↳   Стили в разработке ↳   Готовые моды для трекера ↳   Запросы модов для трекера ↳   Моды в разработке ↳   Остальное ↳   Часто задаваемые вопросы ↳   Ваши трекеры ↳   Мод трекера xbtBB3cker ↳   Новости по трекеру и обновлениям ↳   Вопросы, ответы, ошибки и обсуждение ↳   Другие моды для phpBB 3.0 ↳   Минимоды и хаки для phpBB3 ↳   phpBB 3.0 ppkBB3cker Edition ↳   Платные услуги, моды, стили для phpBB 3.0 ↳   BB2Spoiler/BB3Spoiler ↳   BB3Topics ↳   BB3Sape ↳   BB3UserAgentInfo ↳   Вопросы по phpBB 3.0 ↳   Вне тематики форума