HEX
Server: Apache/2.4.6 (CentOS) mpm-itk/2.4.7-04 mod_fcgid/2.3.9 PHP/5.4.16
System: Linux dvm.vladweb.ru 3.10.0-1160.119.1.el7.x86_64 #1 SMP Tue Jun 4 14:43:51 UTC 2024 x86_64
User: region-gk.ru (1016)
PHP: 7.3.33
Disabled: NONE
Upload Files
File: //home/temp/yarusvl.ru/api/Settings.php
<?php

/**
 * Управление настройками магазина, хранящимися в базе данных
 * В отличие от класса Config оперирует настройками доступными админу и хранящимися в базе данных.
 */

require_once('Mgc.php');

class Settings extends Mgc {
    
    private $vars;
    private $vars_lang;

    public function __construct() {
        parent::__construct();
        $this->init_settings();
    }
    
    public function __get($name) {
        if($res = parent::__get($name)) {
            return $res;
        }

        if (isset($this->vars_lang[$name])) {
            return $this->vars_lang[$name];
        } elseif (isset($this->vars[$name])) {
            return $this->vars[$name];
        } else {
            return null;
        }
    }

    /*Запись данных в общие настройки*/
    public function __set($name, $value) {

        if (!empty($this->vars['admin_theme']) && $name == 'theme' && $value == $this->vars['admin_theme']) {
            $this->vars[$name] = $value;
            return;
        }

        if (isset($this->vars_lang[$name])) {
            return;
        }
        $this->vars[$name] = $value;
        
        if(is_array($value)) {
            $value = serialize($value);
        } else {
            $value = (string) $value;
        }
        
        $this->db->query('SELECT count(*) as count FROM __settings WHERE name=?', $name);
        if($this->db->result('count')>0) {
            $this->db->query('UPDATE __settings SET value=? WHERE name=?', $value, $name);
        } else {
            $this->db->query('INSERT INTO __settings SET value=?, name=?', $value, $name);
        }
    }

    /*Выборка всех данных с таблиц настроек*/
    public function init_settings() {
        // Выбираем из базы ОБЩИЕ настройки и записываем их в переменную
        $this->vars = array();
        $this->db->query('SELECT name, value FROM __settings');
        foreach($this->db->results() as $result) {
            if(!($this->vars[$result->name] = @unserialize($result->value))) {
                $this->vars[$result->name] = $result->value;
            }
        }

        // Выбираем из базы настройки с переводами к текущему языку
        $this->vars_lang = array();
        $multi = $this->get_settings();
        if (is_array($multi)) {
            foreach ($multi as $s) {
                if(!($this->vars_lang[$s->name] = @unserialize($s->value))) {
                    $this->vars_lang[$s->name] = $s->value;
                }
            }
        }
    }

    /* Multilanguage settings */
    /**
     * Adding a new setting for all languages
     * @param string $name
     * @param string $value
     * @return bool
     */
    private function add($name, $value) {
        $languages = $this->languages->get_languages();
        if (!empty($languages)) {
            foreach ($languages as $l) {
                $this->db->query("REPLACE INTO __settings_lang SET lang_id=?, name=?, value=?", $l->id, $name, $value);
            }
        } else {
            $q = $this->db->placehold("REPLACE INTO __settings_lang SET name=?, value=?", $name, $value);
            if (!$this->db->query($q)) {
                return false;
            }
        }
        return true;
    }

    /**
     * Updating by @param $name(current language), or adding;
     * if a setting with specified $name is exist - it will be updated,
     * otherwise it will be added(called add() function).
     * @param string $name
     * @param string $value
     * @return bool
     */
    public function update($name, $value) {
        if (empty($name)) {
            return false;
        }
        $this->vars_lang[$name] = $value;
        $value = is_array($value) ? serialize($value) : (string) $value;

        $lang_id  = $this->languages->lang_id();
        $into_lang = '';
        if($lang_id) {
            $into_lang = $this->db->placehold("lang_id=?, ", $lang_id);
        }

        $this->db->query("SELECT 1 FROM __settings_lang WHERE name=? LIMIT 1", $name);
        if (!$this->db->result()) {
            return $this->add($name, $value);
        } else {
            $q = $this->db->placehold("REPLACE INTO __settings_lang SET $into_lang name=?, value=?", $name, $value);
            return $this->db->query($q) ? true : false;
        }
    }

    /**
     * Getting settings.
     * if $lang_id is not specified, a current language will be returned.
     * $lang_id = 0 is wrong, will be returned false.
     * @param string $lang_id
     * @return mixed
     */
    public function get_settings($lang_id = null) {
        if (!is_null($lang_id) && !($l = $this->languages->get_language(intval($lang_id)))) {
            return false;
        }
        $lang_id  = !is_null($lang_id) ? $lang_id : $this->languages->lang_id();
        $lang_id_filter = '';
        if($lang_id) {
            $lang_id_filter = $this->db->placehold("AND lang_id=?", $lang_id);
        }
        $this->db->query("SELECT * FROM __settings_lang WHERE 1 $lang_id_filter");
        return $this->db->results();
    }

}