Улучшаем форум. Часть 1.

Аватар пользователя selff selff 27 декабря 2007 в 10:30

Этим сообщением начинаю серию заметок об улучшениях встроенного форума.
Основной принцип, которому собираюсь следовать - "Никаких правок ядра".
Все свои решения я буду внедрять на своем региональном сайте:
www.livekuban.ru/forum

Предыстория:
Мой компаньон очень любит vbulletin и считает его эталоном форумов.
В связи с этим форум друпала вызвал у него категорическое отторжение.
А вариант установки модуля drupalvb вызвал отторжение у меня,
так как у меня нет никакого желания поддерживать в будущем двух монстров
вместо одного. Поэтому я пообещал компаньону, что доведу встроенный форум
до ума и бюллетень не потребуется.

Первая задача:
Блок "Кто на сайте" по образу и подобию бюллетеня.
Я изменю блок существующий блок "Сейчас на сайте" и "Новые пользователи"
Он будет показывать информацию в таком виде:





Для решения первой задачи необходим модуль Profile,
с помощью которого надо создать поле:

Заголовок - "Дата рождения" (опционально)
Машинное имя - profile_born (обязательно)
тип - дата (обязательно)

Создаём новый блок на странице блоков в админке, и вставляем туда код:
$interval = time() - 900; // 900 - время в секундах для определения онлайн времени
$anonymous_count = sess_count($interval);
$authenticated_users = db_query('SELECT DISTINCT u.uid, u.name, s.timestamp FROM {users} u INNER JOIN {sessions} s ON u.uid = s.uid WHERE s.timestamp >= %d AND s.uid > 0 ORDER BY s.timestamp DESC', $interval);
$authenticated_count = db_num_rows($authenticated_users);
if ($anonymous_count == 1 && $authenticated_count == 1)
print t('There is currently %members and %visitors online.', array('%members' => format_plural($authenticated_count, '1 user', 'count users'), '%visitors' => format_plural($anonymous_count, '1 guest', 'count guests')));
else
print t('There are currently %members and %visitors online.', array('%members' => format_plural($authenticated_count, '1 user', 'count users'), '%visitors' => format_plural($anonymous_count, '1 guest', 'count guests')));
$max_users = 1000;
print "\n";
if ($authenticated_count && $max_users) {
$items = array();
while ($max_users-- && $account = db_fetch_object($authenticated_users)) {
print theme('username', $account). ", ";
}
}
print "\n";

print "\n";
$new_user_result = db_query('SELECT uid, name, created as timestamp FROM {users} WHERE status != 0 AND access != 0 ORDER BY created DESC' LIMIT 1);
if ($new_user = db_fetch_object($new_user_result)) {
print "Приветствуем нового пользователя: ";
print theme('username', $new_user);
}
print "\n";

print "\n";
$umax = variable_get('user_online_max',array('count'=>0,'date'=>'0'));
if ($umax['count']==0 || $umax['count']<=($authenticated_count+$anonymous_count)) {
$umax['count'] = $authenticated_count+$anonymous_count;
$umax['date'] = time();
variable_set('user_online_max',$umax);
}
print "Рекорд одновременного пребывания ".$umax['count'].", это было ".format_date($umax['date'], 'custom', 'd.m.Y в H:i', NULL).".";
print "\n";

print "\n";
$the_month = date('m');
$the_day = date('d');
$currentdayline = 'a:3:{s:5:"month";s:'.($the_month>9?2:1).':"'.$the_month.'";s:3:"day";s:'.($the_day>9?2:1).':"'.$the_day.'"';
$birthday_users = db_query('SELECT DISTINCT u.uid, u.name FROM {users} u INNER JOIN {profile_values} pv ON u.uid = pv.uid INNER JOIN {profile_fields} pf ON pv.fid = pf.fid WHERE pf.name = "profile_born" AND pv.value LIKE "%s%%" ORDER BY u.uid DESC', $currentdayline);
$birthday_count = db_num_rows($birthday_users);
if ($birthday_count) {
print "Сегодня отмечают день рождение: ";
while ($account = db_fetch_object($birthday_users)) {
print theme('username', $account). ", ";
}
}
print "\n";
?>
первая задача решена.
переходим к следующим.
продолжение - www.drupal.ru/node/10511

0 Thanks

Комментарии

Аватар пользователя Separator@drupal.org Separator@drupal.org 27 декабря 2007 в 12:34

Посидел тут поразбирался, вот чуток подправил:
<?php
$output = '';

// Количество online пользователей и гостей
$interval = time() - 900; // 900 - время в секундах для определения онлайн времени
$anonymous_count = sess_count($interval);
$authenticated_users = db_query('SELECT DISTINCT u.uid, u.name, s.timestamp FROM {users} u INNER JOIN {sessions} s ON u.uid = s.uid WHERE s.timestamp >= %d AND s.uid > 0 ORDER BY s.timestamp DESC', $interval);
$authenticated_count = db_num_rows($authenticated_users);
if ($anonymous_count == 1 && $authenticated_count == 1)
$output .= t('There is currently %members and %visitors online.', array('%members' => format_plural($authenticated_count, '1 user', 'count users'), '%visitors' => format_plural($anonymous_count, '1 guest', 'count guests')));
else
$output .= t('There are currently %members and %visitors online.', array('%members' => format_plural($authenticated_count, '1 user', 'count users'), '%visitors' => format_plural($anonymous_count, '1 guest', 'count guests')));
$max_users = 1000;
$output .= ''."\n";
if ($authenticated_count && $max_users) {
$items = array();
if ($max_users-- && $account = db_fetch_object($authenticated_users)) {
$output .= theme('username', $account);
while ($max_users-- && $account = db_fetch_object($authenticated_users)) {
$output .= ', '.theme('username', $account);
}
$output .= '.';
}
}
$output .= ''."\n";

// Список online пользователей
$output .= ''."\n";
$new_user_result = db_query('SELECT uid, name, created as timestamp FROM {users} WHERE status != 0 AND access != 0 ORDER BY created DESC LIMIT 1');
if ($new_user = db_fetch_object($new_user_result)) {
$output .= 'Приветствуем нового пользователя: ';
$output .= theme('username', $new_user);
}
$output .= ''."\n";

// Максимальное нашествие online пользователей
$output .= ''."\n";
$umax = variable_get('user_online_max', array('count' => 0, 'date' => '0'));
if ($umax['count'] == 0 || $umax['count'] <= ($authenticated_count + $anonymous_count)) {
$umax['count'] = $authenticated_count + $anonymous_count;
$umax['date'] = time();
variable_set('user_online_max', $umax);
}
$output .= 'Рекорд одновременного пребывания '.$umax['count'].', это было '.format_date($umax['date'], 'custom', 'd.m.Y в H:i', NULL).'.';
$output .= ''."\n";

// Список пользователей празднующих сегодня день рождения
$profile_birthday = 'profile_born'; // поле профиля отвечающего за дату рождения
$output .= ''."\n";
$the_month = date('m');
$the_day = date('d');
$currentdayline = 'a:3:{s:5:"month";s:'.($the_month > 9 ? 2 : 1).':"'.$the_month.'";s:3:"day";s:'.($the_day > 9 ? 2 : 1).':"'.$the_day.'"';
$birthday_users = db_query('SELECT DISTINCT u.uid, u.name FROM {users} u INNER JOIN {profile_values} pv ON u.uid = pv.uid INNER JOIN {profile_fields} pf ON pv.fid = pf.fid WHERE pf.name = "'.$profile_birthday.'" AND pv.value LIKE "%s%%" ORDER BY u.uid DESC', $currentdayline);
$birthday_count = db_num_rows($birthday_users);
if ($birthday_count) {
$output .= 'Сегодня отмечают день рождение: ';
if ($account = db_fetch_object($birthday_users)) {
$output .= theme('username', $account);
while ($account = db_fetch_object($birthday_users)) {
$output .= ', '.theme('username', $account);
}
$output .= '.';
}
}
$output .= ''."\n";

// Вывод блока
print $output;
?>

В общем в списках пользователей исправил запятые, теперь в конце списка ставится точка

Аватар пользователя Separator@drupal.org Separator@drupal.org 27 декабря 2007 в 12:37

И еще самое главное в переменной $profile_birthday прописываем соотвественно название поля профиля отвечающего за дату рождения

Аватар пользователя VladSavitsky VladSavitsky 27 декабря 2007 в 13:29

Отличная статья. Спасибо. Сейчас тоже работаю над улучшением формума, но ориентир - phpBB. По этому поводу много писала Natalie, а ваша статья уникальная.

Аватар пользователя selff selff 27 декабря 2007 в 13:40

Спасибо, Влад.
Я читал статьи Натали (3 части) в которых говорится о настройках форума но не о апдейтах (и отмечался там).
Мои статьи пусть будут неким их логическим продолжением :)

Аватар пользователя selff selff 28 декабря 2007 в 8:41

разделы в book могут делать не все наверное,
у меня в "создать" доступна только "тема форума" и "запись в дневнике".

Аватар пользователя job job 8 января 2008 в 10:50

Вот этот код для Drupal 6.x. Отличается от версии под 5.х изменениями в стандарте Drupal.

Сейчас работает на моем сайте. Можете глянуть: http://job.org.ua/.

Жаль, что на Drupal.org полезные сниппеты еще под 4.х и 5.х. Все приходится переделывать.

<?php
$new_user_days = 7; // Количество дней с момента регистрации, которые пользователь считается новичком
$max_users = 1000; // Максимальное количество отображаемых пользователей
$profile_birthday = 'profile_user_birth'; // поле профиля отвечающего за дату рождения

$output = '';

// Count users active within the defined period.
$interval = time() - variable_get('user_block_seconds_online', 900);

// Perform database queries to gather online user lists. We use s.timestamp
// rather than u.access because it is much faster.
$anonymous_count = sess_count($interval);
$authenticated_users = db_query('SELECT DISTINCT u.uid, u.name, s.timestamp FROM {users} u INNER JOIN {sessions} s ON u.uid = s.uid WHERE s.timestamp >= %d AND s.uid > 0 ORDER BY s.timestamp DESC', $interval);
$authenticated_count = 0;
$max_users = variable_get('user_block_max_list_count', 10);
$items = array();
while ($account = db_fetch_object($authenticated_users)) {
if ($max_users > 0) {
$items[] = $account;
$max_users--;
}
$authenticated_count++;
}

// Format the output with proper grammar.
if ($anonymous_count == 1 && $authenticated_count == 1) {
$output = t('There is currently %members and %visitors online.',
array('%members' => format_plural($authenticated_count, '1 user', 'count users'),
'%visitors' => format_plural($anonymous_count, '1 guest', 'count guests')));
}
else {
$output = t('There are currently %members and %visitors online.', array('%members' => format_plural($authenticated_count, '1 user', 'count users'), '%visitors' => format_plural($anonymous_count, '1 guest', 'count guests')));
}

// Display a list of currently online users.
$max_users = variable_get('user_block_max_list_count', 10);
if ($authenticated_count && $max_users) {
$output .= theme('user_list', $items, t('Online users'));
}

// Список новичков
$output .= ''."\n";
$new_user_result = db_query('
SELECT
u.uid,
u.name,
created
FROM
{users} u
WHERE
u.status != 0
AND u.access != 0
AND u.uid != 1
AND u.created >= '.mktime(0, 0, 0, date('m'), date('d') - $new_user_days, date('Y')).'
ORDER BY
u.created DESC
');
$mu = $max_users;
if ($mu-- && $account = db_fetch_object($new_user_result)) {
if (db_result($new_user_result) > 1) {
$output .= 'Приветствуем новых пользователей:
';
} else {
$output .= 'Приветствуем нового пользователя: ';
}
$output .= theme('username', $account);
while ($mu-- && $account = db_fetch_object($new_user_result)) {
$output .= ', '.theme('username', $account);
}
$output .= '.';
}
if ($new_user->uid && $new_user) {
}
$output .= ''."\n";

// Максимальное нашествие online пользователей
$output .= ''."\n";
$umax = variable_get('user_online_max', array('count' => 0, 'date' => '0'));
if ($umax['count'] == 0 || $umax['count'] <= ($authenticated_count + $anonymous_count)) {
$umax['count'] = $authenticated_count + $anonymous_count;
$umax['date'] = time();
variable_set('user_online_max', $umax);
}
$output .= 'Рекорд одновременного пребывания '.$umax['count'].', это было '.format_date($umax['date'], 'custom', 'd.m.Y в H:i', NULL).'.';
$output .= ''."\n";

// Список пользователей празднующих сегодня день рождения
$output .= ''."\n";
$the_month = date('m');
$the_day = date('d');
$currentdayline = 'a:3:{s:5:"month";s:'.($the_month > 9 ? 2 : 1).':"'.$the_month.'";s:3:"day";s:'.($the_day > 9 ? 2 : 1).':"'.$the_day.'"';
$birthday_users = db_query('SELECT DISTINCT u.uid, u.name FROM {users} u INNER JOIN {profile_values} pv ON u.uid = pv.uid INNER JOIN {profile_fields} pf ON pv.fid = pf.fid WHERE pf.name = "'.$profile_birthday.'" AND pv.value LIKE "%s%%" ORDER BY u.uid DESC', $currentdayline);
$birthday_count = db_result($birthday_users);
if ($birthday_count) {
$output .= 'Сегодня отмечают день рождение: ';
$mu = $max_users;
if ($mu-- && $account = db_fetch_object($birthday_users)) {
$output .= theme('username', $account);
while ($mu-- && $account = db_fetch_object($birthday_users)) {
$output .= ', '.theme('username', $account);
}
$output .= '.';
}
}
$output .= ''."\n";

// Вывод блока
print $output;
?>

Аватар пользователя sandyz sandyz (не проверено) 11 января 2008 в 7:52

Помогите начинающему!

Модуль очень понравился! вот только сталкнулся с проблемой в выводе "отмечающих день рождения":

отличаются форматы записи Месяца. В $currentdayline месяц выводится двумя цифрами ( например: "07" ), а в базе модуль profile месяц пишет одной цифрой ("7").
Как заставить запрос понять что "07" и "7" одно и тоже?
Или как изменить один из форматов записи месяца чтобы было единообразно?

Аватар пользователя sandyz sandyz (не проверено) 11 января 2008 в 13:06

Все получилось!
Спасибо огромное за ссылочку!

Вот только в моем случае надо не день, месяц скоректировать было.
$the_month = date('n');

:)

Аватар пользователя sandyz sandyz (не проверено) 11 января 2008 в 13:10
sandyz wrote:

Все получилось!
Спасибо огромное за ссылочку!

Вот только в моем случае надо и день и месяц скоректировать было.

$the_month = date('m');
на
$the_month = date('n');

:)

Аватар пользователя Химический Али Химический Али 20 сентября 2008 в 22:45
"gumk" wrote:

а под 6 что-нибудь есть?

Смотрите комментарии чуть выше :)

Жаль, что 2-ю часть этого труда под 6 не сделали...

Аватар пользователя Ingumsky Ingumsky 25 ноября 2008 в 21:49

Большое спасибо Вам и Вашим комментаторам — использую drupal 6.6 — всё работает.

Аватар пользователя Ingumsky Ingumsky 25 ноября 2008 в 22:06

Хм-м-м... Оказывается, я несколько рановато радовался — решил проверить работу «поздравлялки», и оказалось, что она не работает — изначальный формат вывода месяца и числа:
$the_month = date('m');
$the_day = date('d');
Поиграл с форматом (m j, n j, n d), но, к сожалению, результата это не дало. Сам пример взят из поста job. Подскажите, пожалуйста, что ещё может быть?

Аватар пользователя Ingumsky Ingumsky 30 ноября 2008 в 20:13

Ничего не понимаю... Использую Drupal 6.6. Со сниппетом у меня две проблемы:

1. В списке новичков не отображаются все новички. Имеются три новичка с именами, аналогичными следующим — asdf, asdf lkjm, вапро. asdf (имя латиницей в одной слово) зарегистрирован раньше всех, имя в списке отображается, asdf lkjm (имя латиницей в два слова) — второй по времени регистрации, имя не отображается, вапро (имя кириллицей в одной слово) — третий по времени регистрации, имя есть в списке. Не могу понять, в чём беда.

2. Проблема с днями рождения. Изменил значение переменной profile_birthday на то, которое подходит мне, отредактировал переменную $countrydayline (у меня она имеет другой формат, примерно такой — 'a:3:{s:3:"day";s:2:"27";s:5:"month";s:2:"11";s:4:"year";s:4:"2008";}';), скрипт успешно обращается к базе, получает ответ, что именинники есть (рисует строчку «Сегодня отмечают день рождения:»), однако получить список их у него не получается, хотя прямой запрос к базе работает прекрасно.

Вот мой скрипт. Посмотрите, плиз, что там не в порядке.

<?php
$new_user_days = 7; // Количество дней с момента регистрации, которые пользователь считается новичком
$max_users = 1000; // Максимальное количество отображаемых пользователей
$profile_birthday = 'profile_born'; // поле профиля отвечающего за дату рождения

$output = '';

// Count users active within the defined period.
$interval = time() - variable_get('user_block_seconds_online', 900);

// Perform database queries to gather online user lists. We use s.timestamp
// rather than u.access because it is much faster.
$anonymous_count = sess_count($interval);
$authenticated_users = db_query('SELECT DISTINCT u.uid, u.name, s.timestamp FROM {users} u INNER JOIN {sessions} s ON u.uid = s.uid WHERE s.timestamp >= %d AND s.uid > 0 ORDER BY s.timestamp DESC', $interval);
$authenticated_count = 0;
$max_users = variable_get('user_block_max_list_count', 10);
$items = array();
while ($account = db_fetch_object($authenticated_users)) {
if ($max_users > 0) {
$items[] = $account;
$max_users--;
}
$authenticated_count++;
}

// Format the output with proper grammar.
if ($anonymous_count == 1 && $authenticated_count == 1) {
$output = t('There is currently %members and %visitors online.',
array('%members' => format_plural($authenticated_count, '1 user', 'count users'),
'%visitors' => format_plural($anonymous_count, '1 guest', 'count guests')));
}
else {
$output = t('There are currently %members and %visitors online.', array('%members' => format_plural($authenticated_count, '1 user', 'count users'), '%visitors' => format_plural($anonymous_count, '1 guest', 'count guests')));
}

// Display a list of currently online users.
$max_users = variable_get('user_block_max_list_count', 10);
if ($authenticated_count && $max_users) {
$output .= theme('user_list', $items, t('Online users'));
}

// Список новичков
$output .= ''."\n";
$new_user_result = db_query('SELECT u.uid, u.name, u.created FROM {users} u WHERE u.status != 0 AND u.access != 0 AND u.uid != 1 AND u.created >= '.mktime(0, 0, 0, date('m'), date('d') - $new_user_days, date('Y')).' ORDER BY u.created DESC');
$mu = $max_users;
if ($mu-- && $account = db_fetch_object($new_user_result)) {
if (db_result($new_user_result) > 1) {
$output .= 'Приветствуем новых пользователей:
';
} else {
$output .= 'Приветствуем нового пользователя: ';
}
$output .= theme('username', $account);
while ($mu-- && $account = db_fetch_object($new_user_result)) {
$output .= ', '.theme('username', $account);
}
$output .= '.';
}
if ($new_user->uid && $new_user) {
}
$output .= ''."\n";

// Максимальное нашествие online пользователей
$output .= ''."\n";
$umax = variable_get('user_online_max', array('count' => 0, 'date' => '0'));
if ($umax['count'] == 0 || $umax['count'] <= ($authenticated_count + $anonymous_count)) {
$umax['count'] = $authenticated_count + $anonymous_count;
$umax['date'] = time();
variable_set('user_online_max', $umax);
}
$output .= 'Рекорд одновременного пребывания '.$umax['count'].', это было '.format_date($umax['date'], 'custom', 'd.m.Y в H:i', NULL).'.';
$output .= ''."\n";

// Список пользователей празднующих сегодня день рождения
$output .= ''."\n";
$the_month = date('n');
$the_day = date('d');
$currentdayline = 'a:3:{s:3:"day";s:'.($the_day > 9 ? 2 : 1).':"'.$the_day.'";s:5:"month";s:'.($the_month > 9 ? 2 : 1).':"'.$the_month.'"';
$birthday_users = db_query('SELECT DISTINCT u.uid, u.name FROM {users} u INNER JOIN {profile_values} pv ON u.uid = pv.uid INNER JOIN {profile_fields} pf ON pv.fid = pf.fid WHERE pf.name = "'.$profile_birthday.'" AND pv.value LIKE "%s%%" ORDER BY u.uid DESC', $currentdayline);
$birthday_count = db_result($birthday_users);
if ($birthday_count) {
$output .= 'Сегодня отмечают день рождения: ';
$mu = $max_users;
if ($mu-- && $account = db_fetch_object($birthday_users)) {
$output .= theme('username', $account);
while ($mu-- && $account = db_fetch_object($birthday_users)) {
$output .= ', '.theme('username', $account);
}
$output .= '.';
}
}
$output .= ''."\n";

// Вывод блока
print $output;
?>

Аватар пользователя stolz stolz 1 декабря 2008 в 20:17

А у меня почему то с "Список пользователей празднующих сегодня день рождения" не получается вывести, вроде сделал все правильно:
создал профиль
Заголовок: Дата рождения
Имя: profile_born
Тип: дата
Категория: Персональная информация
Создал блок - вставил туда выше приведенный код. И не выводится инфа о днях рождениях
использую Дрюпал 5.х

Аватар пользователя ingumsky@drupal.org ingumsky@drupal.org 26 декабря 2008 в 22:12

Разобрался я с отображением дней рождения в шестёрке — теперь всё работает так, как и должно. Вот код:

<?php
    $new_user_days = 7; // Количество дней с момента регистрации, которые пользователь считается новичком
    $max_users = 1000; // Максимальное количество отображаемых пользователей
    $profile_birthday = 'profile_born'; // поле профиля отвечающего за дату рождения

    $output = '';
   
          // Count users active within the defined period.
          $interval = time() - variable_get('user_block_seconds_online', 900);

          // Perform database queries to gather online user lists.  We use s.timestamp
          // rather than u.access because it is much faster.
          $anonymous_count = sess_count($interval);
          $authenticated_users = db_query('SELECT DISTINCT u.uid, u.name, s.timestamp FROM {users} u INNER JOIN {sessions} s ON u.uid = s.uid WHERE s.timestamp >= %d AND s.uid > 0 ORDER BY s.timestamp DESC', $interval);
          $authenticated_count = 0;
          $max_users = variable_get('user_block_max_list_count', 10);
          $items = array();
          while ($account = db_fetch_object($authenticated_users)) {
            if ($max_users > 0) {
              $items[] = $account;
              $max_users--;
            }
            $authenticated_count++;
          }

          // Format the output with proper grammar.
          if ($anonymous_count == 1 && $authenticated_count == 1) {
            $output = t('There is currently %members and %visitors online.',
            array('%members' => format_plural($authenticated_count, '1 user', 'count users'),
            '%visitors' => format_plural($anonymous_count, '1 guest', 'count guests')));
          }
          else {
            $output = t('There are currently %members and %visitors online.', array('%members' => format_plural($authenticated_count, '1 user', 'count users'), '%visitors' => format_plural($anonymous_count, '1 guest', 'count guests')));
          }

          // Display a list of currently online users.
          $max_users = variable_get('user_block_max_list_count', 10);
          if ($authenticated_count && $max_users) {
            $output .= theme('user_list', $items, t('Online users'));
          }

    // Список новичков
    $output .= '<div id="my_block_users_new">'."\n";
    $new_user_result = db_query('SELECT u.uid, u.name, u.created FROM {users} u WHERE u.status != 0 AND u.access != 0 AND u.uid != 1 AND u.created >= '.mktime(0, 0, 0, date('m'), date('d') - $new_user_days, date('Y')).' ORDER BY u.created DESC');
    $mu = $max_users;
    if ($mu-- && $account = db_fetch_object($new_user_result)) {
        //if (db_result($new_user_result) > 1) {
        if (mysqli_num_rows($new_user_result) > 1) {
            $output .= 'Приветствуем новых пользователей: <br/>';
        } else {
           $output .= 'Приветствуем нового пользователя: ';
        }
        $output .= theme('username', $account);
        while ($mu-- && $account = db_fetch_object($new_user_result)) {
            $output .= ', '.theme('username', $account);
        }
        $output .= '.';
    }
    if ($new_user->uid && $new_user) {
    }
    $output .= '</div>'."\n";

    // Максимальное нашествие online пользователей
    $output .= '<div id="my_block_users_maximum">'."\n";
    $umax = variable_get('user_online_max', array('count' => 0, 'date' => '0'));
    if ($umax['count'] == 0 || $umax['count'] <= ($authenticated_count + $anonymous_count)) {
        $umax['count'] = $authenticated_count + $anonymous_count;
        $umax['date'] = time();
        variable_set('user_online_max', $umax);
    }
    $output .= 'Рекорд одновременного пребывания <strong>'.$umax['count'].'</strong>, это было <span class="date">'.format_date($umax['date'], 'custom', 'd.m.Y в H:i', NULL).'</span>.';
    $output .= '</div>'."\n";

    // Список пользователей, празднующих сегодня день рождения
    $output .= '<div id="my_block_users_birthday">'."\n";
    $the_month = date('n');
    $the_day = date('d');
    $currentdayline = 'a:3:{s:3:"day";s:'.($the_day > 9 ? 2 : 1).':"'.$the_day.'";s:5:"month";s:'.($the_month > 9 ? 2 : 1).':"'.$the_month.'"';
    $ifbirthday_users = db_query_range('SELECT DISTINCT pv.uid FROM {profile_values} pv INNER JOIN {profile_fields} pf ON pv.fid = pf.fid WHERE pf.name = "'.$profile_birthday.'" AND pv.value LIKE "%s%%"', $currentdayline,0,1);
    $birthday_users = db_query('SELECT DISTINCT u.uid, u.name FROM {users} u INNER JOIN {profile_values} pv ON u.uid = pv.uid INNER JOIN {profile_fields} pf ON pv.fid = pf.fid WHERE pf.name = "'.$profile_birthday.'" AND pv.value LIKE "%s%%" ORDER BY u.uid DESC', $currentdayline);
    $birthday_count = db_result($ifbirthday_users);
    if ($birthday_count) {
        $output .= 'Поздравляем с Днём рождения: ';
        $mu = $max_users;
        if ($mu-- && $account = db_fetch_object($birthday_users)) {
         $output .= ''.theme('username', $account);
          while ($mu-- && $account = db_fetch_object($birthday_users)) {
              $output .= ', '.theme('username', $account);
          }
            $output .= '.';
       }
    }
    $output .= '</div>'."\n";
   
    // Вывод блока
    print $output;
?>

Аватар пользователя dimmer dimmer 10 апреля 2009 в 23:20

У меня этот код выдает почему-то ошибку:

warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, resource given in /home/book/site/includes/common.inc(1645) : eval()'d code on line 49.

при выводе нового зарегистрированного пользователя, что-то не могу понять в чем ошибка синтаксиса?

<?php   $new_user_result db_query('SELECT u.uid, u.name, u.created FROM {users} u WHERE u.status != 0 AND u.access != 0 AND u.uid != 1 AND u.created >= '.mktime(000date('m'), date('d') - $new_user_daysdate('Y')).' ORDER BY u.created DESC');
    
$mu $max_users;
    if (
$mu-- && $account db_fetch_object($new_user_result)) {
        
//if (db_result($new_user_result) > 1) {
        
if (mysqli_num_rows($new_user_result) > 1) {
            
$output .= 'Приветствуем новых пользователей: <br/>';
        } else {
           
$output .= 'Приветствуем нового пользователя: ';
        }
        
$output .= theme('username'$account);
        while (
$mu-- && $account db_fetch_object($new_user_result)) {
            
$output .= ', '.theme('username'$account);
        }
        
$output .= '.';
    }
?>
Аватар пользователя ingumsky@drupal.org ingumsky@drupal.org 13 апреля 2009 в 1:14

Это не ошибка mysql, а ошибка в коде. Функции mysqli_num_rows() не передаётся результат выполнения запроса. Вы код, приведённый мной не меняли?

Аватар пользователя dimmer dimmer 13 апреля 2009 в 3:09

А что разве не видно?
Я только изменил запрос что-бы не было одинаковых имен в списке онлайн

<?php $authenticated_users db_query('SELECT u.uid, u.name, MAX(s.timestamp) AS max_timestamp FROM {users}
 u INNER JOIN {sessions} s ON u.uid = s.uid WHERE s.timestamp >= %d AND s.uid > 0 GROUP BY u.uid, u.name 
ORDER BY max_timestamp DESC'
$interval);?>

вместо

<?php $authenticated_users db_query('SELECT DISTINCT u.uid, u.name, s.timestamp FROM {users} u INNER JOIN 
{sessions} s ON u.uid = s.uid WHERE s.timestamp >= %d AND s.uid > 0 ORDER BY s.timestamp DESC'
$interval);?>

но к этому запросу это не относится.

Значит у меня ошибки в самой базе?

Аватар пользователя ingumsky@drupal.org ingumsky@drupal.org 14 апреля 2009 в 15:32

А-а-а, нет, не должен. О чём я говорю? Верните обратно DISTINCT и замените ниже

<?php
while ($account db_fetch_object($authenticated_users)) {
            if (
$max_users 0) {
              
$items[] = $account;
              
$max_users--;
            }
            
$authenticated_count++;
          }
?>

на

<?php
while ($account db_fetch_object($authenticated_users)) {

            if (!isset(

$items[$account->uid])) { 
              if (
$max_users 0) {

              

$items[$account->uid] = $account
              
$max_users--;

              }

              

$authenticated_count++;

            }

          }

?>

Тогда у вас не будут «двоиться» ники в списке (решение не моё, подсказал кто-то здесь).
А вот кусок кода с новичками, который замечательно работает у меня на сайте:

<?php    // Список новичков
    
$output .= '<div id="my_block_users_new">'."\n";
    
$new_user_result db_query('SELECT u.uid, u.name, u.created FROM {users} u WHERE u.status != 0 AND u.access != 0 AND u.uid != 1 AND u.created >= '.mktime(000date('m'), date('d') - $new_user_daysdate('Y')).' ORDER BY u.created DESC');
    
$mu $max_users;
    if (
$mu-- && $account db_fetch_object($new_user_result)) {
        
//if (db_result($new_user_result) > 1) {
        
if (mysqli_num_rows($new_user_result) > 1) {
            
$output .= 'Приветствуем новых пользователей: <br/>';
        } else {
           
$output .= 'Приветствуем нового пользователя: ';
        }
        
$output .= theme('username'$account);
        while (
$mu-- && $account db_fetch_object($new_user_result)) {
            
$output .= ', '.theme('username'$account);
        }
        
$output .= '.';
    }
    if (
$new_user->uid && $new_user) {
    }
    
$output .= '</div>'."\n";?>

Проверьте, так ли всё у вас?

Аватар пользователя dimmer dimmer 16 апреля 2009 в 2:16

Приведенный вами код со списком новичков полностью совпадает с моим. Значит ли ошибка, что неправильно обрабатывается запрос, и из этого следует, что присутствуют ошибки в таблицах самой базы?

А запрос исключение повторяющихся пользователей онлайн я подсмотрел тут http://drupal.org/node/107051

Аватар пользователя ingumsky@drupal.org ingumsky@drupal.org 16 апреля 2009 в 13:17

Хм... Попробуйте проверить, как выглядит таблица, к которой вы обращаетесь, и сделать запрос к ней через mysql или через phpmyadmin какой-нибудь...

Кстати, а что у вас прописано в settings для обращения к базе? Как вы к ней подключаетесь?

Аватар пользователя dimmer dimmer 19 апреля 2009 в 23:29

В общем, пока удалил этот кусок кода, через phpmyadmin запрос замечательно проходит.
А что у меня должно быть прописано в settings?

Аватар пользователя ingumsky@drupal.org ingumsky@drupal.org 20 апреля 2009 в 21:33

Там важно, через что друпал подключается к базе. Возможно, проблема в том, что вы не через mysqli подключаетесь.

Аватар пользователя Shizuku Shizuku 18 февраля 2012 в 17:27
"<a href="mailto:ingumsky@drupal.org">ingumsky@drupal.org</a>" wrote:

Разобрался я с отображением дней рождения в шестёрке — теперь всё работает так, как и должно.

У меня шестерка и код хавает без ошибок, но... ДР все равно не показывает! ((

Аватар пользователя Shizuku Shizuku 18 февраля 2012 в 20:48

Вроде все ништяк... А вот не работает.

    $new_user_days 7// Количество дней с момента регистрации, которые пользователь считается новичком
    
$max_users 1000// Максимальное количество отображаемых пользователей
    
$profile_birthday 'profile_born'// поле профиля отвечающего за дату рождения
?>

Смутно так припоминаю, что иногда Drupal глючит из-за комментариев в коде. Но это же не наш случай? Я просто скопировал то, что вами выложено тут чуть выше.

Аватар пользователя Shizuku Shizuku 19 февраля 2012 в 12:49

А как можно проверить / отладить?

<?php
echo $ifbirthday_users?>

выдает "Object id #20"
Выставляю себе день рождения на текущую дату в профиле, выдаёт: "Object id #42"

Object id всегда разный, смотря на какой странице находишься, среди пользователей при этом изменений нет.

<?php
echo '<pre>';
var_dump($birthday_users); ?>

Ответ:

object(mysqli_result)#16 (0) {
}
<?php
echo '<pre>';
var_dump($currentdayline); ?>

Ответ:
string(43) "a:3:{s:3:"day";s:2:"19";s:5:"month";s:1:"2

<?php
echo $birthday_count;?>

- вообще ничего не выводит. Даже ноля.

Вставил проверку условия:

<?php
if ($birthday_count) {echo "!!!!!!!!!!!";} else {echo "---------------";}?>

Ответ: "---------------", т.е. на условие не идет, что логично. Иначе б что-то выводило...

Аватар пользователя Shizuku Shizuku 19 февраля 2012 в 16:46

Спасение утопающих... эх... no comments.

Отладил. Формат строки в поле profile_values.value изменился. У кого не работает, замените значение $currentdayline

<?php
$currentdayline 
'a:3:{s:5:"month";s:'.($the_month 1).':"'.$the_month.'";s:3:"day";s:'.($the_day 1).':"'.$the_day.'"';?>

Это у меня дата на западный манер получается. Поэтому не ловило. А как на наш переделать?

Еще никто не ответил? Ладно. Уже не надо.

Все настраивается на http://ваш_сайт/admin/settings/date-time

Ага... Поменял дату на европейский вид и... Те пользователи, что заполнили доп. поле до этой коррекции - ловятся. Те что после - нет. Надо дорабатывать код на случай смены формата даты. Я не знаю как это сделать...

Наверное напишу небольшой скрипт с двумя циклами. В одном буду считывать значение profiles_values.value, разбивать в массив mysql_fetch_array() и менять местами элементы с month и day. Хотя зачем два цикла? Сразу же и заткнуть строку обратно. Как-то так. Через зад. Рифма. Однако. Еще варианты?

Drupal 6.24
MySQL 5.0.77
Profile Module: 6.24