Этим сообщением начинаю серию заметок об улучшениях встроенного форума.
Основной принцип, которому собираюсь следовать - "Никаких правок ядра".
Все свои решения я буду внедрять на своем региональном сайте:
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 "
if ($authenticated_count && $max_users) {
$items = array();
while ($max_users-- && $account = db_fetch_object($authenticated_users)) {
print theme('username', $account). ", ";
}
}
print "
\n";
print "
$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 "
$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 "
$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
Комментарии
Посидел тут поразбирался, вот чуток подправил:
<?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 .= '
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 .= '
$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 .= '
$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 .= '
$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;
?>
В общем в списках пользователей исправил запятые, теперь в конце списка ставится точка
И еще самое главное в переменной
$profile_birthday
прописываем соотвественно название поля профиля отвечающего за дату рожденияок, спасибо Separator, отлично!
Отличная статья. Спасибо. Сейчас тоже работаю над улучшением формума, но ориентир - phpBB. По этому поводу много писала Natalie, а ваша статья уникальная.
Спасибо, Влад.
Я читал статьи Натали (3 части) в которых говорится о настройках форума но не о апдейтах (и отмечался там).
Мои статьи пусть будут неким их логическим продолжением
Пора книгу писать "Drupal, форум и напильник". Или хотя бы раздел в book.
разделы в book могут делать не все наверное,
у меня в "создать" доступна только "тема форума" и "запись в дневнике".
Закинул в PHP сниппеты на setegnom
Вот этот код для 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 .= '
$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 .= '
$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 .= '
$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;
?>
Помогите начинающему!
Модуль очень понравился! вот только сталкнулся с проблемой в выводе "отмечающих день рождения":
отличаются форматы записи Месяца. В $currentdayline месяц выводится двумя цифрами ( например: "07" ), а в базе модуль profile месяц пишет одной цифрой ("7").
Как заставить запрос понять что "07" и "7" одно и тоже?
Или как изменить один из форматов записи месяца чтобы было единообразно?
Заменить строку
$the_day = date('d');
на$the_day = date('j');
Подробное описание функции вывода даты здесь: function.date
Все получилось!
Спасибо огромное за ссылочку!
Вот только в моем случае надо не день, месяц скоректировать было.
$the_month = date('n');
НУ вот, скоро совсем во всем разберетесь, будете нам потом рассказывать как и что делать
а под 6 что-нибудь есть?
Смотрите комментарии чуть выше
Жаль, что 2-ю часть этого труда под 6 не сделали...
Большое спасибо Вам и Вашим комментаторам — использую drupal 6.6 — всё работает.
Хм-м-м... Оказывается, я несколько рановато радовался — решил проверить работу «поздравлялки», и оказалось, что она не работает — изначальный формат вывода месяца и числа:
$the_month = date('m');
$the_day = date('d');
Поиграл с форматом (m j, n j, n d), но, к сожалению, результата это не дало. Сам пример взят из поста job. Подскажите, пожалуйста, что ещё может быть?
Ничего не понимаю... Использую 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 .= '
$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 .= '
$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 .= '
$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;
?>
А у меня почему то с "Список пользователей празднующих сегодня день рождения" не получается вывести, вроде сделал все правильно:
создал профиль
Заголовок: Дата рождения
Имя: profile_born
Тип: дата
Категория: Персональная информация
Создал блок - вставил туда выше приведенный код. И не выводится инфа о днях рождениях
использую Дрюпал 5.х
Спасибо!
Разобрался я с отображением дней рождения в шестёрке — теперь всё работает так, как и должно. Вот код:
$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;
?>
У меня этот код выдает почему-то ошибку:
при выводе нового зарегистрированного пользователя, что-то не могу понять в чем ошибка синтаксиса?
<?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(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 .= '.';
}?>
А какая у вас версия Друпал и какая база данных?
Drupal 6.10, MySQL. Может есть где мануал по ошибкам mysql?
Это не ошибка mysql, а ошибка в коде. Функции mysqli_num_rows() не передаётся результат выполнения запроса. Вы код, приведённый мной не меняли?
А что разве не видно?
Я только изменил запрос что-бы не было одинаковых имен в списке онлайн
<?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);?>
но к этому запросу это не относится.
Значит у меня ошибки в самой базе?
DISTINCT и так должен выводить у вас по одному имени пользователя.
А-а-а, нет, не должен. О чём я говорю? Верните обратно DISTINCT и замените ниже
<?php
while ($account = db_fetch_object($authenticated_users)) {
if ($max_users > 0) {
$items[] = $account;
$max_users--;
}
$authenticated_count++;
}
?>
на
<?php
$items[$account->uid] = $account;
$authenticated_count++;
while ($account = db_fetch_object($authenticated_users)) {
if (!isset(
$items[$account->uid])) {if ($max_users > 0) {
$max_users--;
}
}
}
?>Тогда у вас не будут «двоиться» ники в списке (решение не моё, подсказал кто-то здесь).
А вот кусок кода с новичками, который замечательно работает у меня на сайте:
<?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(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";?>
Проверьте, так ли всё у вас?
Приведенный вами код со списком новичков полностью совпадает с моим. Значит ли ошибка, что неправильно обрабатывается запрос, и из этого следует, что присутствуют ошибки в таблицах самой базы?
А запрос исключение повторяющихся пользователей онлайн я подсмотрел тут http://drupal.org/node/107051
Хм... Попробуйте проверить, как выглядит таблица, к которой вы обращаетесь, и сделать запрос к ней через mysql или через phpmyadmin какой-нибудь...
Кстати, а что у вас прописано в settings для обращения к базе? Как вы к ней подключаетесь?
В общем, пока удалил этот кусок кода, через phpmyadmin запрос замечательно проходит.
А что у меня должно быть прописано в settings?
Там важно, через что друпал подключается к базе. Возможно, проблема в том, что вы не через mysqli подключаетесь.
Отличная статья! Спасибо
Спасибо!
+
У меня шестерка и код хавает без ошибок, но... ДР все равно не показывает! ((
А поле профиля, в котором хранится дата рождения, у вас правильно в коде прописано?
Вроде все ништяк... А вот не работает.
<?php
$new_user_days = 7; // Количество дней с момента регистрации, которые пользователь считается новичком
$max_users = 1000; // Максимальное количество отображаемых пользователей
$profile_birthday = 'profile_born'; // поле профиля отвечающего за дату рождения
?>
Смутно так припоминаю, что иногда Drupal глючит из-за комментариев в коде. Но это же не наш случай? Я просто скопировал то, что вами выложено тут чуть выше.
Даже не знаю, что вам посоветовать.
А как можно проверить / отладить?
<?php
echo $ifbirthday_users; ?>
выдает "Object id #20"
Выставляю себе день рождения на текущую дату в профиле, выдаёт: "Object id #42"
Object id всегда разный, смотря на какой странице находишься, среди пользователей при этом изменений нет.
<?php
echo '<pre>';
var_dump($birthday_users); ?>
Ответ:
}
<?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 "---------------";}?>
Ответ: "---------------", т.е. на условие не идет, что логично. Иначе б что-то выводило...
А у вас какой ветки Друпал вообще? Шестой или седьмой?
Спасение утопающих... эх... no comments.
Отладил. Формат строки в поле profile_values.value изменился. У кого не работает, замените значение $currentdayline
<?php
$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.'"';?>
Это у меня дата на западный манер получается. Поэтому не ловило. А как на наш переделать?
Еще никто не ответил? Ладно. Уже не надо.
Все настраивается на http://ваш_сайт/admin/settings/date-time
Ага... Поменял дату на европейский вид и... Те пользователи, что заполнили доп. поле до этой коррекции - ловятся. Те что после - нет. Надо дорабатывать код на случай смены формата даты. Я не знаю как это сделать...
Наверное напишу небольшой скрипт с двумя циклами. В одном буду считывать значение profiles_values.value, разбивать в массив mysql_fetch_array() и менять местами элементы с month и day. Хотя зачем два цикла? Сразу же и заткнуть строку обратно. Как-то так. Через зад. Рифма. Однако. Еще варианты?
Drupal 6.24
MySQL 5.0.77
Profile Module: 6.24