Система объявлений 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.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;
    }

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

    Изображения

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