vote_id) ) { $CACHE_KEY = Yii::app()->cache->buildKey( keysSet::CACHE_KEY_POLLS_WIDGET, array() ); $poll = Yii::app()->cache->get($CACHE_KEY); if($poll === false) { //Если не задано какой конкретно опрос брать, берём самый свежиый, достпный для показа $criteria = new CDbCriteria; $criteria->order = "id DESC"; $criteria->limit = 1; $poll = Votes::model()-> with(array( 'items', 'users_voted_count', 'voices_count', ))-> visible()-> find($criteria); $not_from_cache = true; } } else{ $CACHE_KEY = Yii::app()->cache->buildKey( keysSet::CACHE_KEY_POLLS_WIDGET, array($this->vote_id) ); $poll = Yii::app()->cache->get($CACHE_KEY); if($poll === false) { //Если задано какой конкретно опрос брать, берём его $poll = Votes::model()-> with(array( 'items', 'users_voted_count', 'voices_count', ))-> visible()-> FindByPk($this->vote_id); $not_from_cache = true; } } if( $not_from_cache ) { $TTL = iMemCache::CACHE_DURATION_1_DAY; if( empty($poll) ) { $TTL = Votes::model()->correctCacheTime(iMemCache::CACHE_DURATION_1_DAY, "active=1"); } else{ $TTL = Votes::model()->correctCacheTime(iMemCache::CACHE_DURATION_1_DAY, "active=1 AND id={$poll->id}"); } Yii::app()->cache->set($CACHE_KEY, $poll, $TTL); if( empty($poll) ) { Yii::app()->cache->addDependency($CACHE_KEY, array( //Сбрасываем кеш, когда какой-то опрос изменяется из админки или добавляется новый активный опрос 'Votes@isActive' => array(), ) ); } else { Yii::app()->cache->addDependency($CACHE_KEY, array( //Сбрасываем кеш, если кто-то ещё проголосовал в этом опросе "VotesVoices@pollIs({$poll->id})" => array(), //Сбрасываем кеш, если из админки отредактировали варианты ответов, входящие в этот тест "VotesItems@pollIs({$poll->id})" => array(), //Сбрасываем кеш, когда данный опрос изменяется из админки или добавляется новый активный опрос '>Votes@isActive' => array($poll->id), ) ); } } if( !empty($poll) ) { //Условие показа опроса: //Если пользователь может голосовать(ещё не голосовал) //или если есть ограничение голосования по IP, но не стоит кука, что он уже голосовал, //тогда покажем опрос, а иначе результаты гослования. //Если стоит ограничение по голосованию с этого IP, то покажем голосование, но при попытке //проголосовать будет выводиться предупреждение, что голосовать с этого IP пока нельзя, надо ждать минуту. $show_poll_to_vote = $poll->Can_I_Vote() || ($poll->is_ip_restricted() && !isset(Yii::app()->request->cookies[Votes::getCookieKey($poll->id)])); $this->render('application.widgets.polls.views.votes', array('poll' => $poll, 'show_poll_to_vote' => $show_poll_to_vote)); } } }