Вход Регистрация
Файл: components/board/model.php
Строк: 398
<?php
/******************************************************************************/
//                                                                            //
//                             InstantCMS v1.10                               //
//                        http://www.instantcms.ru/                           //
//                                                                            //
//                   written by InstantCMS Team, 2007-2012                    //
//                produced by InstantSoft, (www.instantsoft.ru)               //
//                                                                            //
//                        LICENSED BY GNU/GPL v2                              //
//                                                                            //
/******************************************************************************/

if(!defined('VALID_CMS')) { die('ACCESS DENIED'); }

class 
cms_model_board{

    public 
$root_cat  = array();
    public 
$config    = array();
    public 
$is_can_add_by_group   false;
    public 
$is_moderator_by_group false;

/* ==================================================================================================== */
/* ==================================================================================================== */

    
public function __construct(){
        
$this->inDB        cmsDatabase::getInstance();
        
$this->inCore      cmsCore::getInstance();
        
$this->config      $this->inCore->loadComponentConfig('board');
        
$this->root_cat    $this->inDB->get_fields('cms_board_cats''parent_id=0''*');
        
$this->category_id cmsCore::request('category_id''int'$this->root_cat['id']);
        
$this->item_id     cmsCore::request('id''int'0);
        
$this->page        cmsCore::request('page''int'1);
        
$this->city        cmsCore::getSearchVar('city');
        
$this->obtype      cmsCore::getSearchVar('obtype');
        
$this->is_can_add_by_group   cmsUser::isUserCan('board/add');
        
$this->is_moderator_by_group cmsUser::isUserCan('board/moderate');
        
cmsCore::loadClass('form');
    }

/* ==================================================================================================== */
/* ==================================================================================================== */

    
public function getCommentTarget($target$target_id) {

        
$result = array();

        switch(
$target){

            case 
'boarditem'$item $this->inDB->get_fields('cms_board_items'"id='{$target_id}'"'title, obtype');
                              if (!
$item) { return false; }
                              
$result['link']  = '/board/read'.$target_id.'.html';
                              
$result['title'] = $item['obtype'].' '.$item['title'];
                              break;

        }

        return (
$result $result false);

    }

/* ========================================================================== */
/* ========================================================================== */

    
public static function getDefaultConfig() {

        
$cfg = array(
                     
'showlat'=>1,
                     
'photos'=>1,
                     
'maxcols'=>1,
                     
'maxcols_on_home'=>1,
                     
'public'=>1,
                     
'home_perpage'=>15,
                     
'publish_after_edit'=>0,
                     
'srok'=>1,
                     
'pubdays'=>14,
                     
'watermark'=>0,
                     
'comments'=>1,
                     
'aftertime'=>'',
                     
'extend'=>0,
                     
'vip_enabled'=>0,
                     
'vip_prolong'=>0,
                     
'vip_max_days'=>30,
                     
'vip_day_cost'=>5
               
);

        return 
$cfg;

    }

// ============================================================================ //
// ============================================================================ //

    
public function whereCatIs($cat_id){
        
$this->inDB->where("i.category_id = '$cat_id'");
        return;
    }

    public function 
whereThisAndNestedCats($left_key$right_key) {
        
$this->inDB->where("cat.NSLeft >= $left_key AND cat.NSRight <= $right_key AND cat.parent_id > 0");
    }

    public function 
whereCityIs($city) {
        
$this->inDB->where("LOWER(i.city) = '$city'");
    }

    public function 
whereVip($flag) {
        
$this->inDB->where("i.is_vip = $flag");
    }

    public function 
whereTypeIs($type) {
        
$this->inDB->where("LOWER(i.obtype) = '$type'");
    }

    public function 
whereUserIs($user_id) {
        
$this->inDB->where("i.user_id = '$user_id'");
    }

/* ==================================================================================================== */
/* ==================================================================================================== */

    
public function getCategory($category_id 0) {

        if(
$category_id == $this->root_cat['id']){
            
$category $this->root_cat;
            
$category['perpage'] = $this->config['home_perpage'];
            
$category['maxcols'] = $this->config['maxcols_on_home'];
        } else {
            
$category $this->inDB->get_fields('cms_board_cats'"id = '{$category_id}'"'*');
        }
        if(!
$category) { return false; }

        
$category['perpage'] = $category['perpage'] ? $category['perpage'] : $this->config['home_perpage'];
        
$category['is_can_add'] = $this->checkAdd($category);

        if (!
$category['obtypes']){
            
$category['obtypes'] = $this->inDB->get_field('cms_board_cats'"NSLeft <= {$category['NSLeft']} AND NSRight >= {$category['NSRight']} AND obtypes <> ''"'obtypes');
            if(!
$category['obtypes']) { $category['obtypes'] = $this->config['obtypes']; }
        }

        
$category['cat_city'] = $this->getCatCity($category['id']);

        
$category['ob_links'] = $this->getTypesLinks($category['id'], $category['obtypes']);

        
$category cmsCore::callEvent('GET_BOARD_CAT'$category);

        return 
$category;
    }

/* ==================================================================================================== */
/* ==================================================================================================== */
    /**
     * Возвращает категории
     * @param int $category_id - id категории
     * @return array
     */
    
public function getSubCats($category_id){

        
$cats = array();

        
$sql "SELECT *
                FROM cms_board_cats
                WHERE published = 1 AND parent_id = '
$category_id'
                ORDER BY title ASC"
;
        
$result $this->inDB->query($sql);

        if (!
$this->inDB->num_rows($result)){ return false; }

        while(
$cat $this->inDB->fetch_assoc($result)){
            if (!
$cat['obtypes']){
                
$cat['obtypes'] = $this->inDB->get_field('cms_board_cats'"NSLeft <= {$cat['NSLeft']} AND NSRight >= {$cat['NSRight']} AND obtypes <> ''"'obtypes');
            }
            
$cat['content_count'] = $this->getAdvertsCountFromCat($cat['NSLeft'], $cat['NSRight']);
            
$cat['ob_links'] = $this->getTypesLinks($cat['id'], $cat['obtypes']);
            
$cat['icon'] = $cat['icon'] ? $cat['icon'] : 'folder_grey.png';
            
$cats[] = $cat;
        }

        
$cats cmsCore::callEvent('GET_BOARD_SUBCATS'$cats);

        return 
$cats;
    }

    
/**
     * Возвращает количество объвлений в категории и подкатегориях
     * @return int
     */
    
public function getAdvertsCountFromCat($left_key$right_key) {

        
$sql "SELECT i.id
                FROM cms_board_items i
                INNER JOIN cms_board_cats cat ON cat.id = i.category_id AND cat.NSLeft >= '
$left_key' AND cat.NSRight <= '$right_key'
                WHERE i.published = 1"
;

        
$result $this->inDB->query($sql);

        return 
$this->inDB->num_rows($result);

    }

/* ==================================================================================================== */
/* ==================================================================================================== */
    /**
     * Возвращает элементы option для категорий, в которые разрешено добавление
     * @param int $sel - выбранныая категория
     * @param bool $is_edit - флаг редактирования
     * @return string
     */
    
public function getPublicCats($sel ''$is_edit false) {

        
$nested_sets $this->inCore->nestedSetsInit('cms_board_cats');
        
$rs_rows     $nested_sets->SelectSubNodes($this->root_cat['id']);

        if (
$rs_rows){
            
$html '';
            while(
$node $this->inDB->fetch_assoc($rs_rows)){
                if(
$this->checkAdd($node) || ($is_edit && $sel==$node['id'])){
                    if (
$sel==$node['id']){
                        
$s 'selected="selected"';
                    } else {
                        
$s '';
                    }
                    
$padding str_repeat('--'$node['NSLevel']) . ' ';
                    
$html .= '<option value="'.$node['id'].'" '.$s.'>'.$padding.$node['title'].'</option>';
                }
            }
        }

        return 
$html;

    }

/* ==================================================================================================== */
/* ==================================================================================================== */
    
public function getAdverts($show_all false$is_users false$is_coments false$is_cats false){

        
$this->deleteOldRecords();
        
$this->clearOldVips();

        
//подготовим условия
        
$pub_where = ($show_all '1=1' 'i.published = 1');
        
$r_join    $is_users " LEFT JOIN cms_users u ON u.id = i.user_id n" '';
        
$r_join   .= $is_cats " INNER JOIN cms_board_cats cat ON cat.id = i.category_id" '';

        
$r_select  $is_users ', u.login, u.nickname' '';
        
$r_select .= $is_cats ', cat.title as cat_title, cat.obtypes' '';

        
$sql "SELECT i.*{$r_select}

                FROM cms_board_items i
                
{$r_join}
                WHERE 
{$pub_where}
                      
{$this->inDB->where}

                
{$this->inDB->group_by}

                
{$this->inDB->order_by}n";

        if (
$this->inDB->limit){
            
$sql .= "LIMIT {$this->inDB->limit}";
        }

        
$result $this->inDB->query($sql);

        
$this->inDB->resetConditions();

        if(!
$this->inDB->num_rows($result)){ return false; }

        
$records = array();

        while (
$item $this->inDB->fetch_assoc($result)){

            if(
$is_coments){
                
$item['comments'] = cmsCore::getCommentsCount('boarditem'$item['id']);
            }
            
$item['content']  = nl2br($item['content']);
            
$item['content']  = $this->config['auto_link'] ? $this->inCore->parseSmiles($item['content']) : $item['content'];
            
$item['title']    = $item['obtype'].' '.$item['title'];
            
$item['fpubdate'] = cmsCore::dateformat($item['pubdate']);
            
$item['enc_city'] = urlencode($item['city']);
            if (!
$item['file'] || !file_exists(PATH.'/images/board/small/'.$item['file'])){
                
$item['file'] = 'nopic.jpg';
            }
            
// Права доступа
            
$item['moderator'] = $this->checkAccess($item['user_id']);
            
$timedifference    strtotime("now") - strtotime($item['pubdate']);
            
$item['is_overdue'] = round($timedifference 86400) > $item['pubdays'] && $item['pubdays'] > 0;

            
$records[] = $item;

        }

        
$records cmsCore::callEvent('GET_BOARD_RECORDS'$records);

        return 
$records;

    }

/* ==================================================================================================== */
/* ==================================================================================================== */

    
public function getAdvertsCount($show_all false){

        
//подготовим условия
        
$pub_where = ($show_all '1=1' 'i.published = 1');

        
$sql "SELECT 1

                FROM cms_board_items i

                WHERE 
{$pub_where}
                      
{$this->inDB->where}

                
{$this->inDB->group_by}n";

        
$result $this->inDB->query($sql);

        return 
$this->inDB->num_rows($result);

    }

/* ==================================================================================================== */
/* ==================================================================================================== */

    
public function getRecord($item_id) {

        
$this->deleteOldRecords();
        
$this->clearOldVips();

        
$sql "SELECT i.*,
                       a.id as cat_id,
                       a.form_id,
                       a.NSLeft as NSLeft,
                       a.NSRight as NSRight,
                       a.title as cat_title,
                       a.title as category,
                       a.public as public,
                       a.thumb1 as thumb1,
                       a.thumb2 as thumb2,
                       a.thumbsqr as thumbsqr,
                       u.nickname as user,
                       u.is_deleted as user_is_deleted,
                       u.login as user_login
                FROM cms_board_items i
                INNER JOIN cms_board_cats a ON a.id = i.category_id
                LEFT JOIN cms_users u ON u.id = i.user_id
                WHERE i.id = '
$item_id'";

        
$result $this->inDB->query($sql);

        if (!
$this->inDB->num_rows($result)){ return false; }

        
$record $this->inDB->fetch_assoc($result);

        
$timedifference       strtotime("now") - strtotime($record['pubdate']);
        
$record['is_overdue'] = round($timedifference 86400) > $record['pubdays'] && $record['pubdays'] > 0;
        
$record['fpubdate']   = $record['pubdate'];
        
$record['pubdate']       = cmsCore::dateFormat($record['pubdate']);
        
$record['vipdate']       = cmsCore::dateFormat($record['vipdate']);
        
$record['enc_city']   = urlencode($record['city']);
        
$record['moderator']  = $this->checkAccess($record['user_id']);
        if (!
$record['file'] || !file_exists(PATH.'/images/board/small/'.$record['file'])){
            
$record['file'] = '';
        }

        if (!
$record['formsdata']){
            
$record['form_array'] = array();
        } else {
            
$record['form_array'] = cmsCore::yamlToArray($record['formsdata']);
        }

        return 
cmsCore::callEvent('GET_BOARD_RECORD'$record);

    }

/* ==================================================================================================== */
/* ==================================================================================================== */

    
public function addRecord($item){

        
$inUser cmsUser::getInstance();
        
$item cmsCore::callEvent('ADD_BOARD_RECORD'$item);

        
$sql "INSERT INTO cms_board_items (category_id, user_id, obtype, title , content, formsdata, city, pubdate, pubdays, published, file, hits, ip)
                VALUES (
{$item['category_id']}{$item['user_id']}, '{$item['obtype']}', '{$item['title']}', '{$item['content']}', '{$item['formsdata']}',
                        '
{$item['city']}', NOW(), {$item['pubdays']}{$item['published']}, '{$item['file']}', 0, INET_ATON('{$inUser->ip}'))";

        
$this->inDB->query($sql);

        
$item_id $this->inDB->get_last_id('cms_board_items');

        return 
$item_id $item_id false;
    }

/* ==================================================================================================== */
/* ==================================================================================================== */

    
public function updateRecord($id$item){

        
$item cmsCore::callEvent('UPDATE_BOARD_RECORD'$item);

        
$this->inDB->update('cms_board_items'$item$id);

        return 
true;

    }

/* ==================================================================================================== */
/* ==================================================================================================== */

    
public function deleteRecord($item_id) {

        
cmsCore::callEvent('DELETE_BOARD_RECORD'$item_id);

        
$item $this->getRecord($item_id);
        if(!
$item) { return false; }

        @
unlink(PATH.'/images/board/'.$item['file']);
        @
unlink(PATH.'/images/board/small/'.$item['file']);
        @
unlink(PATH.'/images/board/medium/'.$item['file']);

        
$this->inDB->delete('cms_board_items'" id = '$item_id'"1);

        
cmsCore::deleteComments('boarditem'$item_id);

        
cmsActions::removeObjectLog('add_board'$item_id);

        return 
true;

    }

/* ==================================================================================================== */
/* ==================================================================================================== */

    
public function deleteOldRecords() {

        if (
$this->config['aftertime']){
            
$time_sql '';
            switch (
$this->config['aftertime']){
                case 
'delete':  $time_sql "DELETE FROM cms_board_items WHERE DATEDIFF(NOW(), pubdate) > pubdays AND pubdays > 0"; break;
                case 
'hide':    $time_sql "UPDATE cms_board_items SET published = 0 WHERE DATEDIFF(NOW(), pubdate) > pubdays AND pubdays > 0"; break;
            }
            if (
$time_sql){
                
$this->inDB->query($time_sql);
            }
        }

        return 
true;

    }

    public function 
clearOldVips() {

        return 
$this->inDB->query("UPDATE cms_board_items SET is_vip=0 WHERE DATE(vipdate) <= CURRENT_DATE");

    }

    public function 
deleteVip($item_id) {

        return 
$this->inDB->query("UPDATE cms_board_items SET is_vip=0 WHERE id = '{$item_id}'");

    }

/* ==================================================================================================== */
/* ==================================================================================================== */

    
public function setVip($id$days){

        
// Установить статус VIP и дату окончания считая от текущей,
        // если до этого статуса VIP не было
        
$sql "UPDATE cms_board_items
                SET is_vip = 1, vipdate = DATE_ADD(NOW(), INTERVAL 
{$days} DAY)
                WHERE id='
{$id}' AND is_vip=0
                LIMIT 1"
;

        
$this->inDB->query($sql);

        
// Продлить имеющуюся дату VIP, если VIP-статус уже был
        
$sql "UPDATE cms_board_items
                SET vipdate = DATE_ADD(vipdate, INTERVAL 
{$days} DAY)
                WHERE id='
{$id}' AND is_vip=1
                LIMIT 1"
;

        
$this->inDB->query($sql);

        return 
true;

    }
/* ==================================================================================================== */
/* ==================================================================================================== */

    
public function uploadPhoto($old_file ''$cat) {

        
// Загружаем класс загрузки фото
        
cmsCore::loadClass('upload_photo');
        
$inUploadPhoto cmsUploadPhoto::getInstance();
        
// Выставляем конфигурационные параметры
        
$inUploadPhoto->upload_dir    PATH.'/images/board/';
        
$inUploadPhoto->small_size_w  $cat['thumb1'];
        
$inUploadPhoto->medium_size_w $cat['thumb2'];
        
$inUploadPhoto->thumbsqr      $cat['thumbsqr'];
        
$inUploadPhoto->is_watermark  $this->config['watermark'];
        
// Процесс загрузки фото
        
$file $inUploadPhoto->uploadPhoto($old_file);

        return 
$file;

    }

/* ==================================================================================================== */
/* ==================================================================================================== */

    
public function getOrder($order=''$default='') {

        if (
cmsCore::inRequest($order)) {
            
$orders cmsCore::request($order'str');
            
cmsUser::sessionPut('ad_'.$order$orders);
        } elseif(
cmsUser::sessionGet('ad_'.$order)) {
            
$orders cmsUser::sessionGet('ad_'.$order);
        } else {
            
$orders $default;
        }

        return 
$orders;

    }

/* ==================================================================================================== */
/* ==================================================================================================== */

    
public function getCatCity($cat_id 0){

        
$cat_city = array();

        
$cat_id = ($cat_id == $this->root_cat['id']) ? $cat_id;
        
$cat_sql $cat_id "category_id = '$cat_id'" '1=1';

        
$sql "SELECT city FROM cms_board_items WHERE published = 1 AND {$cat_sql} GROUP BY city";
        
$result $this->inDB->query($sql);

        if (
$this->inDB->num_rows($result)){
            while(
$c $this->inDB->fetch_assoc($result)){
                
$cat_city[] = $c['city'];
            }
        }

        return 
$cat_city;
    }

/* ==================================================================================================== */
/* ==================================================================================================== */

    
public function getBoardCities($selected=''$cat=array()){

        global 
$_LANG;

        
$html '<select name="city" onchange="$('form#obform').submit();" style="width:130px">';
        
$html .= '<option value="all">'.$_LANG['ALL_CITY'].'</option>';
        if(empty(
$cat['cat_city'])) { $cat['cat_city'] = $this->getCatCity(); }
        if (
$cat['cat_city']){
            foreach(
$cat['cat_city'] as $cat_city){
                if (
mb_strtolower($selected)==mb_strtolower($cat_city)){
                    
$s 'selected="selected"';
                } else {
                    
$s '';
                }
                
$pretty htmlspecialchars(icms_ucfirst($cat_city));
                
$html .= '<option value="'.$pretty.'" '.$s.'>'.$pretty.'</option>';
            }
        }
        
$html .= '</select>';
        return 
$html;

    }

/* ==================================================================================================== */
/* ==================================================================================================== */
    
public function getTypesLinks($cat_id$types){

        
$html  '';
        
$types explode("n"$types);
        foreach(
$types as $id=>$type){
            
$type trim($type);
            
$html .= '<a class="board_cats_a" href="/board/'.$cat_id.'/type/'.urlencode(icms_ucfirst($type)).'">'.icms_ucfirst($type).'</a>, ';
        }
        
$html rtrim($html', ');
        return 
$html;

    }
/* ==================================================================================================== */
/* ==================================================================================================== */
    
public function getTypesOptions($types=''$selected=''){

        
$html  '';

        if (!
$types){
            
$types explode("n"$this->config['obtypes']);
        } else {
            
$types explode("n"$types);
        }

        foreach(
$types as $type){
            
$type icms_ucfirst(htmlspecialchars(trim($type)));
            if (
mb_strtolower($selected) == mb_strtolower($type)){ $sel 'selected="selected"'; } else { $sel ''; }
            
$html .= '<option value="'.$type.'" '.$sel.'>'.$type.'</option>';
        }
        return 
$html;

    }
/* ==================================================================================================== */
/* ==================================================================================================== */
    
public function orderForm($orderby$orderto$category){

        
$smarty $this->inCore->initSmarty('components''com_board_order_form.tpl');
        
$smarty->assign('btype'$this->obtype);
        
$smarty->assign('btypes'$this->getTypesOptions($category['obtypes'], $this->obtype));
        
$smarty->assign('bcity'$this->city);
        
$smarty->assign('bcities'$this->getBoardCities($this->city$category));
        
$smarty->assign('orderby'$orderby);
        
$smarty->assign('orderto'$orderto);
        
$smarty->assign('action_url''/board/'.$category['id']);
        
ob_start();
        
$smarty->display('com_board_order_form.tpl');
        return 
ob_get_clean();

    }
/* ==================================================================================================== */
/* ==================================================================================================== */
    
public function checkLoadedByUser24h($cat){

        
$inUser cmsUser::getInstance();

        if(!
$cat['uplimit']) { return true; }

        if(
$inUser->id){
            
$where " AND user_id = '{$inUser->id}'";
        } elseif (
$inUser->ip && $inUser->ip != '127.0.0.1'){
            
$where " AND ip = INET_ATON('{$inUser->ip}')";
        } else {
            return 
false;
        }

        
$u_count $this->inDB->rows_count('cms_board_items'"category_id = '{$cat['id']}{$where} AND pubdate >= DATE_SUB(NOW(), INTERVAL 1 DAY)");

        if(
$u_count<=$cat['uplimit']) { return true; }

        return 
false;
    }

/* ==================================================================================================== */
/* ==================================================================================================== */

    
public function checkAccess($user_id){

        
$inUser cmsUser::getInstance();

        if (
$inUser->id){
            
$access = ($inUser->is_admin || $this->is_moderator_by_group || $user_id == $inUser->id);
        } else {
            
$access false;
        }
        return 
$access;

    }

/* ==================================================================================================== */
/* ==================================================================================================== */

    
public function checkAdd($cat){

        
// администраторы могут всегда
        
if(cmsUser::getInstance()->is_admin) { return true; }

        
// настройки группы всегда приоритетней
        
if(!$this->is_can_add_by_group) { return false; }

        
// наследование от настроек компонента
        
if ($cat['public'] == -1) { $cat['public'] = $this->config['public']; }

        if(
$cat['public']>0) { return true; }

        return 
false;

    }

/* ==================================================================================================== */
/* ==================================================================================================== */

    
public function checkPublished($cat$is_edit false){

        
// админы и модераторы добавляют всегда без модерации
        
if(cmsUser::getInstance()->is_admin || $this->is_moderator_by_group) { return 1; }

        
// при редактировании объявления смотрим опцию publish_after_edit
        
if($is_edit){
            if(
$this->config['publish_after_edit']) { return 1; }
        }

        
// наследование от настроек компонента
        
if ($cat['public'] == -1) { $cat['public'] = $this->config['public']; }

        if (
$cat['public']==&& $this->inCore->isUserCan('board/autoadd')) { return 1; }

        return 
0;

    }

/* ==================================================================================================== */
/* ==================================================================================================== */

}
Онлайн: 1
Реклама