- Совместимость
- не проверялся на совместимость
- Изменения в БД
- требуются
- Автор
- _Xz_
- Общественное достояние
- да
Описание: добавляет систему обмена виртуальными подарками между пользователями. Некий аналог системы обмена подарками в социальных сетях. Подарки покупаются за сидбонусы. У администратора есть возможность добавления неограниченного числа категорий подарков и самих подарков.
- Инструкция по установке
-
PHP:
############################################################## ## Название мода: Подарки ## Автор мода: _Xz_ http://torrentpier.com/members/_xz_.2/ ## Описание мода: Мод позволяет дарить подарки пользователям за очки сидирования ## ## Уровень инсталяции: простой ## Время установки: 5 минут ############################################################## # #--[SQL]-------------------------------- # CREATE TABLE IF NOT EXISTS `bb_presents` ( `present_id` mediumint(8) unsigned NOT NULL auto_increment, `present_name` varchar(255) default NULL, `present_pic` varchar(255) default NULL, `present_price` mediumint(8) NOT NULL default '0', `present_active` tinyint(1) NOT NULL default '1', `present_type` mediumint(8) default '0', PRIMARY KEY (`present_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `bb_users_presents` ( `id` int(11) unsigned NOT NULL auto_increment, `user_id` mediumint(8) default '0', `present_id` mediumint(8) default '0', `given_id` mediumint(8) NOT NULL default '0', `time` int(11) NOT NULL default '0', `given_hide` tinyint(1) NOT NULL default '0', `comment` text NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; INSERT INTO `bb_config` VALUES ('presents', '1'); # #-----[ OPEN ]------------------------------------------ # init_bb.php # #-----[ FIND ]------------------------------------------ # define('BB_WORDS', 'bb_words'); # #-----[ BEFORE, ADD ]----------------------------------- # define('BB_PRESENTS', 'bb_presents'); define('BB_USERS_PRESENTS', 'bb_users_presents'); # #-----[ OPEN ]------------------------------------------ # admin_board.php # #-----[ FIND ]------------------------------------------ # 'SEED_BONUS_USER_REGDATE' => $new['seed_bonus_user_regdate'], # #-----[ AFTER, ADD ]----------------------------------- # 'PRESENTS' => $new['presents'], # #-----[ OPEN ]------------------------------------------ # admin_board.tpl # #-----[ FIND ]------------------------------------------ # <tr> <td><h4>{L_SEED_BONUS}</h4></td> <td> <label><input type="radio" name="seed_bonus_enabled" value="1" <!-- IF SEED_BONUS_ENABLED -->checked="checked"<!-- ENDIF --> />{L_ENABLED}</label> <label><input type="radio" name="seed_bonus_enabled" value="0" <!-- IF not SEED_BONUS_ENABLED -->checked="checked"<!-- ENDIF --> />{L_DISABLED}</label> </td> </tr> # #-----[ AFTER, ADD ]----------------------------------- # <tr> <td><h4>{L_PRESENTS}</h4></td> <td> <label><input type="radio" name="presents" value="1" <!-- IF PRESENTS -->checked="checked"<!-- ENDIF --> />{L_ENABLED}</label> <label><input type="radio" name="presents" value="0" <!-- IF not PRESENTS -->checked="checked"<!-- ENDIF --> />{L_DISABLED}</label> </td> </tr> # #-----[ OPEN ]------------------------------------------ # usercp_viewprofile.php # #-----[ FIND ]------------------------------------------ # print_page('usercp_viewprofile.tpl'); # #-----[ BEFORE, ADD ]----------------------------------- # if ($bb_cfg['seed_bonus_enabled'] && $bb_cfg['presents']) { $count = DB()->fetch_row("SELECT COUNT(present_id) as present FROM ". BB_USERS_PRESENTS ." WHERE user_id = {$profiledata['user_id']}"); $start = isset($_REQUEST['start']) ? abs(intval($_REQUEST['start'])) : 0; if($count['present']) { $sql = DB()->fetch_rowset("SELECT pre.*, p.*, u.username, u.user_rank FROM ". BB_USERS_PRESENTS ." pre, ". BB_PRESENTS ." p, ". BB_USERS ." u WHERE pre.present_id = p.present_id AND pre.given_id = u.user_id AND pre.user_id = {$profiledata['user_id']} ORDER BY pre.time DESC LIMIT $start, 8"); $presentrow = array(); foreach($sql as $row) { $presentrow[] = $row; } if (!$presentrow) { $template->assign_block_vars('not_present', array()); } for ($j = 0; $j < count($presentrow); $j += 4) { $template->assign_block_vars('presentrow', array()); for ($i = $j; $i < ($j + 4); $i++) { if( $i >= count($presentrow) ) { $template->assign_block_vars('presentrow.not', array()); continue; } if ($presentrow[$i]['given_hide'] && !IS_ADMIN) { $given_user = '<b>'. $lang['ANONYMOUS'] .'</b>'; } elseif ($presentrow[$i]['given_hide'] && IS_ADMIN) { $given_user = profile_url(array('username' => "<b>[{$presentrow[$i]['username']}]</b>", 'user_id' => $presentrow[$i]['given_id'], 'user_rank' => $presentrow[$i]['user_rank'])); } else { $given_user = profile_url(array('username' => "<b>{$presentrow[$i]['username']}</b>", 'user_id' => $presentrow[$i]['given_id'], 'user_rank' => $presentrow[$i]['user_rank'])); } $template->assign_block_vars('presentrow.presentcol', array( 'NAME' => $presentrow[$i]['present_name'], 'PIC' => $presentrow[$i]['present_pic'], 'PRICE' => $presentrow[$i]['present_price'], 'ID' => $presentrow[$i]['present_id'], 'GIVEN' => $given_user )); } } generate_pagination(PROFILE_URL . $profiledata['user_id'], $count['present'], 8, $start, false, 'presents'); } } # #-----[ OPEN ]------------------------------------------ # lang_main.php # #-----[ FIND ]--------------------------------------- # $lang['BONUS_RETURN'] = 'Вернуться к обмену Сид бонусов'; # #-----[ AFTER, ADD ]------------------------------------------- # // Presents $lang['PRESENTS'] = 'Подарки за СидБонус'; $lang['PRESENTS_OFF'] = 'Мод отключен администратором'; $lang['PRESENTS_CATALOG'] = 'Каталог подарков'; $lang['BAY_PRESENT'] = 'Купить подарок'; $lang['GIVE_PRESENT'] = 'Подарить подарок'; $lang['ADD_PRESENT'] = 'Добавить подарок'; $lang['CHANGING_PRESENT'] = 'Изменение подарка'; $lang['PRESENT'] = 'Подарок'; $lang['PRESENT_NAME'] = 'Название подарка'; $lang['PRESENT_PRICE'] = 'Цена подарка'; $lang['PRESENT_TYPE'] = 'Тип'; $lang['PRESENT_ACTIVE'] = 'Активный'; $lang['PRESENT_DESC'] = 'Описание подарка'; $lang['PRESENT_ERROR_PIC'] = 'Картинка отсутствует'; $lang['PRESENT_ERROR_NAME'] = 'Не указано название подарка'; $lang['PRESENT_ERROR_PRICE'] = 'Не указано цена подарка'; $lang['PRESENT_ERROR_TYPE'] = 'Не указан тип подарка'; $lang['ANONYMOUS'] = 'Аноним'; $lang['NAME'] = 'Название'; $lang['GIVE'] = 'Подарить'; $lang['ADD'] = 'Добавить'; $lang['PRESENT_MAKE_ANONYMOUS'] = 'Сделать подарок анонимным'; $lang['PRESENT_TO'] = 'Кому подарить'; $lang['PRESENT_WISH'] = 'Пожелание'; $lang['PRESENT_NOT_SELECT'] = 'Вы не выбрали подарок'; $lang['PRESENT_NO'] = 'Такого подарка не существует'; $lang['PRESENT_DELETE'] = 'Подарок удален'; $lang['PRESENT_NOT_SELECT_USER'] = 'Вы не выбрали кому подарите подарок'; $lang['PRESENT_NOT_FOUND_USER'] = 'Пользователь не найден'; $lang['PRESENT_NOT_YOURSELF'] = 'Нельзя себе делать подарки'; $lang['PRESENT_NOT_ANONYMOUS'] = 'Подарки можно дарить только пользователям'; $lang['PRESENT_NOT_BOT'] = 'Нельзя делать подарки боту'; $lang['PRESENT_TOO_HIGH'] = 'Этот подарок для вас слишком дорогой'; $lang['PRESENT_GIFTED'] = 'Подарок подарен пользователю'; $lang['PRESENT_NEW'] = 'У вас новый подарок'; $lang['PRESENT_COMMENT'] = 'Так же вам оставил пожелаение'; $lang['PRESENT_INCOGNITO'] = 'оставшийся неизвестным'; $lang['PRESENT_PRICE_MESS'] = '(у вас в наличии <b>%s</b>)'; $lang['PRESENT_MESSAGE'] = 'Пользователь %s подарил Вам подарок.%s[br][br]Вы его можете посмотреть в своём профиле перейдя по [url=%s]ссылке[/url].[br][br][align=right]Сообщение сгенерировано автоматически.[/align]'; $lang['PRESENT_BONUS'] = 'Описание подарка'; $lang['PRESENT_ADD'] = 'Подарок добавлен'; $lang['PRESENT_NO_ADD'] = 'Подарок не добавлен'; $lang['PRESENT_EDITED'] = 'Подарок изменен'; $lang['WRONG_FORMAT'] = 'Нн верный формат файла'; // Presents types $lang['PRESENT_SPECITY_TYPE'] = 'Укажите тип'; $lang['PRESENT_TIMELESS'] = 'Вечные подарки'; $lang['PRESENT_BALOONS'] = 'Воздушные шары'; $lang['PRESENT_MASKS'] = 'Головные уборы и маски'; $lang['PRESENT_FOR_LOVERS'] = 'Для влюбленных'; $lang['PRESENT_FOR_GIRLS'] = 'Для девушек'; $lang['PRESENT_FOR_MEN'] = 'Для мужчин'; $lang['PRESENT_FOOD'] = 'Еда'; $lang['PRESENT_ANIMALS'] = 'Животные'; $lang['PRESENT_COMPUTERS'] = 'Компьютерная техника'; $lang['PRESENT_SUMMER'] = 'Летние подарки'; $lang['PRESENT_PRIVATE'] = 'Личный инструктор'; $lang['PRESENT_STUFFED_TOYS'] = 'Мягкие игрушки'; $lang['PRESENT_DRINKS'] = 'Напитки'; $lang['PRESENT_KISSES'] = 'Поцелуи'; $lang['PRESENT_OTHER'] = 'Разное'; $lang['PRESENT_SUNGLASSES'] = 'Солнцезащитные очки'; $lang['PRESENT_SPORT'] = 'Спорт'; $lang['PRESENT_STATUES'] = 'Статуэтки'; $lang['PRESENT_DECORATION'] = 'Украшения'; $lang['PRESENT_HOBBY'] = 'Хобби'; $lang['PRESENT_FLOWERS'] = 'Цветы'; $lang['PRESENT_NEW_YEAR'] = 'Новогодние подарки'; # #-----[ FIND ]--------------------------------------- # $lang['DELETE_IMAGE'] = 'Удалить изображение'; # #-----[ BEFORE, ADD ]------------------------------------------- # $lang['SELECT_IMAGE'] = 'Выберите изображение'; # #-----[ OPEN ]------------------------------------------ # functions.php # #-----[ FIND AND REPLACE ]--------------------------------------- # function generate_pagination($base_url, $num_items, $per_page, $start_item, $add_prevnext_text = true, $style = false) { global $lang, $template; // Pagination Mod $begin_end = 3; $from_middle = 1; /* By default, $begin_end is 3, and $from_middle is 1, so on page 6 in a 12 page view, it will look like this: a, d = $begin_end = 3 b, c = $from_middle = 1 "begin" "middle" "end" | | | | a b | c d | | | | | | | | v v v v v v v 1, 2, 3 ... 5, 6, 7 ... 10, 11, 12 Change $begin_end and $from_middle to suit your needs appropriately */ $total_pages = ceil($num_items/$per_page); if ( $total_pages == 1 || $num_items == 0 ) { return ''; } if($style) $style = "#$style"; $on_page = floor($start_item / $per_page) + 1; $page_string = ''; if ( $total_pages > ((2*($begin_end + $from_middle)) + 2) ) { $init_page_max = ( $total_pages > $begin_end ) ? $begin_end : $total_pages; for($i = 1; $i < $init_page_max + 1; $i++) { $page_string .= ( $i == $on_page ) ? '<b>' . $i . '</b>' : '<a href="' . $base_url . "&start=" . ( ( $i - 1 ) * $per_page ) . $style .'">' . $i . '</a>'; if ( $i < $init_page_max ) { $page_string .= ", "; } } if ( $total_pages > $begin_end ) { if ( $on_page > 1 && $on_page < $total_pages ) { $page_string .= ( $on_page > ($begin_end + $from_middle + 1) ) ? ' ... ' : ', '; $init_page_min = ( $on_page > ($begin_end + $from_middle) ) ? $on_page : ($begin_end + $from_middle + 1); $init_page_max = ( $on_page < $total_pages - ($begin_end + $from_middle) ) ? $on_page : $total_pages - ($begin_end + $from_middle); for($i = $init_page_min - $from_middle; $i < $init_page_max + ($from_middle + 1); $i++) { $page_string .= ($i == $on_page) ? '<b>' . $i . '</b>' : '<a href="' . $base_url . "&start=" . ( ( $i - 1 ) * $per_page ) . $style .'">' . $i . '</a>'; if ( $i < $init_page_max + $from_middle ) { $page_string .= ', '; } } $page_string .= ( $on_page < $total_pages - ($begin_end + $from_middle) ) ? ' ... ' : ', '; } else { $page_string .= ' ... '; } for($i = $total_pages - ($begin_end - 1); $i < $total_pages + 1; $i++) { $page_string .= ( $i == $on_page ) ? '<b>' . $i . '</b>' : '<a href="' . $base_url . "&start=" . ( ( $i - 1 ) * $per_page ) . $style .'">' . $i . '</a>'; if( $i < $total_pages ) { $page_string .= ", "; } } } } else { for($i = 1; $i < $total_pages + 1; $i++) { $page_string .= ( $i == $on_page ) ? '<b>' . $i . '</b>' : '<a href="' . $base_url . "&start=" . ( ( $i - 1 ) * $per_page ) . $style .'">' . $i . '</a>'; if ( $i < $total_pages ) { $page_string .= ', '; } } } if ( $add_prevnext_text ) { if ( $on_page > 1 ) { $page_string = ' <a href="' . $base_url . "&start=" . ( ( $on_page - 2 ) * $per_page ). $style .'">' . $lang['PREVIOUS'] . '</a> ' . $page_string; } if ( $on_page < $total_pages ) { $page_string .= ' <a href="' . $base_url . "&start=" . ( $on_page * $per_page ) . $style .'">' . $lang['NEXT'] . '</a>'; } } $pagination = ($page_string) ? '<a class="menu-root" href="#pg-jump">'. $lang['GOTO_PAGE'] .'</a> : '. $page_string : ''; $pagination = str_replace('&start=0', '', $pagination); $template->assign_vars(array( 'PAGINATION' => $pagination, 'PAGE_NUMBER' => sprintf($lang['PAGE_OF'], ( floor($start_item/$per_page) + 1 ), ceil( $num_items / $per_page )), 'PG_BASE_URL' => $base_url, 'PG_PER_PAGE' => $per_page, )); return $pagination; } # #-----[ OPEN ]------------------------------------------ # main.css # #-----[ ADD ]------------------------------------------- # #present { height:150px; position: relative; background:url(../images/gift_bg.png) repeat-x bottom; border: 1px solid #ccc; } #present .lblock { background:url(../images/left.png) no-repeat top right; width:85px; height:32px; line-height:35px; position:absolute; top:135px; left:-7px; color: #FFFFFF; } #present .rblock { color:#FFF; background:url(../images/right.png) no-repeat top left; font-weight: bold; width:72px; height:32px; line-height:35px; position:absolute; top:135px; right:-6px; } #present b { color: #FFFFFF; } #present b:hover { color: #FF8000;} #present b:active { color: #FF8000 !important; position: relative; top: 1px; } #present a:hover, #present a:active { text-decoration: none !important; }1px; } #present a:hover, #present a:active { text-decoration: none !important; } # #-----[ OPEN ]------------------------------------------ # usercp_viewprofile.tpl # #-----[ FIND ]------------------------------------------ # </table><!--/user_profile--> # #-----[ ADD ]------------------------------------------- # <!-- IF PAGINATION --> <p class="small" style="padding: 1px 6px 5px;"><b>{PAGINATION}</b></p> <!-- ENDIF --> <!-- IF SHOW_PRESENTS --> <table class="tCenter borderless" width="100%"> <tr><th class="cat border bw_TRBL" colspan="4"><a href="presents.php<!-- IF not EDIT_PROF -->?u={PROFILE_USER_ID}<!-- ENDIF -->">{L_GIVE_PRESENT}</a></th></tr> <!-- BEGIN presentrow --> <tr> <!-- BEGIN presentcol --> <td class="row1 pad_10" width="25%"> <div id="present" class="pad_10"> <div style="color: #c80; font-size:14px;">{presentrow.presentcol.NAME}</div> <img src="images/presents/{presentrow.presentcol.PIC}"> <div class="lblock tLeft nowrap"> {L_REPORT_BY} {presentrow.presentcol.GIVEN}</div> </div> </td> <!-- END presentcol --> <!-- BEGIN not --> <td class="row1" align="center" width="25%"> </td> <!-- END not --> </tr> <!-- END presentrow --> <!-- BEGIN not_present --> <tr> <td colspan="3" class="row1 tCenter pad_8">{L_NONE}</td> </tr> <!-- END not_present --> </table> <!-- ENDIF --> # #-----[ SAVE/CLOSE ALL FILES ]-------------------------- #