- Совместимость
- не проверялся на совместимость
- Изменения в БД
- требуются
- Автор
- frost444
- Общественное достояние
- да
Описание: добавляет администрации возможность размещать объявления для пользователей.
Возможности:
Возможности:
- Кеширование, AJAX
- Внешний вид и прокрутка точь в точь как у XenForo
- Скрытие объявлений у отдельного пользователя, с запоминанием закрытых блоков
- Инструкция по установке
-
PHP:
####[ВЫПОЛНИТЬ]-----SQL CREATE TABLE IF NOT EXISTS `bb_rules` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL DEFAULT '', `text` text NOT NULL, `active` tinyint(1) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;; ALTER TABLE `bb_users` ADD `user_showsrules` text NOT NULL; ####[КОНЕЦ]-----SQL ####[ОТКРЫТЬ]----- index.php -----[найти]----- $user->session_start(); -----[добавить после]----- if ($bb_cfg['rules']['on']) { if (!CACHE('bb_cache')->get('rules')) { $max = DB()->fetch_row("SELECT COUNT(id) as max FROM ". BB_RULES ." LIMIT 1"); if ($max['max'] <= 0) { $template->assign_block_vars('not_rules', array()); }else{ $sql = DB()->fetch_rowset("SELECT * FROM ". BB_RULES ." WHERE active = 1 GROUP BY id"); foreach ($sql as $rules) { $sql_r['rules'][$rules['id']] = array('id'=>$rules['id'],'title'=>$rules['title'],'text'=>$rules['text']); } CACHE('bb_cache')->set('rules', $sql_r, $bb_cfg['rules']['cache']); } }else{ $sql_r = CACHE('bb_cache')->get('rules'); } if(!empty($sql_r)) { $rules_show = !empty($userdata['user_showsrules']) ? array_val_diff($sql_r['rules'], safe_unserialize($userdata['user_showsrules'])) : $sql_r['rules']; if(!empty($rules_show)) { $template->assign_vars(array( 'RULES_ON' => true, )); $i=0; foreach ($rules_show as $rules) { $orig_word = $replacement_word = array(); obtain_word_list($orig_word, $replacement_word); $title = str_replace('\"', '"', substr(@preg_replace('#(\>(((?>([^><]+|(?R)))*)\<))#se', "@preg_replace(\$orig_word, \$replacement_word, '\\0')", '>' . $rules['title'] . '<'), 1, -1)); $template->assign_block_vars('rules',array( 'ID' => $rules['id'], 'BLOCK_ID' => $i, 'TITLE' => $title, 'TITLE_MIN' => str_short($title, 31), 'TEXT' => $rules['text'], )); $i++; } } } } ####[СОХРАНИТЬ_ФАЙЛ]#### ####[ОТКРЫТЬ]----- index.tpl -----[в любое место]----- <!-- IF RULES_ON --> <link rel="stylesheet" href="{TPL_DIR}/rules.css?v={$bb_cfg['css_ver']}" type="text/css"> <script type="text/javascript" src="{SITE_URL}misc/js/slides.jquery.js"></script> <div id="NoticesStart" style="display:none"> <div id="Notices" class="PanelScroller"> <div id="RulesBlock"> <div class="scrollContainer"> <div class="PanelContainer"> <div class="PanelsRules"> <!-- BEGIN rules --> <div class="panel Notice ShowCtrlBlock notice_{rules.ID}" style="float: left;" data-id="{rules.ID}"> <div class="noticeContent">{rules.TEXT}</div> <!-- IF LOGGED_IN --> <a href="#notice_{rules.ID}" data-id="{rules.ID}" title="Скрыть объявление" class="ShowCtrlButton">Скрыть объявление</a> <!-- ENDIF --> </div> <!-- END rules --> </div> </div> </div> <div class="navContainer"> <span class="navControls"> <ul class="UlNavControls"> <!-- BEGIN rules --> <li data-id="{rules.ID}" ><a href="#" class="current" title="{rules.TITLE}" data-slide-index="{rules.BLOCK_ID}"> <span id="select" class="arrow"><span></span></span> <!--{rules.ID} --> {rules.TITLE_MIN} </a></li> <!-- END rules --> </ul> </span> </div> </div> </div> </div> <script type="text/javascript"> <!-- IF LOGGED_IN --> $(document).ready(hide_rules); $(document).ajaxComplete(hide_rules); function hide_rules() { $('.ShowCtrlButton').on("click", function () { var RBlock = $("div#Notices"); var id = $(this).data('id'); ajax.exec({ action : 'rules', rules_id : id }); ajax.callback.rules = function(data) { if(data.info) alert(data.info); if(data.show) { $('div.PanelsRules li[data-id='+ data.rules_id +']', RBlock).remove(); $('div.PanelsRules li.bx-clone[data-id='+ data.rules_id +']', RBlock).remove(); $('ul.UlNavControls li[data-id='+ data.rules_id +']', RBlock).remove(); slidesRules($("div.PanelContainer", RBlock), true); } }; }); } <!-- ENDIF --> function resizerules(block, LeftHeight, RightHeight) { var winWidth = $(window).width(); winWidth = winWidth - LeftHeight - RightHeight; $(block).css({width: winWidth + 'px'}); $("li.Notice",block).css({width: winWidth + 'px'}); } function slidesRules(data, rem){ $("div.PanelContainer", data).each(function(){ if(!rem){ var slider = $(".PanelsRules", $(this)).bxSlider({ slideSelector: "div.panel", pagerCustom: '.UlNavControls', speed: 500, auto: true, autoHover: true, pause: 5000, controls: false, }); }else{ slider.reloadSlider(); } }); } $(function(){ var block = $("div#Notices"); //Блок с новостями $(window).on("resize", function(){resizerules(block, 225, 25);}); $(window).on("load", function(){resizerules(block, 225, 25);}); $(window).on("load", function(){$("div#NoticesStart").css("display", "block");slidesRules(block, false)}); }); </script> <!-- ENDIF --> ####[СОХРАНИТЬ_ФАЙЛ]#### ####[ОТКРЫТЬ]----- init_bb.php -----[найти]----- define('BB_PRIVMSGS_TEXT', 'bb_privmsgs_text'); -----[добавить после]----- //RULES MODE define('BB_RULES', 'bb_rules'); //RULES MODE ####[СОХРАНИТЬ_ФАЙЛ]#### ####[ОТКРЫТЬ]----- ajax.php -----[найти]----- -----[найти]----- 'index_data' => array('guest'), -----[добавить после]----- 'rules' => array('user'), -----[найти последнюю скобку и перед ней добавить]----- function rules() { require(AJAX_DIR .'rules.php'); } ####[СОХРАНИТЬ_ФАЙЛ]#### ####[ОТКРЫТЬ]----- config.php -----[в конец добавить]----- $bb_cfg['rules'] = array( 'on' => true, 'cache' => 24, //кеш держится в часах ); ####[СОХРАНИТЬ_ФАЙЛ]#### ####[ОТКРЫТЬ]----- lang_main.php -----[в конец добавить]----- //RULES MODE $lang['RULES'] = 'Управление объявлениями'; $lang['RULES_TEXT'] = 'Содержание'; $lang['RULES_ID'] = 'ID'; $lang['RULES_TITLE'] = 'Название'; $lang['RULES_ACTIVATE'] = 'Активность'; $lang['RULES_INFO'] = 'Данная страница предназначена для вывода объявлений на главной странице сайта'; $lang['RULES_INFO_EDIT'] = 'Данная страница предназначена для редактирования/добавления объявлений'; $lang['RULES_ADD'] = 'Добавить объявление'; $lang['MISSING_RULES_ID'] = "ID объявления пропущено"; $lang['RULES_REMOVED'] = "Объявление удалено"; $lang['RULES_UPDATED'] = "Объявление обновлено"; $lang['RULES_ADDED'] = "Объявление добавлено"; $lang['CLICK_RETURN_RULESADMIN'] = 'Нажмите %sСюда%s для возврата к управлению объявлениями'; //RULES MODE ####[СОХРАНИТЬ_ФАЙЛ]#### ####[ОТКРЫТЬ]----- functions.php -----[в конец добавить]----- function safe_unserialize($serialized) { if (is_string($serialized) && strpos($serialized, "\0") === false) { if (strpos($serialized, 'O:') === false) { return @unserialize($serialized); } else if (!preg_match('/(^|;|{|})O:[0-9]+:"/', $serialized)) { return @unserialize($serialized); } } return false; } function might_serialize($val){ if(is_object($val)){ $obj_keys = array_keys(get_object_vars($val)); foreach($obj_keys as $k){ $val->$k = might_serialize($val->$k); } $val = serialize($val); } if(is_array($val)){ foreach($val as &$v){ $v = might_serialize($v); } $val = serialize($val); } return $val; } function array_key_diff($ar1, $ar2) { // , $ar3, $ar4, ... $aSubtrahends = array_slice(func_get_args(),1); foreach ($ar1 as $key => $val) foreach ($aSubtrahends as $aSubtrahend) if (array_key_exists($key, $aSubtrahend)) unset ($ar1[$key]); return $ar1; } function array_val_diff($ar1, $ar2) { // , $ar3, $ar4, ... $aSubtrahends = array_slice(func_get_args(),1); foreach ($ar1 as $key => $val) foreach ($aSubtrahends as $aSubtrahend) if (in_array($key, $aSubtrahend)) unset ($ar1[$key]); return $ar1; } ####[СОХРАНИТЬ_ФАЙЛ]####