%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/libs/
Upload File :
Create Path :
Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/libs/BaseSettingsManager.php

<?php

/**
 * @link https://www.humhub.org/
 * @copyright Copyright (c) 2017 HumHub GmbH & Co. KG
 * @license https://www.humhub.com/licences
 */

namespace humhub\libs;

use Yii;
use yii\base\Component;
use yii\base\Exception;
use yii\db\conditions\LikeCondition;
use yii\db\StaleObjectException;
use yii\helpers\Json;

/**
 * Description of SettingManager
 *
 * @since 1.1
 * @author Luke
 */
abstract class BaseSettingsManager extends Component
{

    /**
     * @var string module id this settings manager belongs to.
     */
    public $moduleId = null;

    /**
     * @var array|null of loaded settings
     */
    protected $_loaded = null;

    /**
     * @var string settings model class name
     */
    public $modelClass = 'humhub\models\Setting';

    /**
     * @inheritdoc
     */
    public function init()
    {
        if ($this->moduleId === null) {
            throw new Exception('Could not determine module id');
        }

        if (static::isDatabaseInstalled()) {
            $this->loadValues();
        }


        parent::init();
    }

    /**
     * Sets a settings value
     *
     * @param string $name
     * @param string $value
     */
    public function set($name, $value)
    {
        if ($value === null) {
            return $this->delete($name);
        }

        // Update database setting record
        $record = $this->find()->andWhere(['name' => $name])->one();
        if ($record === null) {
            $record = $this->createRecord();
            $record->name = $name;
        }

        if (is_bool($value)) {
            $value = (int)$value;
        }

        $record->value = (string)$value;
        if (!$record->save()) {
            Yii::error('Could not store setting: ' . $name);
        }

        // Store to runtime
        $this->_loaded[$name] = $value;

        $this->invalidateCache();
    }

    /**
     * Can be used to set object/arrays as a serialized values.
     *
     *
     * @param string $name
     * @param mixed $value array or object
     */
    public function setSerialized($name, $value)
    {
        $this->set($name, Json::encode($value));
    }

    /**
     * Receives a value which was saved as serialized value.
     *
     * @param string $name
     * @param mixed $default the setting value or null when not exists
     */
    public function getSerialized($name, $default = null)
    {
        $value = $this->get($name, $default);
        if (is_string($value)) {
            $value = Json::decode($value);
        }
        return $value;
    }

    /**
     * Returns value of setting
     *
     * @param string $name the name of setting
     * @return string|null the setting value or null when not exists
     */
    public function get($name, $default = null)
    {
        return isset($this->_loaded[$name]) ? $this->_loaded[$name] : $default;
    }

    /**
     * Returns the value of setting without any caching
     *
     * @param string $name the name of setting
     * @return string the setting value or null when not exists
     */
    public function getUncached($name, $default = null)
    {
        $record = $this->find()->andWhere(['name' => $name])->one();
        return ($record !== null) ? $record->value : $default;
    }

    /**
     * Deletes setting
     *
     * @param string $name
     */
    public function delete($name)
    {
        $record = $this->find()->andWhere(['name' => $name])->one();
        if ($record !== null) {
            try {
                $record->delete();
            } catch (StaleObjectException $e) {
                Yii::error('Could not delete setting "' . $name . '".  Error: ' . $e->getMessage(), 'base');
            } catch (\Throwable $e) {
                Yii::error('Could not delete setting "' . $name . '".  Error: ' . $e->getMessage(), 'base');
            }
        }

        if (isset($this->_loaded[$name])) {
            unset($this->_loaded[$name]);
        }

        $this->invalidateCache();
    }

    /**
     * Loads values from database
     */
    protected function loadValues()
    {
        $cached = Yii::$app->cache->get($this->getCacheKey());
        if ($cached === false) {
            $this->_loaded = [];
            $settings = &$this->_loaded;

            array_map(function ($record) use (&$settings) {
                $settings[$record->name] = $record->value;
            }, $this->find()->all());

            Yii::$app->cache->set($this->getCacheKey(), $this->_loaded);
        } else {
            $this->_loaded = $cached;
        }
    }

    /**
     * Reloads all values from database
     */
    public function reload()
    {
        $this->invalidateCache();
        $this->loadValues();
    }

    /**
     * Invalidates settings cache
     */
    protected function invalidateCache()
    {
        Yii::$app->cache->delete($this->getCacheKey());
    }

    /**
     * Returns settings managers cache key
     *
     * @return string the cache key
     */
    protected function getCacheKey()
    {
        return 'settings-' . $this->moduleId;
    }

    /**
     * Returns settings active record instance
     */
    protected function createRecord()
    {
        $model = new $this->modelClass;
        $model->module_id = $this->moduleId;

        return $model;
    }

    /**
     * Returns ActiveQuery to find settings
     *
     * @return \yii\db\ActiveQuery
     */
    protected function find()
    {
        $modelClass = $this->modelClass;
        return $modelClass::find()->andWhere(['module_id' => $this->moduleId]);
    }

    /**
     * Deletes all stored settings
     *
     * @param string|null $prefix if set only delete settings with given name prefix (e.g. theme.)
     */
    public function deleteAll($prefix = null)
    {
        $query = $this->find();
        if ($prefix !== null) {
            $query->andWhere(new LikeCondition('name', 'LIKE', $prefix));
        }

        foreach ($query->all() as $setting) {
            $this->delete($setting->name);
        }
    }

    /**
     * Checks if settings table exists or application is not installed yet
     *
     * @return bool
     * @since 1.3
     */
    public static function isDatabaseInstalled()
    {
        try {
            if (in_array('setting', Yii::$app->db->schema->getTableNames())) {
                return true;
            }
        } catch (\Exception $ex) {
            return false;
        }

        return false;
    }
}

Zerion Mini Shell 1.0