Уважаемые пользователи!
C 7 ноября 2020 года phpBB Group прекратила выпуск обновлений и завершила дальнейшее развитие phpBB версии 3.2.
С 1 августа 2024 года phpBB Group прекращает поддержку phpBB 3.2 на официальном сайте.
Сайт официальной русской поддержки phpBB Guru продолжит поддержку phpBB 3.2 до 31 декабря 2024 года.
С учетом этого, настоятельно рекомендуется обновить конференции до версии 3.3.

[alpha] AutoBirthdays(AutoTopic) addon

Здесь авторы постили бета-версии своих модификаций для phpBB 2.0.x. Внимание! Не устанавливайте бета-версии модов на работающие форумы!
Аватара пользователя
surgeon
phpBB 1.4.3
Сообщения: 87
Стаж: 19 лет 4 месяца

Сообщение surgeon »

UNION SELECT
Если не ошибаюсь юнионы появились в mysql >=4.1, скорее всего у тя база 4.0xx или 3.сгаком ;)
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16358
Стаж: 17 лет 11 месяцев
Откуда: Красноярск
Благодарил (а): 521 раз
Поблагодарили: 1741 раз

Сообщение rxu »

Установил. Пришлось немного поработать головой и потанцевать с бубном.
В файле root/includes/functions_autobirthday.php, строка 137:

Код: Выделить всё

include('functions_post.php');
лучше заменить на

Код: Выделить всё

include($phpbb_root_path . 'includes/functions_post.' . $phpEx);
и в index.php заменил

Код: Выделить всё

include($phpbb_root_path . 'includes/functions_autobirthday.php');
на

Код: Выделить всё

include($phpbb_root_path . 'includes/functions_autobirthday.' . $phpEx);
Кроме того, захотелось, чтобы каждый раз создавались новые темы по образцу "(имя), с Днем Рождения!". Для этого пришлось исправить в includes/functions_autobirthday.php строку:

Код: Выделить всё

$topic_title = addslashes(htmlspecialchars($bday_config['grats_topic_name']));
изложив ее в следующей редакции:

Код: Выделить всё

$topic_title = addslashes(htmlspecialchars($user_birthday_data['username'] . ',' .  ' ' . $bday_config['grats_topic_name']));
а в админке название темы изложить как "с Днем Рождения!".

В таком ракурсе на первый взгляд все работает, продолжаем проверки и тесты ;)
Изображение
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16358
Стаж: 17 лет 11 месяцев
Откуда: Красноярск
Благодарил (а): 521 раз
Поблагодарили: 1741 раз

Сообщение rxu »

Да, еще одно забыл. В includes/functions_autobirthday.php в строке

Код: Выделить всё

$sql = "INSERT INTO " . TOPICS_TABLE . " (topic_title, topic_poster, topic_time, forum_id, topic_status, topic_type, topic_vote) VALUES ('$topic_title', $user_id, $current_time, $forum_id, $topic_locked, $topic_type, false)";
последний параметр (false) пришлось заключить в апострофы (т.е. написАть 'false').
Изображение
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16358
Стаж: 17 лет 11 месяцев
Откуда: Красноярск
Благодарил (а): 521 раз
Поблагодарили: 1741 раз

Сообщение rxu »

bbCode при автосоздании темы не обрабатывается. Надо искать, почему.

Добавлено спустя 45 минут 57 секунд:

Вот функция из functions_autobirthday.php:
// Функция выбирает поздравление на основании пола, создаёт пост и обновляет статистику
function create_grats_post($existed, $topic_id, $bday_config, $user_birthday_data, $current_time)
{
// по $user_ip и $post_username можно будет узнать кто в действительности поздравил чела :)
// Иными словами - тот, кто открыл index.php и вызвал эту функцию.
global $db, $user_ip, $userdata;

include($phpbb_root_path . 'includes/functions_post.' . $phpEx);

$bbcode_on = 1;
$html_on = 0;
$attach_sig = 1;
$smilies_on = $bday_config['allowsmilies'];
$forum_id = $bday_config['grats_forum_id'];
$user_id = $bday_config['from_id'];
$post_subject = addslashes(htmlspecialchars($bday_config['grats_topic_name']));

$post_username = $userdata['username'];

switch ($user_birthday_data['user_gender'])
{
case 1:
$post_message = $bday_config['grats_text_male'];
$bbcode_uid = $bday_config['bbcode_grats_text_male'];
break;

case 2:
$post_message = $bday_config['grats_text_female'];
$bbcode_uid = $bday_config['bbcode_grats_text_female'];
break;

default :
$post_message = $bday_config['grats_text'];
$bbcode_uid = $bday_config['bbcode_grats_text'];
break;
}
$post_message = addslashes(sprintf($post_message, $user_birthday_data['username']));

$sql = "INSERT INTO " . POSTS_TABLE . " (topic_id, forum_id, poster_id, post_username, post_time, poster_ip, enable_bbcode, enable_html, enable_smilies, enable_sig) VALUES ($topic_id, $forum_id, $user_id, '$post_username', $current_time, '$user_ip', $bbcode_on, $html_on, $smilies_on, $attach_sig)";

if (!$db->sql_query($sql, BEGIN_TRANSACTION))
{
message_die(GENERAL_ERROR, 'Error in posting', '', __LINE__, __FILE__, $sql);
}

$post_id = $db->sql_nextid();

$sql = "INSERT INTO " . POSTS_TEXT_TABLE . " (post_id, post_subject, bbcode_uid, post_text) VALUES ($post_id, '$post_subject', '$bbcode_uid', '$post_message')";

if (!$db->sql_query($sql))
{
message_die(GENERAL_ERROR, 'Error in posting', '', __LINE__, __FILE__, $sql);
}
// В поиск слова не добавляем, нафик надо. :)



// Заключительный этап - обновление статистики
$mode = $existed ? 'reply' : 'newtopic';
update_post_stats($mode, $empty, $forum_id, $topic_id, $post_id, $user_id);

}
Подскажите, что исправить, чтобы bbCode обрабатывался, плиз.
Изображение
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16358
Стаж: 17 лет 11 месяцев
Откуда: Красноярск
Благодарил (а): 521 раз
Поблагодарили: 1741 раз

Сообщение rxu »

Пришлось делать самому. Получился гибрид из сабжа и мода [Function] Insert Post (specials thanks to Егор Наклоняев за "наводку ;) )
В итоге в includes/functions_autobirthday.php ставятся в комментарий (или удаляются) функции function create_grats_topic и function create_grats_post. Они заменяются следующим кодом:

Код: Выделить всё

function create_grats_topic( 
    $user_birthday_data,
    $user_attach_sig = 1, 
    $topic_type = POST_NORMAL, 
    $do_notification = false, 
    $notify_user = false, 
    $current_time = 0, 
    $error_die_function = '', 
    $html_on = 0, 
    $bbcode_on = 1, 
    $smilies_on = 1 )
{
    global $db, $board_config, $user_ip, $lang, $userdata;

    // initialise some variables
    $topic_vote = 0; 
    $poll_title = '';
    $poll_options = '';
    $poll_length = '';
    $mode = 'reply'; 


         $sql = "SELECT *
	        	FROM " . AUTOBIRTHDAY_CONFIG_TABLE;

         if(!$result = $db->sql_query($sql))
         {
             message_die(CRITICAL_ERROR, 'Could not query birthday config information', "", __LINE__, __FILE__, $sql);
         }
	 while( $row = $db->sql_fetchrow($result) )
	 {
		$config_name = $row['config_name'];
		$config_value = $row['config_value'];
		$bday_config[$config_name] = $config_value;
         }
         $forum_id = $bday_config['grats_forum_id'];
         $subject = addslashes(htmlspecialchars($bday_config['grats_topic_name']));
         $subject = addslashes(sprintf($subject, $user_birthday_data['username']));
         $user_id = $bday_config['from_id'];


   // Проверяем, есть ли форум, ID которого пытался нам впарить админ
   $sql = "SELECT COUNT(forum_id) AS existed
	  		FROM " . FORUMS_TABLE . "
          	WHERE forum_id = $forum_id";

   if(!$result = $db->sql_query($sql))
   {

	message_die(CRITICAL_ERROR, "Could not select forum_id($forum_id) in create_grats_topic()", "", __LINE__, __FILE__, $sql);

   }

   $count = $db->sql_fetchrow($result);
   if ( !$count['existed'] )
   {
      message_die(GENERAL_ERROR, $lang['no_grats_forum_users']);
   }

  $username = $userdata['username'];

switch ($user_birthday_data['user_gender'])
{
       case 1:
            $message = $bday_config['grats_text_male'];
            $bbcode_uid = ($bbcode_on) ? make_bbcode_uid() : '';
            break;

       case 2:
            $message = $bday_config['grats_text_female'];
            $bbcode_uid = ($bbcode_on) ? make_bbcode_uid() : '';
            break;

      default :
            $message = $bday_config['grats_text'];
            $bbcode_uid = ($bbcode_on) ? make_bbcode_uid() : '';
            break;
}


    $error_die_function = ($error_die_function == '') ? "message_die" : $error_die_function;
    $current_time = ($current_time == 0) ? time() : $current_time;
    
    // parse the message and the subject (belt & braces :)
    $message = addslashes(sprintf($message, $user_birthday_data['username']));
    $message = addslashes(unprepare_message($message));
    $message = prepare_message(trim($message), $html_on, $bbcode_on, $smilies_on, $bbcode_uid);
    $subject = addslashes(unprepare_message(trim($subject)));
    $username = addslashes(unprepare_message(trim($username)));
    
    // fix for \" in username - wineknow.com
    $username = str_replace("\\\"","\"", $username);    
    
    // if this is a new topic then insert the topic details

   $sql = "SELECT topic_id, topic_title
	  		FROM " . TOPICS_TABLE . "
          	WHERE forum_id = $forum_id
          	AND topic_title = '$subject'";

   if(!$result = $db->sql_query($sql))
   {

	message_die(CRITICAL_ERROR, 'Could not select topic_title in create_grats_topic()', "", __LINE__, __FILE__, $sql);

   }

elseif (!($row = $db->sql_fetchrow($result)))
    {
        $mode = 'newtopic'; 
        $sql = "INSERT INTO " . TOPICS_TABLE . " (topic_title, topic_poster, topic_time, forum_id, topic_status, topic_type, topic_vote) VALUES ('$subject', " . $user_id . ", $current_time, $forum_id, " . TOPIC_UNLOCKED . ", $topic_type, $topic_vote)";
        if ( !$db->sql_query($sql, BEGIN_TRANSACTION) )
        {
            $error_die_function(GENERAL_ERROR, 'Error in posting', '', __LINE__, __FILE__, $sql);
        }
        $topic_id = $db->sql_nextid();
    }
else $topic_id = $row['topic_id'];

    // insert the post details using the topic id
    $sql = "INSERT INTO " . POSTS_TABLE . " (topic_id, forum_id, poster_id, post_username, post_time, poster_ip, enable_bbcode, enable_html, enable_smilies, enable_sig) VALUES ($topic_id, $forum_id, " . $user_id . ", '$username', $current_time, '$user_ip', $bbcode_on, $html_on, $smilies_on, $user_attach_sig)";
    if ( !$db->sql_query($sql, BEGIN_TRANSACTION) )
    {
        $error_die_function(GENERAL_ERROR, 'Error in posting', '', __LINE__, __FILE__, $sql);
    }
    $post_id = $db->sql_nextid();
    
    // insert the actual post text for our new post
    $sql = "INSERT INTO " . POSTS_TEXT_TABLE . " (post_id, post_subject, bbcode_uid, post_text) VALUES ($post_id, '$subject', '$bbcode_uid', '$message')";
    if ( !$db->sql_query($sql, BEGIN_TRANSACTION) )
    {
        $error_die_function(GENERAL_ERROR, 'Error in posting', '', __LINE__, __FILE__, $sql);
    }
    
    // update the post counts etc.
    $newpostsql = ($mode == 'newtopic') ? ',forum_topics = forum_topics + 1' : '';
    $sql = "UPDATE " . FORUMS_TABLE . " SET 
                forum_posts = forum_posts + 1,
                forum_last_post_id = $post_id
                $newpostsql 	
            WHERE forum_id = $forum_id";
    if ( !$db->sql_query($sql, BEGIN_TRANSACTION) )
    {
        $error_die_function(GENERAL_ERROR, 'Error in posting', '', __LINE__, __FILE__, $sql);
    }
    
    // update the first / last post ids for the topic
    $first_post_sql = ( $mode == 'newtopic' ) ? ", topic_first_post_id = $post_id  " : ' , topic_replies=topic_replies+1'; 
    $sql = "UPDATE " . TOPICS_TABLE . " SET 
                topic_last_post_id = $post_id 
                $first_post_sql
            WHERE topic_id = $topic_id";
    if ( !$db->sql_query($sql, BEGIN_TRANSACTION) )
    {
        $error_die_function(GENERAL_ERROR, 'Error in posting', '', __LINE__, __FILE__, $sql);
    }
    
    // update the user's post count and commit the transaction
    $sql = "UPDATE " . USERS_TABLE . " SET 
                user_posts = user_posts + 1
            WHERE user_id = $user_id";
    if ( !$db->sql_query($sql, END_TRANSACTION) )
    {
        $error_die_function(GENERAL_ERROR, 'Error in posting', '', __LINE__, __FILE__, $sql);
    }
    
    // add the search words for our new post
    switch ($board_config['version'])
    {
        case '.0.0' : 
        case '.0.1' : 
        case '.0.2' : 
        case '.0.3' : 
            add_search_words($post_id, stripslashes($message), stripslashes($subject));
            break;
        
        default :
            add_search_words('', $post_id, stripslashes($message), stripslashes($subject));
            break;
    }
    
    // do we need to do user notification
    if ( ($mode == 'reply') && $do_notification )
    {
        $post_data = array();
        user_notification($mode, $post_data, $subject, $forum_id, $topic_id, $post_id, $notify_user);
    }
    
    // if all is well then return the id of our new post
    return array('post_id'=>$post_id, 'topic_id'=>$topic_id);
}
Проверено и работает на версии 2.0.20. Кроме корректной обработки BBCode, также можно использовать %s вместо имени пользователя в названии темы, задаваемом в админке. В этом варианте изменения в код файла includes/functions_autobirthday.php, внесенные мной в предыдущих постах, отменяются (естественно).

Добавлено спустя 24 минуты 18 секунд:

Теперь нужно сделать так, чтобы:
1) поздравления выбирались не (или не только) в зависимости от пола, а из набора, скажем, 10-15 разных поздравлений, случайно или по порядку, во избежание повторов (особенно неудобно, когда у нескольких юзеров дни рождения одновременно или подряд).

2) поздравления создавались и для тех пользоватлей, у которых день рождения прошел, но поздравление не было создано ввиду отсутствия посетителей (пример: форум корпоративный, в конторе выходной, посетителей нет, и автопоздравление имениннику в этот день не создалось).
fskon
phpBB 2.0.2
Сообщения: 333
Стаж: 17 лет 10 месяцев
Откуда: msk.reg.ru

Сообщение fskon »

Подтверждаю что на пред странице...

Код: Выделить всё

phpBB : Critical Error 

Could not query birthday config information in admin_birthdays

DEBUG MODE

SQL Error : 1146 Table 'phpBB.autobirthday_config' doesn't exist

SELECT * FROM phpBB_bbconfig WHERE config_name LIKE 'bday%' UNION SELECT * FROM autobirthday_config

Line : 213
File : admin_birthdays.php 
Установил с последними изменениями на этой странице.

PHP: 5.1.1
MySQL: 5.0.16-nt
:cry:
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16358
Стаж: 17 лет 11 месяцев
Откуда: Красноярск
Благодарил (а): 521 раз
Поблагодарили: 1741 раз

Сообщение rxu »

fskon, так у Вас ошибка совсем другая - таблица autobirthday_config не существует. При установке мода файл db_update.php в корень форума копировали, запускали?

Добавлено спустя 1 час 50 минут 11 секунд:

По поводу того, чтобы
из набора, скажем, 10-15 разных поздравлений, случайно или по порядку, во избежание повторов
решается заменой кода

Код: Выделить всё

switch ($user_birthday_data['user_gender']) 
{ 
       case 1: 
            $message = $bday_config['grats_text_male']; 
            $bbcode_uid = ($bbcode_on) ? make_bbcode_uid() : ''; 
            break; 

       case 2: 
            $message = $bday_config['grats_text_female']; 
            $bbcode_uid = ($bbcode_on) ? make_bbcode_uid() : ''; 
            break; 

      default : 
            $message = $bday_config['grats_text']; 
            $bbcode_uid = ($bbcode_on) ? make_bbcode_uid() : ''; 
            break; 
}
на код

Код: Выделить всё

$sql = "SELECT * FROM " . AUTOBIRTHDAY_CONFIG_TABLE . " WHERE config_name LIKE 'grats_text%' ORDER BY RAND() LIMIT 1";
if ( !($result = $db->sql_query($sql)) )
		{
			message_die(GENERAL_ERROR, 'Could not obtain congratulation text', '', __LINE__, __FILE__, $sql);
		}
		$row = $db->sql_fetchrow($result);

	$message = $row['config_value'];

    $bbcode_uid = ($bbcode_on) ? make_bbcode_uid() : '';
При этом поздравления не зависят от пола, а набор поздравлений для случайного выбора организуется путем добавления в таблицу autobirthday_config параметров под именами grats_text_1 ... grats_text_n (n штук) со значениями в виде текстов поздравлений, через phpmyadmin.

Теоретически, код можно приспособить и под случайную выборку поздравлений в зависимости от пола, выглядеть будет примерно вот так:

Код: Выделить всё

switch ($user_birthday_data['user_gender']) 
{ 
       case 1: 
$sql = "SELECT * FROM " . AUTOBIRTHDAY_CONFIG_TABLE . " WHERE config_name LIKE 'grats_text_male%' ORDER BY RAND() LIMIT 1";
if ( !($result = $db->sql_query($sql)) )
		{
			message_die(GENERAL_ERROR, 'Could not obtain congratulation text', '', __LINE__, __FILE__, $sql);
		}
		$row = $db->sql_fetchrow($result);
	$message = $row['config_value'];
            $bbcode_uid = ($bbcode_on) ? make_bbcode_uid() : ''; 
            break; 

       case 2: 
$sql = "SELECT * FROM " . AUTOBIRTHDAY_CONFIG_TABLE . " WHERE config_name LIKE 'grats_text_female%' ORDER BY RAND() LIMIT 1";
if ( !($result = $db->sql_query($sql)) )
		{
			message_die(GENERAL_ERROR, 'Could not obtain congratulation text', '', __LINE__, __FILE__, $sql);
		}
		$row = $db->sql_fetchrow($result);
	$message = $row['config_value'];
            $bbcode_uid = ($bbcode_on) ? make_bbcode_uid() : ''; 
            break; 

      default : 
$sql = "SELECT * FROM " . AUTOBIRTHDAY_CONFIG_TABLE . " WHERE config_name LIKE 'grats_text%' ORDER BY RAND() LIMIT 1";
if ( !($result = $db->sql_query($sql)) )
		{
			message_die(GENERAL_ERROR, 'Could not obtain congratulation text', '', __LINE__, __FILE__, $sql);
		}
		$row = $db->sql_fetchrow($result);
	$message = $row['config_value'];
            $bbcode_uid = ($bbcode_on) ? make_bbcode_uid() : ''; 
            break; 
}
Правда, это только идея и пока не тестировалась. При этом в таблицу autobirthday_config надо будет добавлять еще и параметры с поздравлениями grats_text_male_1 ... grats_text_male_n и grats_text_female_1 ... grats_text_female_n (где n - штук).
Изображение
fskon
phpBB 2.0.2
Сообщения: 333
Стаж: 17 лет 10 месяцев
Откуда: msk.reg.ru

Сообщение fskon »

rxu
Ну как же не существует - присутствует.
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16358
Стаж: 17 лет 11 месяцев
Откуда: Красноярск
Благодарил (а): 521 раз
Поблагодарили: 1741 раз

Сообщение rxu »

fskon
Хм... дебаг вроде однозначно ругается на то, что
Table 'phpBB.autobirthday_config' doesn't exist
:?
В моей конфигурации РНР5.0.4 + MySQL4.1.7 работает корректно. Могу посоветовать только испробовать на localhost в другой конфигурации сервера, чтобы исключить влияние связки PHP 5.1.1 +
MySQL 5.0.16-nt.
Изображение
fskon
phpBB 2.0.2
Сообщения: 333
Стаж: 17 лет 10 месяцев
Откуда: msk.reg.ru

Сообщение fskon »

rxu
Так и стоит на локалхосте, вот кусок дампа.

Код: Выделить всё

INSERT INTO `phpbb_bbconfig` VALUES ('bday_show', '1');
INSERT INTO `phpbb_bbconfig` VALUES ('bday_require', '1');
INSERT INTO `phpbb_bbconfig` VALUES ('bday_year', '0');
INSERT INTO `phpbb_bbconfig` VALUES ('bday_lock', '1');
INSERT INTO `phpbb_bbconfig` VALUES ('bday_lookahead', '7');
INSERT INTO `phpbb_bbconfig` VALUES ('bday_max', '50');
INSERT INTO `phpbb_bbconfig` VALUES ('bday_min', '7');
INSERT INTO `phpbb_bbconfig` VALUES ('bday_autobirthday', '0');
Аддон классный, а у меня не хочет... :cry:
А нет ли возможности всплывающее окошко хотя бы прилепить как у Niels ??
Аватара пользователя
Nikel
phpBB 2.0.5
Сообщения: 496
Стаж: 18 лет 11 месяцев
Откуда: Киев

Сообщение Nikel »

fskon писал(а):SQL Error : 1146 Table 'phpBB.autobirthday_config' doesn't exist
Вам необходимо запустить файл обновления бд , называется он db_update.php или что-то наподобии етого .
Хочешь помочь коллеге- поделись опытом, хочешь помочь профессионалу-отойди и не мешай, хочешь помочь дураку... Сам дурак
fskon
phpBB 2.0.2
Сообщения: 333
Стаж: 17 лет 10 месяцев
Откуда: msk.reg.ru

Сообщение fskon »

Nikel
В комплекте идет файлик sql, я залил данные с него, при этом изменив префикс, он другой не phpbb, но это не влияет...
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Nikel
phpBB 2.0.5
Сообщения: 496
Стаж: 18 лет 11 месяцев
Откуда: Киев

Сообщение Nikel »

fskon писал(а):В комплекте идет файлик sql
Там также идет файлик
Nikel писал(а):db_update.php
Хочешь помочь коллеге- поделись опытом, хочешь помочь профессионалу-отойди и не мешай, хочешь помочь дураку... Сам дурак
fskon
phpBB 2.0.2
Сообщения: 333
Стаж: 17 лет 10 месяцев
Откуда: msk.reg.ru

Сообщение fskon »

Так получается между ними существует разница?
Тогда зачем он нужен в комплекте?
Аватара пользователя
Nikel
phpBB 2.0.5
Сообщения: 496
Стаж: 18 лет 11 месяцев
Откуда: Киев

Сообщение Nikel »

fskon писал(а):Так получается между ними существует разница?
Разница в том что sql можно неправильно прикрутить , а db_update.php - нет .
fskon писал(а):Тогда зачем он нужен в комплекте?
Для общего развития .
Хочешь помочь коллеге- поделись опытом, хочешь помочь профессионалу-отойди и не мешай, хочешь помочь дураку... Сам дурак

Вернуться в «Бета-версии модов для phpBB 2.0.x»