Beta класс голосований by Koenig

2.5K
.
Koenig
(\/)____o_O____(\/)

данная тема обсуждение доработки Кнопка мне нравится
идея, одной строчкой добавить в коде кнопки, шаблоны чтоб для удобства например добавить картинки к ссылкам или замутить логику подсчета, шаблонизатор планируется нативный, если делать шаблоны с парсингом , можно отказаться от папки шаблонов вовсе, писать шаблоны строкой
обсуждение очередного велосипеда, осталось только подшаманить шаблонизатор
---
классы будут в итоге расбиты по файлам и сделан файл имулирующий автолоад в incfiles/classess
сами классы будут лежать в папке /incfiles/lib/kvoter
шаблоны наверное будут в папке /files/kvoter
расширение шаблонов tpl.php
отдельный класс для работы с бд, сделан для удобства перехода на PDO, mysqli etc
ДОКА отсутствует, но строк кода не много и интуитивно должно быть понятно

структура таблицы и классы


код теста для mainpage со стандартными параметрами

$a = new Kvoter('test');
$a->init();
$a->debug();


так же можно прям в коде конфигурить будующую панельку
кнопок неограниченое количество, для разных типов кнопок нужно использовать уникальный тип (event)
.
Andrei4ik93
__________________________________________________

второй пост темы будет содержать текущую версию кода

код (+/-)

файл прикреплен http://johncms.com/forum/index ... 07302
<?php

/**
* Класс голосований
* @author Koenig
* tested 5.2.17
*/

/*
install sql

CREATE TABLE IF NOT EXISTS `kvoter` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `type` varchar(255) NOT NULL,
  `vote` varchar(255) NOT NULL,
  `user` int(10) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `type` (`type`),
  KEY `vote` (`vote`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

*/

class Kvoter {
    private $settings;
    
    private $query;
    
    private $template;
    
    private $data;
    
    public function __construct($event, $settings = false) {
        $this->query = new KvoterQuery($event, core::$user_id);
        $settings = $settings ? $settings : array('event' => $event,'options' => array('yes', 'no'), 'revote' => 1, 'tpl' => 0);
        $this->settings = new KvoterSettings($settings);
        #$this->template = new KvoterTemplate($this->settings()->get('tpl'));
        $this->data = new KvoterData($event);
    }
    
    public function init() {
        $counts = array();
        $links = array();
        foreach ($this->settings()->get('options') as $value) {
            $counts[$value] = $this->query()->counter($value);
            $link = '<a href="' . $_SERVER['PHP_SELF'] . '?kvoter=event::' . $this->settings()->get('event') . ';vote::' . $value . '">' . $value . '</a>';
            $links[$value] = $this->isGuest() ? $value : ($this->settings()->get('revote') ? ((!is_null($this->query()->exists()) && $value == $this->query()->exists()) ? $value : $link) : $value);
        }
        $this->data()->add('counts', $counts);
        $this->data()->add('links', $links);
        $this->data()->add('root', core::$system_set['homeurl']);
        $this->template = new KvoterTemplate($this->settings()->get('tpl'));
        new KvoterChecker();
    }
    
    public function isGuest() {
        return !core::$user_id;
    }
   
    public function data() {
        return $this->data;
    }
    
    public function query() {
        return $this->query;
    }
    
    public function settings() {
        return $this->settings;
    }
    
    public function template() {
        return $this->template;
    }
    
    public function render() {
        return $this->template()->render($this->data()->toArray());
    }
    
    public function debug() {
        echo '<pre>' . print_r($this, 1) . '</pre>';
    }
}

class KvoterData {
    
    private $data;
    
    public function __construct($event) {
        $this->add('event', $event);
    }
    
    public function add($key, $value) {
        $this->data[$key] = $value;
        
        return $this;
    }
    
    public function toArray() {
        return $this->data;
    }
}

class KvoterSettings {
    
    private $settings;
    
    public function __construct($settings) {
        $this->settings = $settings;
    }
    
    public function set($key, $value) {
        $this->settings[$key] = $value;
        
        return $this;
    }
    
    public function sets($params) {
        foreach ($params as $key => $value) {
            $this->set($key, $value);
        }
        
        return $this;
    }
    
    public function get($key) {
        return $this->settings[$key];
    }
}

class KvoterChecker {
   
    public function __construct() {
        $this->check();
    }
    
    public function check() {
        if (isset($_REQUEST['kvoter'])) {
            $action = $_REQUEST['kvoter'];
            $query = $this->query($action);
            #echo '<pre>' . print_r($query, 1);
            $event = $query['event'];
            $action = isset($query['act']) ? $query['act'] : 'add';
            $vote = $query['vote'];
            $query = new KvoterQuery($event, core::$user_id);
            switch($action) {
                default : // add
                    $query->add($vote);
                break;    
            }
            $this->redirect();
        } else {
            #echo 'not query';
        }
    }
    
    private function element($element) {
        $res = explode('::', $element);    
        
        return array($res[0] => $res[1]);
    }    

    private function query($part) {
        $array = array();
        foreach (array_values(array_map(array($this, 'element'), explode(';', $part))) as $key => $val) {
            foreach ($val as $k => $v) {    
                $array[$k] = $v;    
            }
        }
        
        return $array;
    }
    
    public function redirect() {
        ob_get_level() and ob_end_clean();
        ob_start();    
        header('Location: ' . $_SERVER['HTTP_REFERER']);
        ob_end_flush();
        exit;
    }
}

class KvoterQuery {
    
    private $event;
    private $user;
    
    public function __construct($event, $user) {
        $this->event = $this->escape($event);
        $this->user = $user;
    }
    
    private function escape($value) {
        return mysql_real_escape_string($value);
    }
    
    private function query($sql, $exec = 0) {
        $res = mysql_query($sql);
        
        switch ($exec) {
            case 0 :
                $ret = mysql_affected_rows();
            break;
            
            case 1 :
                $ret = mysql_fetch_row($res);
                $ret = $ret[0];
            break;
            
            case 2 :
                $ret = array();
                
                while($row = mysql_fetch_assoc($res)) {
                    array_push($ret, $row);
                }
            break;
            
            case 3 :
                $ret = array();
                
                while($row = mysql_fetch_row($res)) {
                    array_push($ret, $row[0]);
                }
            break;
        }
        return $ret;
    }
    
    public function counter($vote) {
        $sql = 'SELECT COUNT(*) FROM `kvoter` WHERE `type` = "' . $this->event . '" AND `vote` = "' . $this->escape($vote) . '" ;';
        
        return $this->query($sql, 1);
    }
    
    public function add($vote) {
        $sql = 'INSERT INTO `kvoter` SET `user` = "' . $this->user . '", `type` = "' . $this->event . '", `vote` = "' . $this->escape($vote) . '" ;';
        
        return $this->exists() ? $this->update($vote) : $this->query($sql);
    }
    
    public function delete() {
        $sql = 'DELETE FROM `kvoter` WHERE `user` = ' . $this->user . ' AND `type` = "' . $this->event . '" ;';
        
        return $this->query($sql);
    }
    
    public function update($vote) {
        $sql = 'UPDATE `kvoter` SET `vote` = "' . $this->escape($vote) . '" WHERE `user` = "' . $this->user . '" AND `type` = "' . $this->event . '" ;';
        
        return $this->query($sql);
    }
    
    public function exists() {
        $sql = 'SELECT `vote` FROM `kvoter` WHERE `user` = "' . $this->user . '" AND `type` = "' . $this->event . '" ;';
        
        return $this->query($sql, 1);
    }
    
    public function drop() {
        if (!core::$user_rights) {
            return false;
        }
        $sql = 'SELECT GROUP_CONCAT(`id`) AS `ids` FROM `kvoter` WHERE `type` = "' . $this->event . '"';
        $ids = $this->query($sql, 1);
        $sql = 'DELETE FROM `kvoter` WHERE `id` IN(' . $ids . ') ;';
        
        return $this->query($sql);
    }
}

class KvoterTemplate {
    
    private $tpl;
    
    public function __construct($tpl) {
        $this->tpl = $tpl;
    }

    public function render($data) {
        ob_start();
        $this->tpl ? include $this->tpl : print_r($data);
        
        return ob_get_clean();        
    }
}

.
(\/)____o_O____(\/)

Andrei4ik93, перезагрузка происходит не заметно для глаз

.
Koenig
(\/)____o_O____(\/)
вывод отладки (+/-)
Kvoter Object
(
    [settings:private] => KvoterSettings Object
        (
            [settings:private] => Array
                (
                    [event] => test
                    [options] => Array
                        (
                            [0] => yes
                            [1] => no
                        )

                    [revote] => 1
                    [tpl] => 0
                )

        )

    [query:private] => KvoterQuery Object
        (
            [event:private] => test
            [user:private] => 1
        )

    [template:private] => KvoterTemplate Object
        (
            [tpl:private] => 0
        )

    [data:private] => KvoterData Object
        (
            [data:private] => Array
                (
                    [event] => test
                    [counts] => Array
                        (
                            [yes] => 5
                            [no] => 4
                        )

                    [links] => Array
                        (
                            [yes] => http://localhost/j62n/index.ph ... ::yes
                            [no] => no
                        )

                )

        )

)
.
__________________________________________________
# Koenig (31.03.2016 / 00:25)
Andrei4ik93, перезагрузка происходит не заметно для глаз
Js?
.
(\/)____o_O____(\/)

Andrei4ik93, пхп

.
__________________________________________________

Потом себе заберу себе этот модуль.
Как раз на фотоальбомы прикручу.
Еще б класс комментариев где взять, мб с Джона выдрать....

.
(\/)____o_O____(\/)

Andrei4ik93, буду обновления выкладывать, может все переделается в итоге
уже раза три переписывал наполовину все

.

Andrei4ik93, а кто то же вроде тут выкладывал класс комментариев, не?

.
(\/)____o_O____(\/)

Zidan_@777@, что то не помню, можно кстати будет нарисовать класс коментариев с деревом как на хабре

Всего: 46