Мои наработки в плане создания ЧПУ

Форум для авторов модов для phpBB 2.0.x. Здесь можно попросить помощи в разработке у коллег.

Мои наработки в плане создания ЧПУ

Сообщение ra 20.06.2005 23:03

Три дня потратил на идею и реализацию.

Во первых, без знаний php+mysql в эту тему лезть не надо было.
Во вторых. то, что вы увидите ниже это всего лишь наработки, а не полноценная реализация. Они создавались с одной целью, посмотреть смогу ли я реализовать эту довольно не простую функцию.
В третьих. Для полноценной реализации ЧПУ код должен дороьатывать конечный пользователь.
В последних. Стабильная работа мода не гарантируеться, и он нуждаеться в доработке.

MySQL:
Код: Выделить всё
CREATE TABLE phpbb_humanoid_topics
(
topic_id SMALLINT(8),
topic_humanoid_name VARCHAR(150),
topic_is_current_name TINYINT(1),
humanoid_name_used_count SMALLINT(5)
);


.htaccess:
Код: Выделить всё
RewriteEngine on

RewriteRule topics-(.*).html viewtopic.php\?name=$1


Мод:
Код: Выделить всё
#
#-----[ OPEN ]------------------------------------------
#

posting.php

#
#-----[ FIND ]------------------------------------------
#

         $subject = ( !empty($HTTP_POST_VARS['subject']) ) ? trim($HTTP_POST_VARS['subject']) : '';

#
#-----[ AFTER, ADD ]------------------------------------------
#

         $subject_hum = str_to_humans($subject);

#
#-----[ FIND ]------------------------------------------
#

            submit_post($mode, $post_data, $return_message, $return_meta, $forum_id, $topic_id, $post_id, $poll_id, $topic_type, $bbcode_on, $html_on, $smilies_on, $attach_sig, $bbcode_uid, str_replace("\'", "''", $username), str_replace("\'", "''", $subject), str_replace("\'", "''", $message), str_replace("\'", "''", $poll_title), $poll_options, $poll_length);

#
#-----[ IN-LINE, FIND ]------------------------------------------
#

str_replace("\'", "''", $subject)

#
#-----[ IN-LINE, AFTER ADD ]------------------------------------------
#

, $subject_hum

#
#-----[ OPEN ]------------------------------------------
#

viewforum.php

#
#-----[ FIND ]------------------------------------------
#

//
// All announcement data, this keeps announcements
// on each viewforum page ...
//
$sql = "SELECT t.*, u.username, u.user_id, u2.username as user2, u2.user_id as id2, p.post_time, p.post_username
   FROM " . TOPICS_TABLE . " t, " . USERS_TABLE . " u, " . POSTS_TABLE . " p, " . USERS_TABLE . " u2
   WHERE t.forum_id = $forum_id
      AND t.topic_poster = u.user_id
      AND p.post_id = t.topic_last_post_id
      AND p.poster_id = u2.user_id
      AND t.topic_type = " . POST_ANNOUNCE . "
   ORDER BY t.topic_last_post_id DESC ";

#
#-----[ REPLACE WITH ]------------------------------------------
#

//
// All announcement data, this keeps announcements
// on each viewforum page ...
//
$sql = "SELECT t.*, h.topic_humanoid_name, h.humanoid_name_used_count, u.username, u.user_id, u2.username as user2, u2.user_id as id2, p.post_time, p.post_username
   FROM " . TOPICS_TABLE . " t, phpbb_humanoid_topics h, " . USERS_TABLE . " u, " . POSTS_TABLE . " p, " . USERS_TABLE . " u2
   WHERE t.forum_id = $forum_id
      AND h.topic_id = t.topic_id
      AND h.topic_is_current_name = 1
      AND t.topic_poster = u.user_id
      AND p.post_id = t.topic_last_post_id
      AND p.poster_id = u2.user_id
      AND t.topic_type = " . POST_ANNOUNCE . "

#
#-----[ FIND ]------------------------------------------
#

//
// Grab all the basic data (all topics except announcements)
// for this forum
//
$sql = "SELECT t.*, u.username, u.user_id, u2.username as user2, u2.user_id as id2, p.post_username, p2.post_username AS post_username2, p2.post_time
   FROM " . TOPICS_TABLE . " t, " . USERS_TABLE . " u, " . POSTS_TABLE . " p, " . POSTS_TABLE . " p2, " . USERS_TABLE . " u2
   WHERE t.forum_id = $forum_id
      AND t.topic_poster = u.user_id
      AND p.post_id = t.topic_first_post_id
      AND p2.post_id = t.topic_last_post_id
      AND u2.user_id = p2.poster_id
      AND t.topic_type <> " . POST_ANNOUNCE . "
      $limit_topics_time
   ORDER BY t.topic_type DESC, t.topic_last_post_id DESC, t.topic_last_post_id DESC
   LIMIT $start, ".$board_config['topics_per_page'];
#
#-----[ REPLACE WITH ]------------------------------------------
#

//
// Grab all the basic data (all topics except announcements)
// for this forum
//
$sql = "SELECT t.*, h.topic_humanoid_name, h.humanoid_name_used_count, u.username, u.user_id, u2.username as user2, u2.user_id as id2, p.post_username, p2.post_username AS post_username2, p2.post_time
   FROM " . TOPICS_TABLE . " t, phpbb_humanoid_topics h, " . USERS_TABLE . " u, " . POSTS_TABLE . " p, " . POSTS_TABLE . " p2, " . USERS_TABLE . " u2
   WHERE t.forum_id = $forum_id
      AND h.topic_id = t.topic_id
      AND h.topic_is_current_name = 1
      AND t.topic_poster = u.user_id
      AND p.post_id = t.topic_first_post_id
      AND p2.post_id = t.topic_last_post_id
      AND u2.user_id = p2.poster_id
      AND t.topic_type <> " . POST_ANNOUNCE . "
      $limit_topics_time
   ORDER BY t.topic_type DESC, t.topic_last_post_id DESC
   LIMIT $start, ".$board_config['topics_per_page'];

#
#-----[ FIND ]------------------------------------------
#

      $topic_id = $topic_rowset[$i]['topic_id'];

#
#-----[ AFTER, ADD ]------------------------------------------
#

      $topic_name = ( $topic_rowset[$i]['humanoid_name_used_count'] ) ? ($topic_rowset[$i]['topic_humanoid_name'] . '-' . $topic_rowset[$i]['humanoid_name_used_count']) : $topic_rowset[$i]['topic_humanoid_name'];

#
#-----[ FIND ]------------------------------------------
#

                     $newest_post_img = '<a href="' . append_sid("viewtopic.$phpEx?" . POST_TOPIC_URL . "=$topic_id&amp;view=newest") . '"><img src="' . $images['icon_newest_reply'] . '" alt="' . $lang['View_newest_post'] . '" title="' . $lang['View_newest_post'] . '" border="0" /></a> ';

#
#-----[ REPLACE WITH ]------------------------------------------
#

                     $newest_post_img = '<a href="' . append_sid("viewtopic.$phpEx?name=$topic_name&amp;view=newest") . '"><img src="' . $images['icon_newest_reply'] . '" alt="' . $lang['View_newest_post'] . '" title="' . $lang['View_newest_post'] . '" border="0" /></a> ';

#
#-----[ FIND ]------------------------------------------
#

                  $newest_post_img = '<a href="' . append_sid("viewtopic.$phpEx?" . POST_TOPIC_URL . "=$topic_id&amp;view=newest") . '"><img src="' . $images['icon_newest_reply'] . '" alt="' . $lang['View_newest_post'] . '" title="' . $lang['View_newest_post'] . '" border="0" /></a> ';

#
#-----[ REPLACE WITH ]------------------------------------------
#

                  $newest_post_img = '<a href="' . append_sid("viewtopic.$phpEx?name=$topic_name&amp;view=newest") . '"><img src="' . $images['icon_newest_reply'] . '" alt="' . $lang['View_newest_post'] . '" title="' . $lang['View_newest_post'] . '" border="0" /></a> ';

#
#-----[ FIND ]------------------------------------------
#

            $goto_page .= '<a href="' . append_sid("viewtopic.$phpEx?" . POST_TOPIC_URL . "=" . $topic_id . "&amp;start=$j") . '">' . $times . '</a>';

#
#-----[ REPLACE WITH ]------------------------------------------
#

            $goto_page .= '<a href="' . append_sid("viewtopic.$phpEx?name=$topic_name&amp;start=$j") . '">' . $times . '</a>';

#
#-----[ FIND ]------------------------------------------
#

      $view_topic_url = append_sid("viewtopic.$phpEx?" . POST_TOPIC_URL . "=$topic_id");

#
#-----[ REPLACE WITH ]------------------------------------------
#

      $view_topic_url = append_sid("viewtopic.$phpEx?name=$topic_name");

#
#-----[ OPEN ]------------------------------------------
#

viewtopic.php

#
#-----[ FIND ]------------------------------------------
#

if ( isset($HTTP_GET_VARS[POST_POST_URL]))
{
   $post_id = intval($HTTP_GET_VARS[POST_POST_URL]);
}

#
#-----[ AFTER, ADD ]------------------------------------------
#

if ( isset($HTTP_GET_VARS['name']) )
{
   $topic_name = strtolower($HTTP_GET_VARS['name']);
   $count = intval(substr(strrchr($topic_name, '-'), 1));
   $topic_name = ( $pos = strrpos($topic_name, '-') ) ? substr($topic_name, 0, $pos) : $topic_name;

   $sql = "SELECT topic_id from phpbb_humanoid_topics " .
         "WHERE topic_humanoid_name = '$topic_name' AND humanoid_name_used_count = $count";
   if ( !($result = $db->sql_query($sql)) )
   {
      message_die(GENERAL_ERROR, 'Could not obtain humanoid information', '', __LINE__, __FILE__, $sql);
   }

   if ( $row = $db->sql_fetchrow($result) )
   {
      $topic_id = $row['topic_id'];
   }
}
else
{
   $topic_name = '';
   $count = 0;
}

#
#-----[ FIND ]------------------------------------------
#

if ( !isset($topic_id) && !isset($post_id) )

#
#-----[ REPLACE WITH ]------------------------------------------
#

if ( !isset($topic_name) && !isset($topic_id) && !isset($post_id) )

#
#-----[ OPEN ]------------------------------------------
#

/includes/functions_post.php

#
#-----[ FIND ]------------------------------------------
#

function submit_post($mode, &$post_data, &$message, &$meta, &$forum_id, &$topic_id, &$post_id, &$poll_id, &$topic_type, &$bbcode_on, &$html_on, &$smilies_on, &$attach_sig, &$bbcode_uid, &$post_username, &$post_subject, &$post_message, &$poll_title, &$poll_options, &$poll_length)

#
#-----[ IN-LINE, FIND ]------------------------------------------
#

&$post_subject

#
#-----[ IN-LINE, AFTER ADD ]------------------------------------------
#

, &$human_subj

#
#-----[ FIND ]------------------------------------------
#

      if ($mode == 'newtopic')
      {
         $topic_id = $db->sql_nextid();

#
#-----[ AFTER, ADD ]------------------------------------------
#

         $is_current = 1;
      }
      else
      {
         $sql = "SELECT topic_humanoid_name FROM phpbb_humanoid_topics " .
               "WHERE topic_id = $topic_id AND topic_is_current_name = 1";
              if ( !($result = $db->sql_query($sql)) )
         {
            message_die(GENERAL_ERROR, 'Could not obtain humanoid information', '', __LINE__, __FILE__, $sql);
         }

         if ($row = $db->sql_fetchrow($result))
         {
            $is_current = ( $row['topic_humanoid_name'] != $human_subj ) ? 1 : 0;

            if ($is_current)
            {
               $sql = "UPDATE phpbb_humanoid_topics SET topic_is_current_name = 0 " .
                     "WHERE topic_id = $topic_id AND topic_is_current_name = 1";
                    if ( !($result = $db->sql_query($sql)) )
               {
                  message_die(GENERAL_ERROR, 'Could not update humanoid information', '', __LINE__, __FILE__, $sql);
               }
            }
         }
      }

      if ($is_current)
      {
         $sql = "SELECT humanoid_name_used_count FROM phpbb_humanoid_topics " .
               "WHERE topic_humanoid_name = '$human_subj' " .
               "ORDER BY humanoid_name_used_count DESC LIMIT 1";
              if ( !($result = $db->sql_query($sql)) )
         {
            message_die(GENERAL_ERROR, 'Could not obtain humanoid information', '', __LINE__, __FILE__, $sql);
         }

         $used_count = ($row = $db->sql_fetchrow($result)) ? ($row['humanoid_name_used_count'] + 1) : 0;

         $sql = "INSERT INTO phpbb_humanoid_topics " .
               "(topic_id, topic_humanoid_name, topic_is_current_name, humanoid_name_used_count) VALUES " .
               "($topic_id, '$human_subj', $is_current, $used_count)";
         if ( !($result = $db->sql_query($sql)) )
         {
            message_die(GENERAL_ERROR, 'Could not obtain humanoid information', '', __LINE__, __FILE__, $sql);
         }

#
#-----[ OPEN ]------------------------------------------
#

/includes/functions.php

#
#-----[ FIND ]------------------------------------------
#

// added at phpBB 2.0.11 to properly format the username
function phpbb_clean_username($username)

#
#-----[ BEFORE, ADD ]------------------------------------------
#

function str_to_humans($str)
{
   if (trim($str) == '' || trim($str, '_') == '')
   {
      return 'empty';
   }
   else
   {

      $str = preg_replace('#[\s\-]#', '_', strtolower(trim($str)));
      $srt = preg_replace('#_{1,}#', '_', preg_replace('#\W#', '', $str));
      $str = trim($str, '_');

      return $str;
   }
}


Добавлено спустя 48 секунд:

Ах, и ещё. Ставить надо только на чистый 2.0.15

Добавлено спустя 31 минуту 48 секунд:

Немного опшу переменные в sql-запросе.

topic_id - тема, для которой предназначаеться даный ЧПУ
topic_humanoid_name - имя которое будет использовать пользователь, чтобы попасть в тему.php
topic_is_current_name - определяет, какой из названий темы будет выводиться при просмотре viewforum
humanoid_name_used_count - служит для обозначения порядкового номера имя ЧПУ.


Немного попродробнее о последних двух.
Ситуация 1. Допустим пользователь назвал тему по старой привычке "Обсуждение phpBB 2.0.15", а потом вспомнил, что на дворе-то не 2.0.15 а 3.0.0. И исправил название темы на "Обсуждение phpBB 3.0.0".
Соответственно и ЧПУ ссылка тоже изменилась. И нам надо показывать не старую с версией 2.0.15, а новую 3.0.0. А так как старые ЧПУ не удаляються (на них уже сослалось пол интернета), то мы устанавливаем флажок с названием topic_is_current_name, что теперь всем надо выдавать ЧПУ не с версией 2.0.15, а с версией 3.0.0

Ситуция 2.
Вася Пуповкин решил поставить форум, но у него с завидной постоянностью выскакивает ошибка "Please delete install/ and contrib/ directories". Он решил создать тему, и назвал её в честь этой ошибки. ЧПУ получило имя "please_delete_install_and_contrib_directories". Но тут через два часа с такой же проблемой сталкнулся Вася Пупапоповкин. И так же решил создать тему и назвать её в честь ошибки критичиской. И тут у нас получаеться что две разные темы имеют один и тот же ЧПУ. Не порядок, подумал я и дабавил поле humanoid_name_used_count что бы знать сколько раз использовался данный ЧПУ и если испольховался добавить единичку сверху. И стала ссылка посылать в тему Пупапоповкина не на "please_delete_install_and_contrib_directories", а на "please_delete_install_and_contrib_directories-1". Соответсвенно ссылка для следуещего родственника Василия будет "please_delete_install_and_contrib_directories-2".

Описал как мог.
ra
phpBB 2.0.8
 
Сообщения: 346
Зарегистрирован: 28.04.2004 21:35
Откуда: Беларусь


Сообщение Splurov 21.06.2005 0:23

1. А почему-бы не добавлять поля к таблице phpbb_topics?
2. На счёт одинаковых имён. Почему-бы просто не проверять на существование темы с таким рулом? Зачем отдельное поле?
Splurov
phpBB 2.0.2
 
Сообщения: 151
Зарегистрирован: 28.11.2004 11:12
Откуда: Россия, Томск

Сообщение Rick 21.06.2005 1:38

Я конечно дико извиняюсь, но что такое ЧПУ?
Аватара пользователя
Rick
phpBB 1.4.4
 
Сообщения: 77
Зарегистрирован: 18.11.2004 19:49

Сообщение quazi 21.06.2005 8:13

брррр
Rick, ЧПУ - Человеко-Понятные URL
то есть ссылка типа http://site/path/file?show=new&day=21&moth=6&year=2005 будет видна для вас как http://site/news/2005/06/21

R@, что-то слишком сложно и путанно
имхо, кое-что вы почерпнули с дклаб, что-то свое.
вообще-то ЧПУ крутить надо на завершенный сайт (форум)
для начала надо разделы чпуизировать
темы - это вообще отдельный разговор
опять же имхо есть 3 варианта (на примере этой темы)
1. транслит названия http://phpbbguru.net/community/authors/ ... aChPU.html
2. перевод на англ. http://phpbbguru.net/community/authors/ ... ating.html
3. нумерация (по дате, по ID в таблице БД
quazi
phpBB 2.0.8
 
Сообщения: 313
Зарегистрирован: 15.03.2005 19:49

Сообщение ra 21.06.2005 9:36

А почему-бы не добавлять поля к таблице phpbb_topics?

Потому что тогда для одной темы можно было бы хранить только один ЧПУ. И если мы изменим название темы, то, либы мы изменим ЧПУ и ссылки на этот ЧПУ будут не действительные, либо мы не меняем, но он не соответствует нынешнему названию темы.

На счёт одинаковых имён. Почему-бы просто не проверять на существование темы с таким рулом? Зачем отдельное поле?

Потому что проверкой существования ЧПУ мы не узнаем какой номер присвоить новому ЧПУ с таким же именем.

нумерация (по дате, по ID в таблице БД

Какое-то не полноценное ЧПУ. Мне понятнятнее параметры, чем обилие слешей.


Самый лучший, но использавать сокеты довольно ресурсоемко и к тому же на бесплатных хостингах это не дают (на холме точно).

http://phpbbguru.net/community/authors/MoiNarabotkiVPlaneSozdaniyaChPU.html

Я отказался от показа названия форума из-за того что если у нас будут чпуизированы пользователи и мы создадим форум с названием "users" то получаеться огромный конфликт.
ra
phpBB 2.0.8
 
Сообщения: 346
Зарегистрирован: 28.04.2004 21:35
Откуда: Беларусь

Сообщение Siava 12.08.2005 13:56

R@
Просто замечательно!
А как можно сделать, чтоб ссылки на русские названия тем были в транслите?
Генератор db_update-файлов для phpBB 2.0
Еще одно нарушение правил и будете забанены.
© Mr. Anderson
Аватара пользователя
Siava
phpBB 3.0.2
 
Сообщения: 2718
Зарегистрирован: 11.01.2005 15:29
Откуда: Питер

Сообщение Siava 16.08.2005 14:44

Всё, уже сам разобрался.

Вот так у меня выглядит новая функция (пока что в тестовом, но вроде бы рабочем состоянии):

Код: Выделить всё
function str_to_humans($str)
{
   if (trim($str) == '' || trim($str, '_') == '')
   {
      return 'empty';
   }
   else
   {

                $str = preg_replace('/^.*::/s', '', $str);
                $str = trim($str);
                $str = strtr(
                        $str,
                        "абвгдежзийклмнопрстуфыэАБВГДЕЖЗИЙКЛМНОПРСТУФЫЭ",
                        "abvgdegziyklmnoprstufieABVGDEGZIYKLMNOPRSTUFIE"
                );
                $str = strtr($str, array(
                        'ё' => "yo",
                        'х' => "h",
                        'ц' => "ts",
                        'ч' => "ch",
                        'ш' => "sh",
                        'щ' => "shch",
                        'ъ' => '',
                        'ь' => '',
                        'ю' => "yu",
                        'я' => "ya",
                        'Ё' => "YO",
                        'Х' => "H",
                        'Ц' => "TS",
                        'Ч' => "CH",
                        'Ш' => "SH",
                        'Щ' => "SHCH",
                        'Ъ' => '',
                        'Ь' => '',
                        'Ю' => "YU",
                        'Я' => "YA",
                ));

      $str = preg_replace('#[\s\-\/]#', '_', strtolower(trim($str)));
      $srt = preg_replace('#_{1,}#', '_', preg_replace('#\W#', '', $str));
      $str = trim($str, '_');

      return $str;
   }
}


Использовал данные "размышления" в совокупностью с модом friendly topics, сделал ЧПУ для категорий, форумов и топиков. =) Осталось только отладить и собрать всё в кучку чтобы выложить. :roll:
Генератор db_update-файлов для phpBB 2.0
Еще одно нарушение правил и будете забанены.
© Mr. Anderson
Аватара пользователя
Siava
phpBB 3.0.2
 
Сообщения: 2718
Зарегистрирован: 11.01.2005 15:29
Откуда: Питер

Сообщение [R: R@m$e$ :U] 16.08.2005 15:16

имхо... функция должна не должна использовать русские буквы... chr(xxx) рулит =)
Руководство пользователя | FAQ | Правила | Как устанавливать MOD'ы
ВОСПОЛЬЗУЙСЯ ПОИСКОМ, ТАМ ЕСТЬ БОЛЬШИНСТВО ОТВЕТОВ
ЕСЛИ НЕ ПОМОГЛО, ИСПОЛЬЗУЙ ШАБЛОН ЗАПРОСА, ПОМОГИ В РЕШЕНИИ ЗАДАЧИ
БЕСПЛАТНО ПОМОГУ ТОЛЬКО НА ФОРУМЕ!!! (ЛС НЕ В СЧЕТ)

Оставь благодарность, подтверди работоспособность совета.

ВСЕ ПРАВА НА МОДЫ ОТДАНЫ m157y
Аватара пользователя
[R: R@m$e$ :U]
phpBB Maniac
 
Сообщения: 1516
Зарегистрирован: 16.01.2005 14:04
Откуда: Novosibirsk,RU

Сообщение ra 20.08.2005 22:03

[R: R@m$e$ :U] писал(а):имхо... функция должна не должна использовать русские буквы

Хуже, в качесте ЧПУ-имя_топика нельзя использовать симолы которые меняются при urlencode().
ra
phpBB 2.0.8
 
Сообщения: 346
Зарегистрирован: 28.04.2004 21:35
Откуда: Беларусь

Сообщение Гога 21.08.2005 1:05

Siava писал(а):'х' => "h",

Код: Выделить всё
'х' => "kh",
вообще-то. Иначе казузы, типа сходи => shodi
Гугл рулит. Я люблю ЛОР.
Интересно, они пришли с миром или им таки нужен наш моск?
Знания принадлежат всему человечеству.
Аватара пользователя
Гога
phpBB 2.0.5
 
Сообщения: 235
Зарегистрирован: 09.05.2005 16:06
Откуда: Архангельск

Сообщение Coagulant 21.08.2005 1:17

Удачная транслитерация в Translit Mod, имхо. А здесь явно неполная.
Аватара пользователя
Coagulant
phpBB 2.0.17
 
Сообщения: 1030
Зарегистрирован: 10.01.2005 20:43
Откуда: Москва

Сообщение Lenux 20.09.2005 6:04

Хм.. в принципе мод инетерсный, то ка не доделаный, но это и не важно, на мой взгляд ссылки в виде:
/10/25/ нету смысла, если и делать, то по названию форума, таким видом:
/forum name/topic name
Так в приницпе viewtopici разные используют числа, что более удобно на мой взгляд.
Lenux
phpBB 1.0.0
 
Сообщения: 8
Зарегистрирован: 04.04.2005 6:51

Сообщение Exploder 25.09.2005 13:22

Так всетаки хотелось бы узнать, есть полная реализация этого мода или может быть есть другие моды делающик тоже самое?
Exploder
phpBB 1.4.2
 
Сообщения: 55
Зарегистрирован: 08.08.2005 21:46
Откуда: Германия

Сообщение Siava 25.09.2005 22:18

Exploder
Полной реализации наверно нет, но я сделал из этого кое-что похожее на полную реализацию, совместив с модом Search Engines Friendly Board..
Генератор db_update-файлов для phpBB 2.0
Еще одно нарушение правил и будете забанены.
© Mr. Anderson
Аватара пользователя
Siava
phpBB 3.0.2
 
Сообщения: 2718
Зарегистрирован: 11.01.2005 15:29
Откуда: Питер

Сообщение Exploder 25.09.2005 23:29

Siava
Там ссылка мертвая((
Exploder
phpBB 1.4.2
 
Сообщения: 55
Зарегистрирован: 08.08.2005 21:46
Откуда: Германия

След.

Вернуться в Для авторов (phpBB 2.0.x)

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0