View file sys/plugins/classes/widget.class.php

File size: 5.29Kb
<?php

/**
 * Работа с виджетами
 */
class widget {

    protected $_isset = false;
    protected $_data = array();

    /**
     * Инициализация виджета
     * @param string $path Путь к папке виджета
     */
    function __construct($path) {
        $this->_data ['path_abs'] = realpath($path);
        $this->_data ['runame'] = $this->_data ['name'] = basename($this->_data ['path_abs']);
        $this->_data ['version'] = '1.0'; // версия
        $this->_data ['autor'] = false; // автор
        $this->_data ['script'] = 'index.php'; // исполняемый скрипт
        $this->_data ['screen'] = false; // скриншот
        $this->_data ['cache_by_timeshift'] = false; // отдельный кэш для каждой временной зоны
        $this->_data ['cache_by_language'] = true; // отдельный кэш для каждого языка
        $this->_data ['cache_by_user'] = false; // отдельный кэш для каждого пользователя
        $this->_data ['cache_by_group'] = false; // отдельный кэш для каждой группы
        $this->_data ['cache_by_browser_type'] = false; // отдельный кэш для каждого типа браузера
        $this->_data ['cache_time'] = rand(10, 30); // время хранения кэша в секундах
        $this->_data ['skin'] = 1; // оболочка виджета (не используется, если есть своя)
        if ($config = ini::read($this->_data ['path_abs'] . '/config.ini')) {
            $this->_isset = true;
            // загружаем конфиг
            $this->_data = array_merge($this->_data, (array) @$config);
        }
    }

    /**
     * Выводим сформированный HTML код виджета в браузер
     */
    function display() {
        if (!$this->_isset) {
            return;
        }
        if (($content = $this->getContent()) !== false) {
            if (!$this->_data ['skin'])
                echo $content;
            else {
                $widget = new design ();
                $widget->assign('content', $content);
                $widget->assign('name', $this->_data ['runame']);
                $widget->display('widget.tpl');
            }
        }
    }

    /**
     * Возврат содержимого виджета
     * @global \user $user
     * @global \dcms $dcms
     * @return string
     */
    function getContent() {
        if (!$this->_isset) {
            return;
        }

        if ($cache_content = cache_widgets::get($this->_getCacheId())) {
            return $cache_content;
        }

        global $user, $dcms; // могут использоваться в виджете
        ob_start();
        include $this->_data ['path_abs'] . '/' . $this->_data ['script'];
        $content = ob_get_contents();
        ob_end_clean();

        $cache_time = mt_rand($this->_data ['cache_time'] - 2, $this->_data ['cache_time'] + 2);

        cache_widgets::set($this->_getCacheId(), $content, $cache_time);
        return $content;
    }

    /**
     * уникальный идентификатор в кэше
     * @global \user $user
     * @global \dcms $dcms
     * @global \language_pack $user_language_pack
     * @return boolean
     */
    protected function _getCacheId() {
        if (!$this->_isset) {
            return false;
        }

        global $user, $dcms, $user_language_pack;
        $cache_id = array();

        $cache_id [] = 'wt-' . $this->_data ['name'];

        $design = new design();
        $cache_id [] = 'tm-' . $design->theme['dir'];

        $cache_id [] = 'lp-' . $user_language_pack->code;

        if ($this->_data ['cache_by_browser_type']) {
            $cache_id [] = 'bt-' . $dcms->browser_type;
        }

        if ($this->_data ['cache_by_user']) {
            $cache_id [] = 'ur-' . $user->id;
        }

        if ($this->_data ['cache_by_timeshift']) {
            $cache_id [] = 'ts-' . $user->time_shift;
        }

        if ($this->_data ['cache_by_group']) {
            $cache_id [] = 'gp-' . intval($user->group);
        }

        if (SID) {
            // если браузер не поддерживает cookie, то во все ссылки будет добавляться SID,
            // поэтому кэш делаем для каждой сессии свой
            $cache_id [] = 'sn-' . SID;
        }

        return implode('.', $cache_id);
    }

    function __get($n) {
        if (!$this->_isset) {
            return false;
        }

        return isset($this->_data [$n]) ? $this->_data [$n] : false;
    }

    function __set($n, $v) {
        if (!$this->_isset) {
            return false;
        }

        if (!isset($this->_data [$n])) {
            return false;
        }
        $this->_data [$n] = $v;
    }

    /**
     * Сохранение конфига виджета
     * @return boolean
     */
    function saveData() {
        if (!$this->_isset) {
            return;
        }
        return ini::save($this->_data ['path_abs'] . '/config.ini', $this->_data);
    }

}