Вход Регистрация
Файл: protected/models/Post.php
Строк: 166
<?php
/* 
 * Модель статьи
 */

class Post extends CActiveRecord
{
    
/*
     * Статус опубликованной записи
     */
    
const STATUS_PUBLISHED 'published';

    
/*
     * Статус черновика
     */
    
const STATUS_DRAFT 'draft';

    
/*
     * Допустимые символы в тегах
     */
    
const TAGS_MATCH 'а-яa-z0-9_- .!';



    
/*
     * Эту хрень надо передавать из-за особенностей языка и фреймворка...
     */
    
public static function model ($className __CLASS__)
    {
        return 
parent::model ($className);
    }

    
/*
     * Имя таблицы, соответствующей классу
     */
    
public function tableName ()
    {
        return 
'{{post}}';
    }

    
/*
     * Связь с другими таблицами
     */
    
public function relations ()
    {
        return array (
            
// Имя категории, в которой находится статья
            
'category' => array (self::BELONGS_TO'Category''id_category'),
            
// Количество комментариев
            
'commentCount' => array (self::STAT'Comment''id_post'),
            
// Данные об авторе статьи
            
'user' => array (self::BELONGS_TO'User''id_user')
        );
    }

    
/*
     * Сохранение системных данных
     */

    
public function beforeSave()
    {
        if (
$this->isNewRecord$this->create_time time ();
        
$this->update_time time ();

        
// Определяем тип статьи: Обычная или Новость
        
switch (Yii::app ()->controller->id)
        {
            default: case 
'post':
                
$this->type 'post';
            break;

            case 
'news':
                
$this->type 'news';
            break;
        }

        if (
Yii::app ()->controller->action->id == 'createNews'$this->id_category Category::ID_NEWS;

        if (
$this->isNewRecord$this->id_user Yii::app ()->user->id;

        return 
parent::beforeSave ();
    }

    
/*
     * Правила проверки (валидации)
     */
    
public function rules ()
    {
        
$rules = array (
            array (
'title''required',
                
'message' => 'Вы не ввели заголовок статьи'),
            array (
'title''length''min'=>2'max'=>100'encoding' => 'utf8',
                
'tooShort' => 'Заголовок статьи должен быть длиной не менее 2 символов',
                
'tooLong' => 'Заголовок статьи должен быть длиной не более 100 символов'),

            array (
'status''default''value' => self::STATUS_PUBLISHED),
            array (
'status''in''range' => array (self::STATUS_PUBLISHEDself::STATUS_DRAFT)),

            
            
            array (
'info_content''required',
                
'message' => 'Вы не ввели аннотацию статьи'),
            array (
'info_content''length''min'=>2'max'=>500'encoding' => 'utf8',
                
'tooShort' => 'Аннотация статьи должна быть длиной не менее 2 символов',
                
'tooLong' => 'Аннотация статьи должна быть длиной не более 500 символов'),
            
            array (
'cut_content''required',
                
'message' => 'Вы не ввели содержимое статьи'),
            array (
'cut_content''length''min'=>2'max'=>1024*100'encoding' => 'utf8',
                
'tooShort' => 'Содержимое статьи должно быть длиной не менее 2 символов',
                
'tooLong' => 'Содержимое статьи должно быть длиной не более 100 килобайт'),

            

            array (
'tags''match''pattern' => '#^[' self::TAGS_MATCH ']+(' Tag::RAZD '[' self::TAGS_MATCH ']+)*$#iu',
                
'message' => 'Теги должны быть словами или цифрами, перечисленными через запятую (Tag1, tag2, tag3 и т.д.)')
        );

        if (
Yii::app ()->controller->action->id == 'create')
        {
            
$rules CMap::mergeArray ($rules, array (
                array (
'id_category''required',
                    
'message' => 'Вы не выбрали категорию'),
                array (
'id_category''numerical''integerOnly' => '',
                    
'message' => 'Категория должна быть числом'),
            ));
        }

        return 
$rules;
    }



    
/*
     * Загрузка статей из определенной категории
     */
    
public function loadPostsFromCategory ($id)
    {
        
$criteria = array (
            
'condition' => '`id_category` = :id_category' . ((Yii::app ()->user->isGuest) ? ' AND `status`= :status' ''),
            
'params' => array (
                
':id_category' => (int)$id
            
),
            
'order' => '`create_time` DESC',
            
'with' => array ('commentCount')
        );

        
// Если юзер - гость, добавляем дополнительное условие
        
if (Yii::app ()->user->isGuest) {
            
$criteria CMap::mergeArray ($criteria, array (
                
'params' => array (':status' => self::STATUS_PUBLISHED)
            ));
        }

        return new 
CActiveDataProvider (get_class ($this), array (
            
'criteria' => new CDbCriteria ($criteria),
            
// Постраничная навигация
            
'pagination' => array (
                
'pageSize' => Yii::app ()->config->page_count_categories
            
)
        ));
    }

    
/*
     * Загрузка статей для RSS
     */
    
public function loadToRss ()
    {
        
$criteria = new CDbCriteria (array (
            
'order' => '`create_time` DESC',
            
'with' => 'commentCount',

            
'condition' => '`status` = :status',
            
'params' => array (':status' => self::STATUS_PUBLISHED)
        ));

        return new 
CActiveDataProvider (get_class ($this), array (
            
'criteria' => $criteria,
            
// Постраничная навигация
            
'pagination' => array (
                
'pageSize' => Yii::app ()->config->rss_item_count
            
)
        ));
    }

    
/*
     * Загрузка статей для RSS из определенной категории
     */
    
public function loadToRssFromCategory ($id)
    {
        
$criteria = new CDbCriteria;
        
$criteria->condition = (Yii::app ()->user->isGuest) ? '`id_category` = :id_category AND `status` = "' self::STATUS_PUBLISHED '"' '`id_category` = :id_category';//! без параметров
        
$criteria->params = array (
            
':id_category' => (int)$id
        
);
        
$criteria->order '`create_time` DESC';
        
$criteria->with = array ('commentCount');

        return new 
CActiveDataProvider (get_class ($this), array (
            
'criteria' => $criteria,
            
// Постраничная навигация
            
'pagination' => array (
                
'pageSize' => Yii::app ()->config->rss_item_count
            
)
        ));
    }

    
/*
     * Загрузка последних статей
     */
    
public function loadLastPosts ()
    {
        
$criteria = array (
            
'order' => '`create_time` DESC',
            
'with' => 'commentCount',
        );

        
// Если юзер - гость, добавляем дополнительное условие
        
if (Yii::app ()->user->isGuest) {
            
$criteria CMap::mergeArray ($criteria, array (
                
'condition' => '`status` = :status',
                
'params' => array (':status' => self::STATUS_PUBLISHED)
            ));
        }

        return new 
CActiveDataProvider (get_class ($this), array (
            
'criteria' => new CDbCriteria ($criteria),
            
'pagination' => array (
                
'pageSize' => Yii::app ()->config->page_count_last_posts
            
)
        ));
    }
    
    
/*
     * Загрузка черновиков
     */
    
public function loadDrafts ()
    {
        
$criteria = new CDbCriteria (array (
            
'order' => '`create_time` DESC',
            
'with' => 'commentCount',

            
'condition' => '`status` = :status',
            
'params' => array (':status' => self::STATUS_DRAFT)
        ));

        return new 
CActiveDataProvider (get_class ($this), array (
            
'criteria' => $criteria,
            
// Постраничная навигация
            
'pagination' => array (
                
'pageSize' => Yii::app ()->config->page_count_categories
            
)
        ));
    }

    
/*
     * Загрузка статей с определенным тегом
     * @param $pageSize object Костыль для того, чтобы юзать этот метод в RSS
     */
    
public function loadByTag ($tag$pageSize NULL)
    {
        if (empty (
$tag)) throw new CHttpException (500'Неправильный запрос');

        if (
$pageSize === NULL$pageSize Yii::app ()->config->page_count_categories;

        
$criteria = array (
            
'order' => '`create_time` DESC',
            
'with' => 'commentCount',

            
'condition' => ((Yii::app ()->user->isGuest) ? '`status` = :status AND ' '') . '(`tags` = :tag1 OR `tags` LIKE :tag2 OR `tags` LIKE :tag3 OR `tags` LIKE :tag4)',
            
'params' => array (
                
':tag1' => $tag,                                        // Когда в статье 1 тег
                
':tag2' => $tag Tag::RAZD '%',                      // Когда тег стоит первым
                
':tag3' => '%' Tag::RAZD $tag,                      // Когда тег стоит последним
                
':tag4' => '%' Tag::RAZD $tag Tag::RAZD '%'     // Когда тег где-то среди других тегов
            
)
        );

        
// Если юзер - гость, добавляем дополнительное условие
        
if (Yii::app ()->user->isGuest) {
            
$criteria CMap::mergeArray ($criteria, array (
                
'params' => array (':status' => self::STATUS_PUBLISHED)
            ));
        }

        return new 
CActiveDataProvider (get_class ($this), array (
            
'criteria' => new CDbCriteria ($criteria),
            
// Постраничная навигация
            
'pagination' => array (
                
'pageSize' => $pageSize
            
)
        ));
    }

    
/*
     * Загрузка статей по рейтингу (для топа)
     */
    
public function loadByRating ()
    {
        
$criteria = array(
            
'order' => '`positive_votes` - `negative_votes` DESC',
            
'with' => 'commentCount'
        
);

        
// Если юзер - гость, добавляем дополнительное условие
        
if (Yii::app ()->user->isGuest) {
            
$criteria CMap::mergeArray ($criteria, array (
                
'condition' => '`status` = :status',
                
'params' => array (':status' => self::STATUS_PUBLISHED)
            ));
        }

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



    
/*
     * Получение количества черновиков
     */
    
public function getCountDrafts ()
    {
        return 
self::model ()->count ('`status` = :status', array (':status' => self::STATUS_DRAFT));
    }
}
Онлайн: 1
Реклама