Вход Регистрация
Файл: protected/models/Comment.php
Строк: 160
<?php

/**
 * This is the model class for table "{{comment}}".
 *
 * The followings are the available columns in table '{{comment}}':
 * @property integer $id
 * @property integer $id_post
 * @property integer $id_user
 * @property integer $create_time
 * @property string $login
 * @property string $content
 */
class Comment extends CActiveRecord
{
    
/*
         * Имя куков с логином юзера
         */
        
const COOKIE_USER 'cookie_user';

        
/*
         * Сколько жить кукам после установки (в секундах)?
         */
        
const COOKIE_LIFE 31536000;// 1 Год



        /*
         * Позиция коммента на странице с комментариями (Применяется при выборе новых комментов)
         */
        
public $position;



        
/**
     * Returns the static model of the specified AR class.
     * @return Comment the static model class
     */
    
public static function model($className=__CLASS__)
    {
        return 
parent::model($className);
    }

    
/**
     * @return string the associated database table name
     */
    
public function tableName()
    {
        return 
'{{comment}}';
    }

    
/*
         * Сохранение системных данных
         */
        
public function  beforeSave ()
        {
            
$this->ip Yii::app ()->request->userHostAddress;
            
$this->user_agent Yii::app ()->request->userAgent;

            
$this->id_user = (Yii::app ()->user->isGuest) ? Yii::app ()->user->getModel ()->id;
            if (
$this->isNewRecord$this->create_time time ();

            
// Видел ли админ коммент
            
$this->is_see Yii::app ()->user->isGuest 1;

            return 
parent::beforeSave ();
        }

        
/**
     * @return array validation rules for model attributes.
     */
    
public function rules()
    {
        
// NOTE: you should only define rules for those attributes that
        // will receive user inputs.
            
return array(
                (!
Yii::app ()->user->isGuest) ? array ('login''default''value' => NULL) :
                array(
'login''required',
                    
'message' => 'Вы не ввели логин'),
                array(
'login''length''min' => 2'max'=>70'encoding' => 'utf8',
                    
'tooShort' => 'Логин слишком короткий. Минимум 2 символа.',
                    
'tooLong' => 'Логин слишком длинный. Максимум 70 символов.'),

                array(
'content''required',
                    
'message' => 'Вы не ввели комментарий'),
                array(
'content''length''max'=> 10*1024'encoding' => 'utf8',
                    
'tooLong' => 'Комментарий слишком длинный. Максимум 10 Кб.'),
            );
    }

    
/**
     * @return array Связь с другими таблицами
     */
    
public function relations()
    {
        
// NOTE: you may need to adjust the relation name and the related
        // class name for the relations automatically generated below.
        
return array(
                    
// Информация о пользователе
                    
'user' => array (self::BELONGS_TO'User''id_user'),
                    
'post' => array (self::BELONGS_TO'Post''id_post')
                );
    }

    
/**
     * @return array customized attribute labels (name=>label)
     */
    
public function attributeLabels()
    {
        return array(
            
'id' => 'ID',
            
'id_post' => 'Id Post',
            
'id_user' => 'Id User',
            
'create_time' => 'Create Time',
            
'login' => 'Login',
            
'content' => 'Content',
        );
    }

    
/**
     * Retrieves a list of models based on the current search/filter conditions.
     * @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.
     */
    
public function loadComments ($id)
    {
            
$criteria = new CDbCriteria (array (
                
'with' => array ('user'),
                
'order' => '`create_time` DESC',
                
'condition' => '`id_post`=:id_post',
                
'params' => array (':id_post' => $id)
            ));

            return new 
CActiveDataProvider (get_class ($this), array(
            
'criteria' => $criteria,
                
'pagination' => array (
                    
'pageSize' => Yii::app ()->config->page_count_comments
                
)
            ));
    }

        
/*
         * Число комментариев К СТАТЬЕ
         */
        
public function getCommentCount ($id_post)
        {
            return 
$this->count ('`id_post`=:id_post', array (':id_post' => $id_post));
        }

        
/*
         * Последние комментарии
         */
        
public function loadLastComments ()
        {
            
$criteria=new CDbCriteria (array (
                
'with' => array ('user''post'),
                
/*
                 * Разрешаем конфликт имен столбцов
                 * `t` - псевдоним главной таблицы. В данном случае Comment
                 */
                
'order' => '`t` . `create_time` DESC',
                
'condition' => (Yii::app ()->user->isGuest) ? '`post` . `status` = "' Post::STATUS_PUBLISHED '"' '',//! без параметров
            
));

            return new 
CActiveDataProvider(get_class($this), array(
            
'criteria'=>$criteria,
                
'pagination' => array (
                    
'pageSize' => Yii::app ()->config->page_count_comments
                
)
            ));
        }

        
/*
         * Загрузка непрочитанных комментариев
         */
        
public function loadNewComments ()
        {
            
/*
            Yii::app ()->db->createCommand ('SET @v1 := 0;')->execute ();
            // Получаем все столбцы данной таблицы
            $attributes = '`' . implode ('`, `', array_keys ($this->attributes)) . '`';
            // Условие запроса (WHERE)
            $condition = ((Yii::app ()->user->isGuest) ? '`post` . `status`=' . Post::STATUS_PUBLISHED . 'AND ' : '') . '`t` . `is_see` = 0';
            
            $dataReader = Yii::app ()->db->createCommand ('SELECT @v1 := (@v1 + 1) AS `position`, ' . $attributes . ' FROM `' . $this->tableName () . '`')->where ($condition)->query ();

            return $dataReader;
             */
            
            
Yii::app ()->db->createCommand ('SET @v1 := 0;')->execute ();
            
$attributes '`' implode ('`, `'array_keys ($this->attributes)) . '`';

            
$criteria=new CDbCriteria (array (
                
'select' => '@v1 := (@v1 + 1) AS position, ' $attributes,
                
'with' => array ('user''post'),
                
/*
                 * Разрешаем конфликт имен столбцов
                 * `t` - псевдоним главной таблицы. В данном случае Comment
                 */
                
'order' => '`t` . `create_time` DESC',
                
'condition' => ((Yii::app ()->user->isGuest) ? '`post` . `status`=' Post::STATUS_PUBLISHED 'AND ' '') . '`t` . `is_see` = 0',
            ));

            return new 
CActiveDataProvider(get_class($this), array(
            
'criteria'=>$criteria,
                
'pagination' => array (
                    
'pageSize' => Yii::app ()->config->page_count_comments
                
)
            ));
        }

        

        
/*
         * Обновление статуса видимости админом всех комментов, ВИДИМЫХ НА ТЕКУЩЕЙ СТРАНИЦЕ
         * @param array Массив с идентификаторами статей
         */
        
public function updateSeeStatus (array $ids)
        {
            
$in implode (', '$ids);

            
// Запросы на обновление весьма жрут производительность, поэтому перед обновлением проверяем, стоит ли это делать
            
if (!Yii::app ()->user->isGuest && $this->find ('`id` IN (' $in ') AND `is_see` = 0') != NULL)
            {
                
$this->updateAll (array ('is_see' => 1), '`id` IN (' $in ')');
            }
        }
}
Онлайн: 0
Реклама