<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
class sp_question{
var $id = 0;
var $data = array();
var $last_error = '';
var $options = array();
function __construct($id = 0){
$this->id = $id;
$CI = &get_instance();
$CI->load->helper('cookie');
$default = array(
'archive_url' => 'polls-archive',
'show_archives_link' => 1,
'show_results_link' => 1,
'close_after_hour' => 0,
'admin_number_records' => 10,
'len_polls' => t('1 неделя'),
'secur_polls' => t('Защита по Coookie')
);
$this->options = mso_get_option('plugin_samborsky_polls', 'plugins', $default);
}
/***
* Возвращает html код активного голосования.
* Если юзер голосовал в нем, выводятся результаты.
* @return
*/
function get_active_code(){
$CI = &get_instance();
// Получаем активное голосование
$CI->db->select('*')->limit(1)->order_by('q_id','random');
if( !$this->id ){
// Где голосование активно, и входит во временные рамки
$CI->db->where(array(
'q_active' => true
));
}
else{
// С указанным ID
$CI->db->where('q_id',$this->id);
}
$questions = $CI->db->get('sp_questions');
if( $questions->num_rows() > 0 ){
$this->data = $questions->row();
$this->id = $this->data->q_id;
// если подошла дата закрытия, и голосование не бессрочное - закрываем
if($this->data->q_expiry and $this->data->q_active)
{
$close_time = $this->data->q_expiry;
$close_time += $this->options['close_after_hour']*60*60;
if($close_time < time())
{
$this->data->q_active = 0;
$this->update();
$CI->db->insert('sp_logs',array('l_qid'=>$this->id,'l_host'=>t('Закрыто'),'l_timestamp'=>time()));
}
}
// Если голосование запрещено, т.е. по сути пользователь уже голосовал
// Показываем только результаты
if(!$this->check_allow())
return $this->results();
// Если голосование закрыто - показываем только результаты
elseif(!$this->data->q_active)
return $this->results();
else{
return $this->form();
}
}
return '';
}
function results(){
if( !$this->id ) return '';
$CI = &get_instance();
$CI->load->library('table');
$CI->table->clear();
$CI->table->set_template(array(
'table_open' => '<table class="sp_results">'
));
$CI->table->set_caption("<strong>{$this->data->q_question}</strong>");
// Находим все варианты ответов
$answers = new sp_answer();
$answers_array = $answers->get_array($this->id);
foreach( $answers_array as $a ){
$line = getinfo('plugins_url') . 'samborsky_polls/img/1.gif';
$percent = $this->data->q_totalvotes ? ($a->a_votes/$this->data->q_totalvotes)*100 : 0.00;
$percent_width = ceil($percent);
$percent = round($percent,2);
$CI->table->add_row("{$a->a_answer} ({$a->a_votes}) {$percent}%");
$CI->table->add_row('<img src="' . $line . '" style="border-left: 1px solid #7cbeeb; height: 10px; width: ' .$percent_width .'%">');
}
$total = number_format($this->data->q_totalvoters,0,' ',' ');
$CI->table->add_row("<strong>".t('Всего проголосовало:')."</strong> {$total} ".t('чел'));
if( $this->options['show_archives_link'] )
$CI->table->add_row('<div align="center"><a href="'.getinfo('siteurl').$this->options['archive_url'].'">'.t('Архивы голосований').'</a></div>');
$out = $CI->table->generate();
return $out;
}
function form(){
$CI = &get_instance();
$CI->load->library('table');
$CI->table->clear();
$CI->table->set_template(array(
'table_open' => '<table class="sp_polls" id="sp_polls_'.$this->id.'">'
));
$CI->table->set_caption("<strong>{$this->data->q_question}</strong>");
$answers = new sp_answer();
$answers_array = $answers->get_array($this->id);
foreach( $answers_array as $a )
{
$CI->table->add_row(
"<label><input type=\"radio\" id=\"sp_answer_{$a->a_id}\" class=\"sp_question_{$this->id}\" name=\"sp_question_{$this->id}\" value=\"{$a->a_id}\"> {$a->a_answer}</label>");
/*
$CI->table->add_row(
"<input type=\"radio\" id=\"sp_answer_{$a->a_id}\" class=\"sp_question_{$this->id}\" name=\"sp_question_{$this->id}\" value=\"{$a->a_id}\">",
"<label for=\"sp_answer_{$a->a_id}\">{$a->a_answer}</label>"
);
*/
}
// Куда отправлять POST
$ajax_path = getinfo('ajax') . base64_encode('plugins/samborsky_polls/ajax-ajax.php');
$results_link = $this->options['show_results_link'] ? ' <a href="javascript: void(0);" onclick="javascript:sp_polls_results('.$this->id.');" class="sp_polls_ajax_link">'.t('Результаты').'</a>' : '';
$CI->table->add_row(
'<input type="hidden" id="sp_ajax_path_'.$this->id.'" value="'.$ajax_path.'">'
. '<input type="button" value="'.t('Проголосовать').'" onclick="javascript:sp_polls_vote('.$this->id.');">' . $results_link
);
if( $this->options['show_archives_link'] )
$CI->table->add_row('<a href="'.getinfo('siteurl').$this->options['archive_url'].'">'.t('Архивы голосований').'</a>');
// Генерируем таблицу и форму загрузки
$out = $CI->table->generate() .
"<div class=\"sp_polls_loader\" id=\"sp_polls_loader_{$this->id}\">
<img src=\"". getinfo('plugins_url') . 'samborsky_polls/ajax-loader.gif' ."\" alt=\"".t('Идет загрузка…')."\">
<p>".t('Идет загрузка…')."</p>
</div>";
return $out;
}
function get(){
if( !$this->id ) return false;
$CI = &get_instance();
$CI->db->select('*');
$CI->db->limit(1);
$CI->db->where('q_id',$this->id);
$query = $CI->db->get('sp_questions');
if( $query->num_rows() ){
$this->data = $query->row();
return true;
}
return false;
}
function insert($data = array()){
if( !empty($data) ){
$this->data = $data;
}
else{
return false;
}
$CI = &get_instance();
if( $ret = $CI->db->insert('sp_questions',$this->data) ){
$this->id = $CI->db->insert_id();
$CI->db->cache_delete_all();
return true;
}
return false;
}
function update($data = array()){
if( !$this->id ) return false;
if( !empty($data) ){
$this->data = $data;
}
$CI = &get_instance();
$CI->db->where('q_id',$this->id);
$r = $CI->db->update('sp_questions',$this->data);
$CI->db->cache_delete_all();
return $r;
}
function check_allow(){
global $MSO;
if( empty($this->data) ){
return false;
}
// Если на голосовании нет защиты
if( 0 == $this->data->q_protection ){
return true;
}
// Если стоит защита по Cookie;
if( 1 == $this->data->q_protection ){
$cookie = get_cookie('sp_' . $this->id);
if( !$cookie ){
return TRUE;
}
else{
$this->last_error = t('Вы уже голосовали');
}
}
// Если стоит защита по юзеру;
if( 2 == $this->data->q_protection ){
if( is_login() ){
// Проверим голосовал ли чел
$CI = &get_instance();
$CI->db->select('l_id')->limit(1)->where(array(
'l_qid' => $this->id,
'l_userid' => $MSO->data['session']['users_id']
));
$query = $CI->db->get('sp_logs');
if( $query->num_rows() ){
$this->last_error = t('Вы уже голосовали');
return FALSE;
}
return TRUE;
}
else{
$this->last_error = t('Голосовать могут только зарегистрированые пользователи. Пройдите регистрацию.');
}
}
// Если голосовать можно только зарегистрированным (тем кто в mso_users, не путать с комюзерами)
return false;
}
function close(){
if( !$this->id ) return false;
$CI = &get_instance();
return $CI->db->where('q_id',$this->id)->limit(1)->update('sp_questions',array('q_active' => false));
}
public function open(){
if( !$this->id ) return false;
$CI = &get_instance();
return $CI->db->where('q_id',$this->id)->limit(1)->update('sp_questions',array('q_active' => true));
}
}
class sp_answer{
var $a_id = 0;
var $data = array();
function __construct($a_id = 0){
$this->a_id = $a_id;
}
/***
* Получает массив вариантов ответов
* @return
*/
function get($a_id = 0){
$this->data = array();
if( $a_id ) $this->a_id = $a_id;
$CI = &get_instance();
$CI->db->select('*');
$CI->db->order_by('a_order');
$CI->db->limit(1);
$CI->db->where('a_id',$this->a_id);
$query = $CI->db->get('sp_answers');
if( $query->num_rows() ){
$this->data = $query->row();
}
return !empty($this->data);
}
/***
* Обновляет вариант ответа
* @return
* @param object $data
*/
function update($data = array(),$a_id = 0){
if( !empty($data) ){
$this->data = $data;
}
if( $a_id ) $this->a_id = $a_id;
$CI = &get_instance();
$CI->db->where('a_id',$this->a_id);
$CI->db->update('sp_answers',$this->data);
$CI->db->cache_delete_all();
}
/***
* Создает вариант ответа
* @return
* @param object $data[optional]
*/
function insert($data = array()){
if( !empty($data) ){
$this->data = $data;
}
else{
return false;
}
$CI = &get_instance();
if( $ret = $CI->db->insert('sp_answers',$this->data) ){
$this->id = $CI->db->insert_id();
$CI->db->cache_delete_all();
return true;
}
return false;
}
/***
* Увеличивает счетчик для заданного варианта ответа
* @return
* @param object $a_id[optional]
*/
function inc($a_id = 0){
if( $a_id ) $this->a_id = $a_id;
if( $this->get() ){
$this->update(array(
'a_votes' => $this->data->a_votes + 1
));
}
}
/***
* Получает массив вариантов ответов по ID голосования
* @return
* @param object $q_id
*/
function get_array($q_id){
if( !$q_id ) return array();
$CI = &get_instance();
// Получаем варианты ответов
$CI->db->select('*');
$CI->db->where('a_qid',$q_id);
$CI->db->order_by('a_order');
$answers = $CI->db->get('sp_answers');
if( $answers->num_rows() ){
return $answers->result();
}
return array();
}
}
class sp_archive{
function single($id){
$question = new sp_question($id);
return $question->get_active_code();
}
function archive(){
$CI = &get_instance();
$CI->db->select('*');
$CI->db->order_by('q_id','desc');
$archive_url = mso_get_option('plugin_samborsky_polls', 'plugins', array('archive_url'=>'polls-archive'));
$archive_url = $archive_url['archive_url'];
$query = $CI->db->get('sp_questions');
if( $query->num_rows() ){
$CI->load->library('table');
$CI->table->clear();
$CI->table->set_template(array(
'table_open' => '<table border="0" width="100%" class="samborspy_polls_archive">'
));
$CI->table->set_heading(
t('Название голосования'),
'<div align="right">'.t('Сумма голосов').'</div>',
'<div align="right">'.t('Проголосовало чел.').'</div>',
t('Статус'));
foreach( $query->result() as $row )
{
$CI->table->add_row(
($row->q_active) ? '<a href="'. getinfo('siteurl') .$archive_url .'/'. $row->q_id .'">' . stripslashes($row->q_question) . '</a>' : stripslashes($row->q_question),
'<div align="right">' . number_format($row->q_totalvotes,0,' ',' ') . '</div>',
'<div align="right">' . number_format($row->q_totalvoters,0,' ',' ') . '</div>',
$row->q_active ? t('Активно') : t('Закрыто')
);
}
return $CI->table->generate();
}
return '';
}
function get(){
$seg = mso_segment(2);
// Пустой параметр, выводим архив
if( empty($seg) ){
return $this->archive();
}
// Чистовой параметр, значит ID
else if( is_numeric($seg) ){
return $this->single($seg);
}
return '';
}
}
# End of file