Thorn Опубликовано 2 Марта 2005 Жалоба Поделиться Опубликовано 2 Марта 2005 Здравствуйте. У меня следующая проблемка (точнее не проблема, а просьба помочь )Мне нужно сделать возможным задавать теме определенный параметр, из меню простого модератора.Тоесть модератор может ведь "сделать тему важной и прочее", а мне ещё нужно вставить одну функцию (будет селект, option которого нужно будет занести в новое поле (например Art_id)в таблице ibf_topics).Тоесть модератор зайдя в тему может присвоить ей определенное новое значение. Подскажи пожалуйста - как это лучше сделать, в каких файлах смотреть и прочее. Ну для начала я создал новое поле в таблице "ibf_topics", назвал его 'art_id'а дальше как? Точнее не как а "где и как"?Оченть прошу - помогите, о великие Гуру IBF Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
theIggs Опубликовано 2 Марта 2005 Жалоба Поделиться Опубликовано 2 Марта 2005 Thorn mod_cp.php + Moderate.php + modfunctions.php - для реализации действий модератораskin_mod.php, skin_modcp.php - туда вписывай хтмл-код своего option'aКонкретно ставь задачу... Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Thorn Опубликовано 2 Марта 2005 Автор Жалоба Поделиться Опубликовано 2 Марта 2005 theIggs спасибо Конкретная задача: сайт про игры. Если модератор видит что топик относиться к такой-то игре, то он ему в опциях это указывает (для того, чтобы вверху был выведен краткий обзор игры + ссылка на оригинал на сайте).Код селекта (сам код сделан под php-nuke, как его подстроить под форум - незнаю, так как я в нюке разбираюсь, а в форуме все функции для меня незнакомые, даже незнаю вообщем): echo "<select name=\"game_id\"> .<option value=\"\">Не относиться к играм</option>"; $sql = "select game_id, title from ".$prefix."_games where active=1"; $result = $db->sql_query($sql); while ($rowgi = $db->sql_fetchrow($result)) { $gametitle = $rowgi[title]; $game_id = $rowgi[game_id]; echo "<option value=\"$game_id\">$gametitle</option>"; } echo "</select><br><br>"; Поможете? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
theIggs Опубликовано 3 Марта 2005 Жалоба Поделиться Опубликовано 3 Марта 2005 Помогаем. Запасаемся инструментами модификатора. Это установленная локально копия форума + Windows Commander / Total Commander.Затем смотрим на нашу задачу. Мы хотим дать модератору выпадающую менюшку. Думаем, нет ли чего похожего под рукой, чтоб не кодить два раза — и ура! — находим модераторскую панельку внизу, ту, где Опции модератора: Переместить тему, Закрыть тему и т.д.Нам нужно по сути такую же, только делать она должна кое-что другое. Но что-то мы в этой панельке позаимствуем. Итак, открываем наш WC / TC и применяем знаменитый метод "текст -> HTML-шаблон -> PHP-генератор".Давим Alt+F7 и ищем в папке форума все файлы, содержащие слова "Опции модератора", "Переместить тему", "Закрыть тему".Нашлось: lang_mod, lang_topic, lang_modcp. Все файлы форума делятся по разделам (например, Boards.php, skin_boards.php и lang_boards.php — главная страница форума, Topics.php, skin_topic.php и lang_topic.php — отображение конкретной темы и т.д.). У каждого раздела форума есть три файла:PHP-генератор (в папке sources),HTML-шаблоны (в папке Skin/s*),и тексты на разных языках (в папке lang/*).Посмотрев на названия файлов, можно в большинстве случаев сказать, за что они отвечают.Мы нашли файлы: lang_mod, lang_topic, lang_modcp.Выпадающий список с опциями модератора присутствует только в темах — значит, он описан в файлах Topics.php, skin_topic.php, lang_topic.php.Файлы *modcp* отвечают за панель модератора (это которая в верху страницы ссылочка), файлы *mod* — за реализацию конкретных модераторских действий (т.е. когда уже модер тут в выпадающем списочке выбрал, что с темой сотворить, эти данные передаются в файлы Moderate.php, skin_mod.php, lang_mod.php). С файлами мы разобрались, теперь посмотрим, что нам дальше делать с найденными результатами. Очевидно, шаблончик исходный содержит в себе текст "Опции модератора". Такой текст мы нашли в lang_topic.php. Глянем на эту строчку:moderation_ops => "Опции модератора",Очевидно, раз больше текст "Опции модератора" нигде не нашёлся, в других модулях используется подстановка moderation_opsСледовательно, сделав ещё раз поиск по всем файлам форума, мы и найдём, где формируется сам HTML-шаблон для выпадающего меню!Итак, поиск по слову "moderation_ops"; результат: lang_topic.php (логично ), а также skin_topic.php! Найдём, где же хранится сам этот шаблончик. Открываем skin_topic.php и ищем по "moderation_ops". Вот:function Mod_Panel($data, $fid, $tid, $key="") { global $ibforums; return <<<EOF <div align='left' style='float:left;width:auto'> <form method='POST' style='display:inline' name='modform' action='{$ibforums->base_url}'> <input type='hidden' name='t' value='$tid' /> <input type='hidden' name='f' value='$fid' /> <input type='hidden' name='st' value='{$ibforums->input['st']}' /> <input type='hidden' name='auth_key' value='$key' /> <input type='hidden' name='act' value='Mod' /> <select name='CODE' class='forminput' style="font-weight:bold;color:red"> <option value='-1' style='color:black'>{$ibforums->lang['moderation_ops']}</option> $data </select> <input type='submit' value='{$ibforums->lang['jmp_go']}' class='forminput' /></form> </div> EOF; }Обрати внимание — весь шаблон представляет собой HTML-код, подобный тому, какой ты хочешь. Нужно лишь некоторые переменные поменять, а основное останется так же. Итак, разбираем HTML-шаблончик и клепаем из него шаблон для тебя:<form method='POST' style='display:inline' name='modform' action='{$ibforums->base_url}'>Открывается форма. Тебе нужно будет поменять название (name), чтоб не было двух одинаковых форм на странице. base_url указывает, что данные методом POST будут передаваться скрипту index.php. Ну, это и так понятно. <input type='hidden' name='t' value='$tid' /> <input type='hidden' name='f' value='$fid' /> <input type='hidden' name='st' value='{$ibforums->input['st']}' />t — номер темы, f — номер форума, а st — это текущая страница, которая в теме была открыта. Нужно тебе это в твоей обработке? Сам решишь.<input type='hidden' name='auth_key' value='$key' />Это придётся оставить. Служебная переменная, нужная для безопасности.<input type='hidden' name='act' value='Mod' />Какому именно модулю передать переменные твои для обработки. Список act-ов хранится в index.php, вот он:$choice = array( ... "Mod" => "Moderate", ... );Мораль — разбором данных будет заниматься скрипт Moderate.php. Наверное, мы с тобой просто в этот скрипт нашу обработку и допишем. <select name='CODE' class='forminput' style="font-weight:bold;color:red">SELECT у тебя уже есть, только называется он не CODE, а game_id. Название сам поменяешь. <option value='-1' style='color:black'>{$ibforums->lang['moderation_ops']}</option>Первая опция в списке. У тебя такая тоже есть, только текст у неё "Не относится к играм".$dataЧисто по логике — сами строчки в SELECT'e. Видимо, где-то в другом месте формируются. У нас такие тоже будут, ну и, соответственно, скриптик для формирования напишем.</select> <input type='submit' value='{$ibforums->lang['jmp_go']}' class='forminput' /></form>SELECT закрылся, формочка тоже закрылась. Кнопка тут нарисовалась. Ты, я думаю, уже понял логику добавления текста на эти кнопки. В принципе, можно {$ibforums->lang['jmp_go']} с кнопки убрать и просто написать там "Добавить ID игры". Итак, из имеющегося шаблона мы путём замены некоторых данных получили готовый шаблон для твоей задачи, только обозвать его надо по-другому как-тоfunction Game_Id($data, $fid, $tid, $key="") { global $ibforums; return <<<EOF <div align='left' style='float:left;width:auto'> <form method='POST' style='display:inline' name='gameform' action='{$ibforums->base_url}'> <input type='hidden' name='t' value='$tid' /> <input type='hidden' name='f' value='$fid' /> <input type='hidden' name='auth_key' value='$key' /> <input type='hidden' name='act' value='Mod' /> <select name='game_id' class='forminput' style="font-weight:bold;color:red"> <option value='' style='color:black'>Не относится к играм</option> $data </select> <input type='submit' value='Записать в базу' class='forminput' /></form> </div> EOF; } Красота! Параметры t и f я в форме оставил. Скрипт обработки должен же знать, в какую тему мы хотим добавить значение game_id...Теперь нам нужно написать два обработчика: первый выведет модератору на экран нашу новую панельку, а второй примет от модератора данные и запишет их в базу. Итак, №1.Вывод на экран нашей панельки, наверно, будет протекать примерно так же, как и вывод обычной модераторской панельки (Mod_Panel).Опять воспользуемся поиском по файлам форума и посмотрим, где же вызывается эта Mod_Panel.Результаты поиска не удивительны: она в Topics.php. return $this->html->Mod_Panel($mod_links, $this->forum['id'], $this->topic['tid'], $this->md5_check);Переменная $data, которая была нами замечена в функции Mod_Panel, берётся как раз отсюда, из переменной $mod_links. Выше для этого самого $mod_links куча разных расчётов... Что надо нам. Забодяжить такой же расчёт для переменной $data (там у нас будут строчки с номерами и названиями игр), ну и вызвать нашу функцию Game_Id()...Из всей функции формирования модераторской панельки нас интересует вот этот кусок: $mod_links = ""; if (!isset($ibforums->member['id'])) return ""; $skcusgej = 0; if ($ibforums->member['id'] == $this->topic['starter_id']) { $skcusgej = 1; } if ($ibforums->member['g_is_supmod'] == 1) { $skcusgej = 1; } if ($this->moderator['mid'] != "") { $skcusgej = 1; } if ($skcusgej == 0) { return ""; }Тут переменная $mod_links инициализируется, а потом идут всякоразные проверки на модератора. Само собой, нам без этих проверок тоже не обойтись.Итак, что сделаем: $mod_links = ""; $game_links = ""; if (!isset($ibforums->member['id'])) return ""; $skcusgej = 0; $flag = 0; if ($ibforums->member['id'] == $this->topic['starter_id']) { $skcusgej = 1; } if ($ibforums->member['g_is_supmod'] == 1) { $skcusgej = 1; $flag = 1; } if ($this->moderator['mid'] != "") { $skcusgej = 1; $flag = 1; } if ($flag == 1) { $sql = "select game_id, title from ".$prefix."_games where active=1"; $result = $DB->query($sql); while ($rowgi = $DB->fetch_row($result)) { $gametitle = $rowgi[title]; $game_id = $rowgi[game_id]; $game_links .= "<option value=\"$game_id\">$gametitle</option>\n"; } $MYHTML = $this->html->Game_Id($game_links, $this->forum['id'], $this->topic['tid'], $this->md5_check); } if ($skcusgej == 0) { return ""; }Введём новую переменную $game_links. Туда соберём все ID и названия игр. Код для собирания ты уже выше написал, по сути.Имеющиеся проверки нам пригодятся. Введём переменную $flag = 0. Если после нужных проверок она останется нулём, значит, пользователь не модератор и панель ему не нужна.Переменная $flag может стать единицей если:а) пользователь супермодер или админ$ibforums->member['g_is_supmod'] == 1или б) пользователь модер$this->moderator['mid'] != ""Если переменная $flag равна 1, значит, формируем строчки для нашего SELECT'a.Я взял твой код. $prefix нужно заменить на префикс таблицы с играми, $db->sql_query в Invision'e превращается в $DB->query, а $db->sql_fetchrow — в $DB->fetch_row(). Всё больше разницы нет. Единственно что, option'ы не сразу выводим на экран (echo), а накапливаем в переменной $game_links.Всё, панельку Game_Id можно выводить на экран! К сожалению, два return'a в модуль не вставишь, поэтому я забацаю переменную $MYHTML, в неё соберу результаты, а выведу её позже. Например, вот тут: if ($mod_links != "") { return $MYHTML . $this->html->Mod_Panel($mod_links, $this->forum['id'], $this->topic['tid'], $this->md5_check); } PS Всё бы было хорошо, но на этом шаге вылетает Fatal error: Call to a member function on a non-object in z:\home\localhost\www\131\sources\Topics.php on line 1388Ещё бы, мы объект $DB вовсю юзаем, а в global его не добавили.Добавляем:function moderation_panel() { global $ibforums, $std, $DB;Ну, всё так вроде красивенько, в теме уже выпадающий список отображается. Правда, выпадающие списки в теме все слиплись, поэтому я бы лично ещё помучал HTML+CSS. Но это позже. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
theIggs Опубликовано 3 Марта 2005 Жалоба Поделиться Опубликовано 3 Марта 2005 Ну, а теперь №2. Обработочку бы для этого дела написать, чтобы сохранялось в базу.Будем полагать, что поле в базе уже создано и называется art_id. HTML-форма, которую мы набросали, будет передавать в модуль Moderate.php значение game_id. Это значение нужно записать в БД.Открываем Moderate.php. Модератору нам вроде ничего показывать не надо, сразу считываем значение game_id и пишем его в базу, а потом делаем редирект. Поэтому лучшим решением будет: сразу проверить, задано ли у нас значение game_id, и если да, то тут же провести обработку и выйти из модуля. Итак, вот начинается текст модуля: function Moderate() { global $ibforums, $DB, $std, $print, $skin_universal, $HTTP_POST_VARS;Предлагаю ниже добавить: $ibforums->input['game_id'] = intval( $ibforums->input['game_id'] ); if ( $ibforums->input['game_id'] ) { // Проверка на хацкера, чтоб все значения передал! if ($ibforums->input['t']) { $ibforums->input['t'] = intval($ibforums->input['t']); if (! $ibforums->input['t'] ) { $std->Error( array( 'LEVEL' => 1, 'MSG' => 'missing_files') ); } else { $DB->query("SELECT tid, title, description, posts, state, starter_id, pinned, forum_id, last_post from ibf_topics WHERE tid='".$ibforums->input['t']."'"); $this->topic = $DB->fetch_row(); if (empty($this->topic['tid'])) { $std->Error( array( 'LEVEL' => 1, 'MSG' => 'missing_files') ); } } } $ibforums->input['f'] = intval($ibforums->input['f']); if (! $ibforums->input['f'] ) { $std->Error( array( 'LEVEL' => 1,'MSG' => 'missing_files') ); } $DB->query("SELECT f.*, c.name as cat_name, c.id as cat_id from ibf_forums f, ibf_categories c WHERE f.id=".$ibforums->input['f']." and c.id=f.category"); $this->forum = $DB->fetch_row(); // Надо забацать проверку, модератор ли это вообще! if ($ibforums->member['id']) { if ($ibforums->member['g_is_supmod'] != 1) { $DB->query("SELECT * FROM ibf_moderators WHERE forum_id=".$this->forum['id']." AND (member_id=".$ibforums->member['id']." OR (is_group=1 AND group_id=".$ibforums->member['mgroup']."))"); $this->moderator = $DB->fetch_row(); if ( ! $this->moderator['id'] ) return; } } // Это модер. Все данные есть. Пишем в базу и валим. $DB->query("UPDATE ibf_topics SET art_id = '{$ibforums->input['game_id']}' WHERE tid = '{$ibforums->input['t']}'"); $std->boink_it( $ibforums->base_url."showtopic=".$ibforums->input['t'] ); }Проверки в данном случае мы просто выдрали из уже имеющегося текста модуля.Всё вроде работает. Если хочешь, можешь $std->boink_it() заменить на $print->redirect_screen(). Как грамотно вызвать redirect_screen(), смотри в этом же модуле, там куча примеров. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Thorn Опубликовано 3 Марта 2005 Автор Жалоба Поделиться Опубликовано 3 Марта 2005 theIggs Огромнейшее приогромнейшее спасибо! Сейчас буду всё делать. следую инструкциям! Честное слово не ожидал что мне дадут настолько точный и полный ответ Спасибо! Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
theIggs Опубликовано 3 Марта 2005 Жалоба Поделиться Опубликовано 3 Марта 2005 Thorn На чёткий вопрос - чёткий ответ.Имхо, это и следующим поколениям IPB-программистов будет полезно. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Thorn Опубликовано 3 Марта 2005 Автор Жалоба Поделиться Опубликовано 3 Марта 2005 theIggs елки-палки ене выводиться у меня панелька эта Может я что-то не так делаю в Topics.php? вот у меня такой код (наверное не правильно сделал?): function moderation_panel() { global $ibforums, $std, $DB; $mod_links = ""; if (!isset($ibforums->member['id'])) return ""; $skcusgej = 0; if ($ibforums->member['id'] == $this->topic['starter_id']) { $skcusgej = 1; } if ($ibforums->member['g_is_supmod'] == 1) { $skcusgej = 1; } if ($this->moderator['mid'] != "") { $skcusgej = 1; } if ($skcusgej == 0) { return ""; } $mod_links = ""; $game_links = ""; if (!isset($ibforums->member['id'])) return ""; $skcusgej = 0; $flag = 0; if ($ibforums->member['id'] == $this->topic['starter_id']) { $skcusgej = 1; } if ($ibforums->member['g_is_supmod'] == 1) { $skcusgej = 1; $flag = 1; } if ($this->moderator['mid'] != "") { $skcusgej = 1; $flag = 1; } if ($flag == 1) { $sql = "select game_id, title from nuke_games where active=1"; $result = $DB->query($sql); while ($rowgi = $DB->fetch_row($result)) { $gametitle = $rowgi[title]; $game_id = $rowgi[game_id]; $game_links .= "<option value=\"$game_id\">$gametitle</option>\n"; } $MYHTML = $this->html->Game_Id($game_links, $this->forum['id'], $this->topic['tid'], $this->md5_check); } if ($skcusgej == 0) { return ""; } $actions = array( 'MOVE_TOPIC', 'CLOSE_TOPIC', 'OPEN_TOPIC', 'DELETE_TOPIC', 'EDIT_TOPIC', 'PIN_TOPIC', 'UNPIN_TOPIC', 'UNSUBBIT', 'MERGE_TOPIC', 'SPLIT_TOPIC' ); foreach( $actions as $key ) { if ($ibforums->member['g_is_supmod']) { $mod_links .= $this->append_link($key); } elseif ($this->moderator['mid']) { if ($key == 'MERGE_TOPIC' or $key == 'SPLIT_TOPIC') { if ($this->moderator['split_merge'] == 1) { $mod_links .= $this->append_link($key); } } else { if ($this->moderator[ strtolower($key) ]) { $mod_links .= $this->append_link($key); } } } elseif ($key == 'OPEN_TOPIC' or $key == 'CLOSE_TOPIC') { if ($ibforums->member['g_open_close_posts']) { $mod_links .= $this->append_link($key); } } elseif ($key == 'DELETE_TOPIC') { if ($ibforums->member['g_delete_own_topics']) { $mod_links .= $this->append_link($key); } } } if ($ibforums->member['g_access_cp'] == 1) { $mod_links .= $this->append_link('TOPIC_HISTORY'); } if ($mod_links != "") { return $this->html->Mod_Panel($mod_links, $this->forum['id'], $this->topic['tid'], $this->md5_check); } } Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
theIggs Опубликовано 3 Марта 2005 Жалоба Поделиться Опубликовано 3 Марта 2005 Зачем вот это закопировал? $mod_links = ""; $game_links = ""; if (!isset($ibforums->member['id'])) return ""; $skcusgej = 0; $flag = 0; if ($ibforums->member['id'] == $this->topic['starter_id']) { $skcusgej = 1; } if ($ibforums->member['g_is_supmod'] == 1) { $skcusgej = 1; $flag = 1; } if ($this->moderator['mid'] != "") { $skcusgej = 1; $flag = 1; } if ($flag == 1) { $sql = "select game_id, title from ".$prefix."_games where active=1"; $result = $DB->query($sql); while ($rowgi = $DB->fetch_row($result)) { $gametitle = $rowgi[title]; $game_id = $rowgi[game_id]; $game_links .= "<option value=\"$game_id\">$gametitle</option>\n"; } $MYHTML = $this->html->Game_Id($game_links, $this->forum['id'], $this->topic['tid'], $this->md5_check); } if ($skcusgej == 0) { return ""; }Это уже изменённый код с дописанными строчками, там нужно было только подправить то, что есть.return $this->html->Mod_Panel($mod_links, $this->forum['id'], $this->topic['tid'], $this->md5_check);А тут кто $MYHTML допишет? Смотри выше, эта строчка тоже должна измениться. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Thorn Опубликовано 3 Марта 2005 Автор Жалоба Поделиться Опубликовано 3 Марта 2005 theIggs Извини, я конкретно ... ошибся Всё уже все видно, сейчас приступаю к пункту номер два. И ещё - раз уже впринципе мы в разделе форума "Модификации в разработке" о можно продолжить то что уже начато?Для начала хочу сказать что то что я вообще пропросил сделать, и то что реализовал theIggs - помогает связывать определенный материал сайта, с фоумом. А вот что нужно ещё сделать:Например выбрали мы что топик относиться к игре "Half-Life-2", - как теперь в шапке темы удобнее вывести некоторую информацию п игре (необязательно это будет игра - у кого-то это может быть рецепт, песня, книга и прочее).Допустим что бы в верху топика, Над или Под кнопочками "Add reply" etc. была бы табличка которая выведет ещё некоторую информацию, взятую из определенной таблицы (например prefix_games). Впринципе это просто нужно сделать челект некоторых полей, и вывести в оформленную табличку. Только незнаю - где именно нужно это выводить, в каких файлах править? Помогите, пожалуйста Добавлено в [mergetime]1109875702[/mergetime] Хм.. при попытке присвоить теме определенное значение, пишет:Обнаружена ошибка. Если Вам неизвестны причины ошибки, попробуйте обратиться к разделам помощи. Обнаружена ошибка: Вам запрещено использование этой функцииКак это исправить? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Thorn Опубликовано 3 Марта 2005 Автор Жалоба Поделиться Опубликовано 3 Марта 2005 theIggs Подскажи пожалуйста, в чём может быть проблема? (тоесть выдаёт сообщение "Вам запрещено использование этой функции"). Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
theIggs Опубликовано 4 Марта 2005 Жалоба Поделиться Опубликовано 4 Марта 2005 выдаёт сообщение "Вам запрещено использование этой функции"Ещё раз открывай Moderate.php и проверяй. Я тебе привёл, после чего там надо втыкать код, а ты его воткнул, видимо, НИЖЕ, после проверок, которые там есть.Если же по инструкции делать, то вся обработка game_id проходит до всех проверок в модераторском модуле.Впринципе это просто нужно сделать челект некоторых полей, и вывести в оформленную табличку. Только незнаю - где именно нужно это выводить, в каких файлах править?С темами ты уже знаком, Topics.php. Тебе это нужно выводить над списком страниц и кнопками, не правда ли. Список страниц формируется функцией build_pagelinks(). Найдёшь в файле такую функцию - выше и вставляй. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Song Опубликовано 4 Марта 2005 Жалоба Поделиться Опубликовано 4 Марта 2005 Игс, ты попал Теперь пока сам к нему на фтп не залезешь, ничего не получится Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
GiV Опубликовано 4 Марта 2005 Жалоба Поделиться Опубликовано 4 Марта 2005 Да, Игорь, за изложение материала вечное уважение. Читал и не мог оторваться.Но вот ученик у тебя, типичный дендромутант, эхх =( Надеюсь что не даром все писалось, кому то поможет. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Чёртос-2 Опубликовано 11 Марта 2005 Жалоба Поделиться Опубликовано 11 Марта 2005 Надеюсь что не даром все писалось, кому то поможет.Да, а если запихнуть в архив модов - было бы вообще супер! Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Рекомендуемые сообщения
Присоединиться к обсуждению
Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.