Trotor 27 11/19/15 11:11 Хотелось бы создать так сказать общий цифровой рейтинг пользователя на основании количества сообщений, тем, репутации, очков рейтинга в профиле, и других цифровых показателей пользователя. Скажем 100 сообщений это 1 балл рейтинга, 10 тем - тоже 1 балл, и так далее, и что бы общий показатель выводить в тему.Возможно ли такое реализовать? 1 Поделиться сообщением Ссылка на сообщение
newbie 1723 11/20/15 05:17 Возможно ли такое реализовать? Возможно.Но не все перечисленные данные есть по умолчанию. Например, нет деления на посты и темы. В этом случае можно посмотреть в сторону хука "Number Of Topics Started".А так - это чистая математика. Поделиться сообщением Ссылка на сообщение
siv1987 2628 11/20/15 16:56 А в чем проблема? Все данные есть (за исключения тем), вычисляйте рейтингу по формуле floor( общее количество / за какое количество ) + n. Поделиться сообщением Ссылка на сообщение
Trotor 27 11/21/15 00:41 А в чем проблема? Все данные есть (за исключения тем), вычисляйте рейтингу по формуле floor( общее количество / за какое количество ) + n.А не напишите как это реализовать подробно? (за исключения тем)Темы тоже есть. Стоит хук Количество созданных темВывожу информацию о них посредством {$author['topics_started']} В этом случае можно посмотреть в сторону хука "Number Of Topics Started".Да, давно стоит. Поделиться сообщением Ссылка на сообщение
newbie 1723 11/21/15 12:54 А не напишите как это реализовать подробно?Что Вам не понятно? :) вычисляйте рейтингу по формуле floor( общее количество / за какое количество ) + n"общее количество" - $author['topics_started'], $author['posts'] и т.д."за какое количество" - 100 сообщений, 10 тем и т.д."n" - та же самая формула floor( общее количество / за какое количество ).Если давать не по 1 баллу, то формула будет выглядеть floor( общее количество / за какое количество ) * X. X - количество баллов. Пример для тем и сообщений.{parse expression="floor( $author['topics_started'] / 10 ) + floor( $author['posts'] / 100 )"} Не знаю, после установки вышеуказанного хука $author['posts'] - чисто сообщения или как и по дефолту вместе с темами.Если последнее, то $author['posts'] / 100 замените на ($author['posts'] - $author['topics_started']) / 100 2 Поделиться сообщением Ссылка на сообщение
Trotor 27 11/21/15 14:41 @newbie, Ух ты - отлично, работает на ура! Большое спасибо. Не знаю, после установки вышеуказанного хука $author['posts'] - чисто сообщения или как и по дефолту вместе с темами.Нет, работает отдельно, не зависит от сообщений. Поделиться сообщением Ссылка на сообщение
Trotor 27 11/21/15 16:41 И ещё. Как добавить выборку по рейтингу в Список пользователей - http://ipbskins.ru/forum/index.php?app=members (колонку с количеством рейтинга я уже туда добавил)? То есть кнопку вроде Имя пользователя, Количество сообщений, Дата регистрации. Поделиться сообщением Ссылка на сообщение
newbie 1723 11/22/15 06:47 То есть кнопку вроде Имя пользователя, Количество сообщений, Дата регистрации. Кнопку добавляйте в шаблон member_list_show. <li <if test="$this->request['sort_key'] == 'grating'">class='active'</if>> <a href='{parse url="app=members&module=list&{$url}&sort_key=grating&sort_order=desc" template="members_list" base="public" seotitle="false"}' title='Сортировка по рейтингу'>По рейтингу</a> </li> Также нужно будет отредактировать файл admin/applications/members/modules_public/list/view.php1. Ниже 'members_profile_views' => 'm_dd_views',Добавляете 'grating' => 'sort_by_grating',2. Выше $this->DB->build( array( 'select' =>' m.member_id',Добавляете $grating = "(FLOOR(m.posts/100) + FLOOR(pp.pp_reputation_points/10)) AS grating";Тут сами определите, что Вам надо.3. $this->DB->build( array( 'select' =>' m.member_id', заменяете на $this->DB->build( array( 'select' => "m.member_id, {$grating}",4. Ниже находите 'order' => 'm.' . $this->sort_key . ' ' . $this->sort_order, и заменяете на 'order' => $this->sort_key . ' ' . $this->sort_order,5. Добавляете языковую фразу для выпадающего меню.Приложение - ПользователиНабор слов - public_listКлюч - sort_by_gratingТекст по умолчанию - по рейтингу 3 Поделиться сообщением Ссылка на сообщение
Trotor 27 11/22/15 13:08 @newbie, Большое спасибо. Всё получилось! Поделиться сообщением Ссылка на сообщение
Strategius 52 01/22/17 13:50 (изменено) Подскажите, пожалуйста, как адаптировать этот метод под версию 3.4.9? Делаю все по инструкции из поста #8, при переходе в список пользователей выбивает ошибку базы данных :( И еще, с таким кодом вывода рейтинга в шаблоны рушится верстка почему то (и на тестовой версии 3.1.4 тоже): {parse expression="floor( $author['topics_started'] / 10 ) + floor( $author['posts'] / 100 )"}Работает только с таким кодом: {parse expression="floor( $author['posts'] / 100 )"}Т.е. не работает с несколькими floor + почему-то... Изменено 22 января 2017 пользователем Strategius Поделиться сообщением Ссылка на сообщение
Dmitriy427 198 01/22/17 22:09 Функция floor() просто округляет результат деления и, естественно, не имеет отношения к вашим проблемам. В шаблонaх "userInfoPane" и "post" можете для вычисления интегрального рейтинга взять, помимо $author['posts'] ( для шаблона "post" это переменная $post['author']['posts'] ), значения переменных $author['pp_rating_value'] - средний рейтинг профиля, $author['pp_rating_hits'] - количество оценок профиля и $author['pp_reputation_points'] - репутация. Переменную $author['topics_started'] с количеством открытых автором топиков можно вернуть правкой в файле /admin/applications/forums/modules_public/forums/topics.php, по-идее, но это увеличит число запросов к базе, в зависимости от количества ответов на странице.После: $row['member_id'] = $row['mid'];Добавить: $count = $this->DB->buildAndFetch( array( 'select' => 'count(*) as tstarted', 'from' => 'topics', 'where' => 'starter_id='.$row['member_id'] ) ); $row['topics_started'] = $count['tstarted']; P.S. Если Вы сделали эту правку, то код с использованием переменной $author['topics_started'] помещайте в условие вида:<if test="$this->request['app'] == 'forums'">{parse expression="floor( $author['topics_started'] / 10 ) + floor( $author['posts'] / 100 )"}</if>Иначе будут ошибки на страницах личных сообщений и других страницах, где используется этот шаблон. 1 Поделиться сообщением Ссылка на сообщение
Strategius 52 01/22/17 22:31 (изменено) @Dmitriy427, проблему с floor() удалось решить, за переменные большое спасибо! Осталась проблема с несовместимостью правки файла admin/applications/members/modules_public/list/view.php из поста #8 (правка для версии 3.1.4, а для 3.4 не подходит), при открытии списка пользователей выбивает ошибку базы данных... Методом тыка определил, что проблема в строке $this->DB->build( array( 'select' => "m.member_id, {$grating}",Не хочет работать из-за {$grating}... Изменено 22 января 2017 пользователем Strategius Поделиться сообщением Ссылка на сообщение
newbie 1723 01/23/17 06:49 при открытии списка пользователей выбивает ошибку базы данных...которые логируются. Поделиться сообщением Ссылка на сообщение
Strategius 52 01/23/17 07:00 которые логируютсяА возможно ли как-нибудь сделать сортировку по рейтингу в 3.4? Очень нужна эта кнопка, хотел по умолчанию ее сделать вместо сортировки по имени :( Поделиться сообщением Ссылка на сообщение
newbie 1723 01/23/17 07:22 Я Вам про логи, Вы мне про ...Не хотите смотреть логи, сами посмотрим. Найти if ( $_queryPP ) Заменить на if ( $_queryPP or 1==1 ) Или заменить на if ( $_queryPP or $this->sort_key == 'grating') а $this->DB->build( array( 'select' => ' m.member_id',заменить на $this->DB->build( array( 'select' => 'm.member_id' . (($this->sort_key == 'grating') ? ", (FLOOR(m.posts/100) + FLOOR(pp.pp_reputation_points/10)) AS grating" : ''),Тогда $grating = "(FLOOR(m.posts/100) + FLOOR(pp.pp_reputation_points/10)) AS grating"; не нужно добавлять. 2 Поделиться сообщением Ссылка на сообщение