Система объявлений 1.0.0

Добавляет администрации возможность размещать объявления для пользователей.

  1. Exile
    Совместимость:
    не проверялся на совместимость
    Изменения в БД:
    требуются
    Автор:
    frost444
    Общественное достояние:
    да
    Описание: добавляет администрации возможность размещать объявления для пользователей.

    Возможности:
    • Кеширование, AJAX
    • Внешний вид и прокрутка точь в точь как у XenForo
    • Скрытие объявлений у отдельного пользователя, с запоминанием закрытых блоков
    Инструкция по установке:
    PHP:
    ####[ВЫПОЛНИТЬ]-----SQL

    CREATE TABLE IF NOT EXISTS `bb_rules` (
      `
    idint(11NOT NULL AUTO_INCREMENT,
      `
    titlevarchar(255NOT NULL DEFAULT '',
      `
    texttext NOT NULL,
      `
    activetinyint(1NOT NULL DEFAULT '0',
      
    PRIMARY KEY (`id`)
    ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=;;

    ALTER TABLE `bb_usersADD `user_showsrulestext 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($title31),
                        
    '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.infoalert(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(blockLeftHeightRightHeight) {
        var 
    winWidth = $(window).width();
        
    winWidth winWidth LeftHeight RightHeight;
        $(
    block).css({widthwinWidth 'px'});
        $(
    "li.Notice",block).css({widthwinWidth 'px'});
    }

    function 
    slidesRules(datarem){
        $(
    "div.PanelContainer"data).each(function(){
            if(!
    rem){
                var 
    slider = $(".PanelsRules", $(this)).bxSlider({
                    
    slideSelector"div.panel",
                    
    pagerCustom'.UlNavControls',
                    
    speed500,
                    
    autotrue,
                    
    autoHovertrue,
                    
    pause5000,
                    
    controlsfalse,
                });
            }else{
                
    slider.reloadSlider();
            }
        });
    }

    $(function(){
        var 
    block = $("div#Notices"); //Блок с новостями

        
    $(window).on("resize", function(){resizerules(block22525);});
        $(
    window).on("load", function(){resizerules(block22525);});
        $(
    window).on("load", function(){$("div#NoticesStart").css("display""block");slidesRules(blockfalse)});
    });
    </
    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;
    }

    ####[СОХРАНИТЬ_ФАЙЛ]####

    Изображения

    1. Снимок.JPG
    2. Снимок2.jpg