Вход Регистрация
Файл: concrete5.7.5.6/concrete/blocks/survey/controller.php
Строк: 243
<?php

namespace ConcreteBlockSurvey;

use 
ConcreteCoreBlockBlockController;
use 
Page;
use 
User;
use 
Core;
use 
Database;

class 
Controller extends BlockController
{
    public 
$options = array();
    protected 
$btTable 'btSurvey';
    protected 
$btInterfaceWidth "420";
    protected 
$btInterfaceHeight "400";
    protected 
$btExportTables = array('btSurvey''btSurveyOptions''btSurveyResults');

    public function 
on_start()
    {
        
$this->cID null;

        
$c Page::getCurrentPage();

        if (
is_object($c)) {
            
$this->cID $c->getCollectionID();
        }
        if (
$this->bID) {
            
$db Database::connection();
            
$v = array($this->bID);
            
$q "SELECT optionID, optionName, displayOrder FROM btSurveyOptions WHERE bID = ? ORDER BY displayOrder ASC";
            
$r $db->query($q$v);
            
$this->options = array();
            if (
$r) {
                while (
$row $r->fetchRow()) {
                    
$opt = new Option();
                    
$opt->optionID $row['optionID'];
                    
$opt->cID $this->cID;
                    
$opt->optionName $row['optionName'];
                    
$opt->displayOrder $row['displayOrder'];
                    
$this->options[] = $opt;
                }
            }
        }
    }

    
/**
     * Used for localization. If we want to localize the name/description we have to include this.
     */
    
public function getBlockTypeDescription()
    {
        return 
t("Provide a simple survey, along with results in a pie chart format.");
    }

    public function 
getBlockTypeName()
    {
        return 
t("Survey");
    }

    public function 
getQuestion()
    {
        return 
$this->question;
    }

    public function 
getPollOptions()
    {
        return 
$this->options;
    }

    public function 
delete()
    {
        
$db Database::connection();
        
$v = array($this->bID);

        
$q "DELETE FROM btSurveyOptions WHERE bID = ?";
        
$db->query($q$v);

        
$q "DELETE FROM btSurveyResults WHERE bID = ?";
        
$db->query($q$v);

        
parent::delete();
    }

    public function 
action_form_save_vote($bID false)
    {
        if (
$this->bID != $bID) {
            return 
false;
        }

        
$u = new User();
        
$db Database::connection();
        
$bo $this->getBlockObject();
        if (
$this->post('rcID')) {
            
// we pass the rcID through the form so we can deal with stacks
            
$c Page::getByID($this->post('rcID'));
        } else {
            
$c $this->getCollectionObject();
        }

        if (
$this->requiresRegistration()) {
            if (!
$u->isRegistered()) {
                
$this->redirect('/login');
            }
        }

        if (!
$this->hasVoted()) {
            
$antispam Core::make('helper/validation/antispam');
            if (
$antispam->check('''survey_block')) { // we do a blank check which will still check IP and UserAgent's
                
$duID 0;
                if (
$u->getUserID() > 0) {
                    
$duID $u->getUserID();
                }

                
/** @var ConcreteCorePermissionIPService $iph */
                
$iph Core::make('helper/validation/ip');
                
$ip $iph->getRequestIP();
                
$ip = ($ip === false) ? ('') : ($ip->getIp($ip::FORMAT_IP_STRING));
                
$v = array(
                    
$_REQUEST['optionID'],
                    
$this->bID,
                    
$duID,
                    
$ip,
                    
$this->cID, );
                
$q "INSERT INTO btSurveyResults (optionID, bID, uID, ipAddress, cID) VALUES (?, ?, ?, ?, ?)";
                
$db->query($q$v);
                
setcookie("ccmPoll" $this->bID '-' $this->cID"voted"time() + 1296000DIR_REL '/');
                
$this->redirect($c->getCollectionPath() . '?survey_voted=1');
            }
        }
    }

    public function 
requiresRegistration()
    {
        return 
$this->requiresRegistration;
    }

    public function 
hasVoted()
    {
        
$u = new User();
        if (
$u->isRegistered()) {
            
$db Database::connection();
            
$v = array($u->getUserID(), $this->bID$this->cID);
            
$q "SELECT count(resultID) AS total FROM btSurveyResults WHERE uID = ? AND bID = ? AND cID = ?";
            
$result $db->getOne($q$v);
            if (
$result 0) {
                return 
true;
            }
        } elseif (
$_COOKIE['ccmPoll' $this->bID '-' $this->cID] == 'voted') {
            return 
true;
        }

        return 
false;
    }

    public function 
duplicate($newBID)
    {
        
$db Database::connection();

        foreach (
$this->options as $opt) {
            
$v1 = array($newBID$opt->getOptionName(), $opt->getOptionDisplayOrder());
            
$q1 "INSERT INTO btSurveyOptions (bID, optionName, displayOrder) VALUES (?, ?, ?)";
            
$db->query($q1$v1);

            
$v2 = array($opt->getOptionID());
            
$newOptionID $db->Insert_ID();
            
$q2 "SELECT * FROM btSurveyResults WHERE optionID = ?";
            
$r2 $db->query($q2$v2);
            if (
$r2) {
                while (
$row $r2->fetchRow()) {
                    
$v3 = array($newOptionID$row['uID'], $row['ipAddress'], $row['timestamp']);
                    
$q3 "INSERT INTO btSurveyResults (optionID, uID, ipAddress, timestamp) VALUES (?, ?, ?, ?)";
                    
$db->query($q3$v3);
                }
            }
        }

        return 
parent::duplicate($newBID);
    }

    public function 
save($args)
    {
        
parent::save($args);
        
$db Database::connection();

        if (!
is_array($args['survivingOptionNames'])) {
            
$args['survivingOptionNames'] = array();
        }

        
$slashedArgs = array();
        foreach (
$args['survivingOptionNames'] as $arg) {
            
$slashedArgs[] = addslashes($arg);
        }
        
$db->query(
            
"DELETE FROM btSurveyOptions WHERE optionName NOT IN ('" implode(
                
"','",
                
$slashedArgs) . "') AND bID = " intval($this->bID));

        if (
is_array($args['pollOption'])) {
            
$displayOrder 0;
            foreach (
$args['pollOption'] as $optionName) {
                
$v1 = array($this->bID$optionName$displayOrder);
                
$q1 "INSERT INTO btSurveyOptions (bID, optionName, displayOrder) VALUES (?, ?, ?)";
                
$db->query($q1$v1);
                ++
$displayOrder;
            }
        }

        
$query "DELETE FROM btSurveyResults
            WHERE optionID NOT IN (
                SELECT optionID FROM btSurveyOptions WHERE bID = 
{$this->bID}
                )
            AND bID = 
{$this->bID} ";
        
$db->query($query);
    }

    public function 
displayChart($bID$cID)
    {
        
// Prepare the database query
        
$db Database::connection();

        
// Get all available options
        
$options = array();
        
$v = array(intval($bID));
        
$q 'SELECT optionID, optionName FROM btSurveyOptions WHERE bID = ? ORDER BY displayOrder ASC';
        
$r $db->Execute($q$v);

        
$i 0;
        while (
$row $r->fetchRow()) {
            
$options[$i]['name'] = $row['optionName'];
            
$options[$i]['id'] = $row['optionID'];
            ++
$i;
        }

        
// Get chosen count for each option
        
$total_results 0;
        
$i 0;
        foreach (
$options as $option) {
            
$v = array($option['id'], intval($bID), intval($cID));
            
$q 'SELECT count(*) FROM btSurveyResults WHERE optionID = ? AND bID = ? AND cID = ?';
            
$r $db->Execute($q$v);

            if (
$row $r->fetchRow()) {
                
$options[$i]['amount'] = $row['count(*)'];
                
$total_results += $row['count(*)'];
            }
            ++
$i;
        }

        if (
$total_results <= 0) {
            
$chart_options '<div style="text-align: center; margin-top: 15px;">' t(
                    
'No data is available yet.') . '</div>';
            
$this->set('chart_options'$chart_options);

            return;
        }

        
// Convert option counts to percentages, initiate colors
        
$availableChartColors = array(
            
'00CCdd',
            
'cc3333',
            
'330099',
            
'FF6600',
            
'9966FF',
            
'dd7700',
            
'66DD00',
            
'6699FF',
            
'FFFF33',
            
'FFCC33',
            
'00CCdd',
            
'cc3333',
            
'330099',
            
'FF6600',
            
'9966FF',
            
'dd7700',
            
'66DD00',
            
'6699FF',
            
'FFFF33',
            
'FFCC33',
        );
        
$percentage_value_string '';
        foreach (
$options as $option) {
            
$option['amount'] /= $total_results;
            
$percentage_value_string .= round($option['amount'], 3) . ',';
            
$graphColors[] = array_pop($availableChartColors);
        }

        
// Strip off trailing comma
        
$percentage_value_string substr_replace($percentage_value_string'', -1);

        
// Get Google Charts API image
        
$img_src '<img class="surveyChart" style="margin-bottom:10px;" border="" src="//chart.apis.google.com/chart?cht=p&chd=t:' $percentage_value_string '&chs=180x180&chco=' implode(
                
',',
                
$graphColors) . '" />';
        
$this->set('pie_chart'$img_src);

        
// Build human-readable option list
        
$i 1;
        
$chart_options '<table class="table"><tbody>';
        foreach (
$options as $option) {
            
$chart_options .= '<tr>';
            
$chart_options .= '<td>';
            
$chart_options .= '<strong>' trim($options[$i 1]['name']) . '</strong>';
            
$chart_options .= '</td>';
            
$chart_options .= '<td style="text-align:right; white-space: nowrap">';
            
$chart_options .= ($option['amount'] > 0) ? round($option['amount'] / $total_results 100) : 0;
            
$chart_options .= '%';
            
$chart_options .= '<div class="surveySwatch" style="border-radius: 3px; margin-left: 6px; width:18px; height:18px; float:right; background:#' $graphColors[$i 1] . '"></div>';
            
$chart_options .= '</td>';
            
$chart_options .= '</tr>';
            ++
$i;
        }
        
$chart_options .= '</tbody></table>';
        
$this->set('chart_options'$chart_options);
    }
}
Онлайн: 1
Реклама