Re: [Релиз] AnyCode Tool (1.0.0 Beta)
Спасибо за наглядные примеры!
Правда, расширением не пользуюсь, загоняю в манифест и наслаждаюсь.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
PunBB 1.3 → Расширения v1.3 → [Релиз] AnyCode Tool (1.0.0 Beta)
Спасибо за наглядные примеры!
Правда, расширением не пользуюсь, загоняю в манифест и наслаждаюсь.
решение - today_users
хук - in_info_end
//************************************************************************
// knyshow
// список юзеров за сегодня
//************************************************************************
$todays_users = array();
$query = array(
'SELECT' => 'id, username',
'FROM' => 'users',
'WHERE' => 'last_visit>"'.strtotime(gmdate("M d Y")).'"',
'ORDER BY' => 'username'
);
$result = $forum_db->query_build($query) or error(__FILE__, __LINE__);
while(list($id, $username) = $forum_db->fetch_row($result))
{
if (!$forum_user['is_guest'])
{
$todays_users[] = '<a href="'.forum_link($forum_url['user'], $id).'">'.forum_htmlencode($username).'</a>';
}
else
{
$todays_users[] = forum_htmlencode($username);
}
}
if (!empty($todays_users))
{
?>
<div id="brd-todayonline" class="gen-content">
<h3 class="hn"><span>
<?
echo $lang_index['Today online'] . implode(', ', $todays_users);
?>
</span></h3>
</div>
<?
}расширение однозначно мастхэв. Список хукуов кроме как в сорцах посмотреть негде?
обратите внимание на название таблицы в строке
SELECT id,username FROM users WHERE...
иногда таблица называется pun_users
Лучше строить запросы при помощи штатного query-builder, во-первых запросы становятся совместимыми со всеми поддерживаемыми движком типами БД, во-вторых отпадает проблема префиксов таблиц.
Список хукуов кроме как в сорцах посмотреть негде?
вроде бы есть то ли хук эксплорер, то ли... но в сорцах проще имхо - находишь куда нужно вставить, а по близости находишь хук.
при помощи штатного query-builder
а вот с этим еще не разобрался...
UPD: кажется, уже разобрался... код в предыдущем посте изменил.
hcs, если Вам не трудно - пробегитесь глазами плиз - об этом шла речь?
knyshow, просто огромное, человеческое спасибо!
Просто спас меня ![]()
Две ложечки дёгтя. Выдает перед списком пользователей:
Notice: Undefined index: Today online in /var/www/vhosts/arsamania.ru/httpdocs/forum/index.php(347) : eval()'d code on line 40И второе - если я захожу как гость - ники пишутся просто текстом, а если из под аккаунта, то ссылками.
Добавлено спустя 2 минуты 23 секунды:
Ой, мля, с нотисом, сорри, эт я сам тупанул, надо же было язык добавить ![]()
Да, сорри что не предупредил - у меня форум двуязычный, поэтому внес в ланг-пак параметр 'Today online' == 'Сегодня были замечены:'.
И второе - если я захожу как гость - ники пишутся просто текстом
да, это тоже как бы фишка - могласно моим настройкам форума гости не могут просматривать профайл пользователя. Пока рассматривать набор прав стандартными средствами даже не представляю как и поэтому прописал жестко - если ты гость - наблюдаешь просто ники, без ссылок под ними. Если такое поведение для Вас не логично - используйте такой код хука:
//************************************************************************
// knyshow
// список юзеров за сегодня
//************************************************************************
$todays_users = array();
$query = array(
'SELECT' => 'id, username',
'FROM' => 'users',
'WHERE' => 'last_visit>"'.strtotime(gmdate("M d Y")).'"',
'ORDER BY' => 'username'
);
$result = $forum_db->query_build($query) or error(__FILE__, __LINE__);
while(list($id, $username) = $forum_db->fetch_row($result))
{
$todays_users[] = '<a href="'.forum_link($forum_url['user'], $id).'">'.forum_htmlencode($username).'</a>';
}
if (!empty($todays_users))
{
?>
<div id="brd-todayonline" class="gen-content">
<h3 class="hn"><span>
<?
echo $lang_index['Today online'] . implode(', ', $todays_users);
?>
</span></h3>
</div>
<?
}просто огромное, человеческое спасибо!
да мне-то за что? код свиснут у Garciat, подправлен hcs и вставлен в его же расширение ![]()
кстати, на информере мне тоже что-то пишут, но я не понимать ![]()
http://punbb.informer.com/forums/topic/ … ine-today/
knyshow, ну теперь спасибо окончательное и бесповоротное!!! ![]()
Надо немного обезопасить код, в частности вывод ника экранировать, ибо может содержать xss.
Добавлено спустя 1 минуту 44 секунды:
зы заменить $username на forum_htmlencode($username)
спасибо, заменил в обоих случаях.
Хорошее решение. Теперь ему не хватает цветовой раскраски по группам ![]()
а ракраски по группам я так и не нашел... м.б. что-то на информере проскакивало, но по незнанию языка...
кароче, такого, чтобы сделать админов-гадов голубыми никами, злых модераторов - желтыми... не нашел.
Все работало, и вдруг исчезло! Никаких нотисов, никаких ошибок, просто как будто нет этого решения и все! Ничего не менял, не пойму в чем причина... Заметил только, что личное сообщение пришло одно, еще постов немного оставил после установки решения... Даже не поюзал толком (( Буду разбираться.
Добавлено спустя 18 минут 1 секунду:
Грубая вставка в index.php тоже не дает результата ![]()
Оу, огромное спасибо, сильно облегчает мне жизнь.
Все работало, и вдруг исчезло! Никаких нотисов, никаких ошибок, просто как будто нет этого решения и все! Ничего не менял, не пойму в чем причина...
Аналогичная картина. Куда всё пропало?:o
повторить пока не получается ![]()
и насколько я понимаю - вариант один - пустой результат запроса к базе...
а пока предлагаю потестить http://punbb.informer.com/forums/topic/ … ine-today/
Ничего не трогал, список появился. Поведение весьма странное
Добавлено спустя 6 минут 45 секунд:
Я так понимаю решение работает с зоной сервера, без учёта зоны посетителя.
Пока что основываясь на функции format_time() из functions.php пришел вот к такому коду:
//************************************************************************
$todays_users = array();
$todays_users_diff = ($forum_user['timezone'] + ($forum_user['dst']-1)) * 3600;
$todays_users_now = time();
$query = array(
'SELECT' => 'id, username',
'FROM' => 'users',
'WHERE' => 'last_visit>"'.strtotime(gmdate('M d Y', $todays_users_now + $todays_users_diff)).'"',
'ORDER BY' => 'username'
);
$result = $forum_db->query_build($query) or error(__FILE__, __LINE__);
while(list($id, $username) = $forum_db->fetch_row($result))
{
$todays_users[] = '<a href="'.forum_link($forum_url['user'], $id).'">'.forum_htmlencode($username).'</a>';
}
if (!empty($todays_users))
{
?>
<div id="brd-online" class="gen-content">
<h3 class="hn"><span>
<?
echo $lang_index['Today online'] . implode(', ', $todays_users);
?>
</span></h3>
</div>
<?
}
//************************************************************************Поставил расширение от Garciat не отключая свой хук.
изменил для себя в таблице users поле timezone на -99 и увидел всех пользователей за 2+ суток, а блок от Garciat и дальше показывает пользователей за сегодня.
т.е. все-таки временные пояса.
Пока что основываясь на функции format_time() из functions.php пришел вот к такому коду
Тьфу-тьфу, вроде работает. А расширение от Garciat ведет себя так же, как первые варианты решений - сначала показывало список, а теперь нет.
Добавлено спустя 55 секунд:
А возможно ли отсортировать по времени последнего визита? Сейчас, как я понял, по алфавиту.
nobody, заменить строку
'ORDER BY' => 'username'для сортировки в виде: первым сегодня зашел - первый в строке:
'ORDER BY' => 'last_visit ASC'наоборот:
'ORDER BY' => 'last_visit DESC'решение - generate_country_flag_icon_from_ip
хук - vt_row_pre_post_contacts_merge
//************************************************************************
// knyshow
// определение страны автора сообщения и вывод флага страны в список контактов
//************************************************************************
$ipnum = sprintf("%u", ip2long($cur_post['poster_ip']));
$query = array(
'SELECT' => 'cc, cn',
'FROM' => 'geo_ip',
'JOINS' => array(
array(
'LEFT JOIN' => 'geo_cc',
'ON' => 'geo_ip.ci = geo_cc.ci'
),
),
'WHERE' => $ipnum . ' BETWEEN start AND end'
);
$country_info_result = $forum_db->query_build($query) or error(__FILE__, __LINE__);
if ($forum_db->num_rows($country_info_result))
{
list($cc, $cn) = $forum_db->fetch_row($country_info_result);
$forum_page['post_contacts']['CFlag'] = '<img src="'.FORUM_ROOT.'/img/flags/'.strtolower($cc).'.gif" title="'.forum_htmlencode($cn).'">';
}Для определения соотвествия ip-страна используются две вспомогательные таблицы: geo_ip и geo_cc.
Таблицы сформированы на основании данных проекта GeoLite Country согласно ими же написанному мануалу.
Эти таблицы необходимо восстановить из дампа, который находится в архиве.
Для отображения флагов использованы иконки студии FamFamFam.
Папку с иконками необходимо распаковать в каталог FORUM_ROOT/img/flags
Архив с дампом таблиц и иконками тут.

Имхо дергать страну по ип каждый раз, для каждого в топике очень накладно.
Я бы сделал немного по другому. При регистрации проверяется страна и в дополнительное поле таблицы users прописывается имя флага. Соответственно в профиле можно только подставить нужное значение в путь к иконке. Сделать инсталлер, который при установке пробежит всех юзеров и определит их страну.
Есть еще второй момент, почему сделано именно так - сообщения могут быть оставлены с разных айпи/стран. Так же решение актуально для выявления акк-шаринга.
Отчасти эти моменты и побудили создать расширение в этом виде - опирающееся на айпи, с которого было оставлено сообщение, а не на айпи регистрации.
конечно, вариант добавить поле в таблицу posts с кодом страны и дергать картинку оттуда, но пока не разберусь с движком - туда не полезу ![]()
PunBB 1.3 → Расширения v1.3 → [Релиз] AnyCode Tool (1.0.0 Beta)
Форум работает на PunBB, при поддержке Informer Technologies, Inc
Сгенерировано за 0.100 секунды (83% PHP — 17% БД) 13 запросов к базе данных
Технологии с открытым исходным кодом, несомненно, обладают серьезным преимуществом над аналогичными продуктами, распространяемыми по ограниченным лицензиям. И совершенно неважно, что это. Возможно это:
Впрочем, неважно. Что бы это ни было, важно всячески поощрять и поддерживать Open Source в любом виде. Тем более, что вы знаете, PunBB распространяется по лицензии GPL/GNU. И спасибо за внимание.