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/Languages.php
<?php

require_once('Mgc.php');

class Languages extends Mgc {

    /*Создание списка мультиязычных таблиц в БД*/
    public $tables = array('product'  => 'products',
        'variant'  => 'variants',
        'store'  => 'stores',
        'supplier'  => 'suppliers',
        'brand'    => 'brands',
        'category' => 'categories',
        'feature'  => 'features',
        'blog'     => 'blog',
        'page'     => 'pages',
        'currency' => 'currencies',
        'delivery' => 'delivery',
        'payment'  => 'payment_methods',
        'banner_image' => 'banners_images',
        'order_labels' => 'orders_labels',
        'order_status' => 'orders_status',
        'menu_item'    => 'menu_items',
        'seo_filter_pattern'    => 'seo_filter_patterns',
        'feature_alias'         => 'features_aliases',
        'feature_alias_value'   => 'features_aliases_values',
    );
    
    private $languages = array();
    private $first_language;
    private $lang_id;
    private $available_languages;
    private $has_languages;
    private $check_languages = false;

    /*Выборка списка языков сайта*/
    public function lang_list() {
        if (!isset($this->available_languages)) {
            include_once($this->config->xbackend."/lang/languages_list.php");
            $this->available_languages = isset($langs) ? $langs : array();
        }
        return $this->available_languages;
    }

    /*Выборка мультиязычных полей из БД*/
    public function get_fields($object = '') {
        $fields['categories']      = array('name', 'name_h1', 'meta_title', 'meta_keywords', 'meta_description', 'annotation', 'description', 'auto_meta_title', 'auto_meta_keywords', 'auto_meta_desc', 'auto_description');
        $fields['brands']          = array('name', 'meta_title', 'meta_keywords', 'meta_description', 'annotation', 'description');
        $fields['suppliers']       = array('name', 'meta_title', 'meta_keywords', 'meta_description', 'annotation', 'description');
        $fields['stores']          = array('name', 'meta_title', 'meta_keywords', 'meta_description', 'annotation', 'description');
        $fields['products']        = array('name', 'meta_title', 'meta_keywords', 'meta_description', 'annotation', 'description', 'special');
        $fields['variants']        = array('name', 'units');
        $fields['blog']            = array('name', 'meta_title', 'meta_keywords', 'meta_description', 'annotation', 'description');
        $fields['pages']           = array('name', 'name_h1', 'meta_title', 'meta_keywords', 'meta_description', 'description');
        $fields['features']        = array('name');
        $fields['delivery']        = array('name', 'description');
        $fields['payment_methods'] = array('name', 'description');
        $fields['currencies']      = array('name', 'sign');
        $fields['banners_images']  = array('name', 'alt', 'title', 'description', 'url');
        $fields['orders_labels']   = array('name');
        $fields['orders_status']   = array('name');
        $fields['menu_items']      = array('name');
        $fields['seo_filter_patterns'] = array('h1', 'title', 'keywords', 'meta_description', 'description');
        $fields['features_aliases']    = array('name');
        $fields['features_aliases_values'] = array('value');

        if($object && !empty($fields[$object])) {
            return $fields[$object];
        } else {
            return $fields;
        }
    }

    /*Выборка данных для связки таблиц и их мультиязычных данных*/
    public function get_query($params = array()) {
        $lang   = (isset($params['lang']) && $params['lang'] ? $params['lang'] : $this->lang_id());
        $object = $params['object'];
        
        if(!empty($params['px'])) {
            $px = $params['px'];
        } else {
            $px = $object[0];
        }


        if (!$this->check_languages) {
            $this->db->query("SHOW TABLES LIKE '%__languages%'");
            $this->has_languages = $this->db->result();
            $this->check_languages = true;
        }

        if (!empty($lang) && $this->has_languages && !empty($this->languages)) {
            $f = (isset($params['px_lang']) && $params['px_lang'] ? $params['px_lang'] : 'l');
            $lang_join = 'LEFT JOIN __lang_'.$this->tables[$object].' '.$f.' ON '.$f.'.'.$object.'_id='.$px.'.id AND '.$f.'.lang_id = '.(int)$lang;
        } else {
            $f = $px;
            $lang_join = '';
        }

       // var_dump($this->get_fields($this->tables[$object]));
        $lang_col = $f.'.'.implode(', '.$f.'.',$this->get_fields($this->tables[$object]));
        
        $result = new stdClass;
        $result->join   = $lang_join;
        $result->fields = $lang_col;
        
        return $result;
    }

    /*Выборка ID текущего языка*/
    public function lang_id() {
        if(empty($this->languages)) {
            return false;
        }
        
        if(isset($this->lang_id)) {
            return $this->lang_id;
        }

        if($this->request->get('lang_label', 'string')) {
            $lang_id = null;
            foreach($this->languages as $l) {
                if($this->request->get('lang_label', 'string') == $l->label) {
                    $lang_id = $l->id;
                    break;
                }
            }
            $this->lang_id = $_SESSION['lang_id'] = intval($lang_id);
            return $this->lang_id;
        }

        if($this->request->get('lang_id', 'integer')) {
            unset($_SESSION['lang_id']);
            $this->lang_id = $_SESSION['lang_id'] = $this->request->get('lang_id', 'integer');
        }
        
        if(empty($this->lang_id) && !empty($_SESSION['lang_id']) && !empty($this->languages[$_SESSION['lang_id']])) {
            $this->lang_id  = intval($_SESSION['lang_id']);
        }

        if(empty($this->lang_id)) {
            $this->lang_id = intval($this->first_language->id);
        }
        return $this->lang_id;
    }

    /*Установка ID языка*/
    public function set_lang_id($id) {
        $this->lang_id = $_SESSION['lang_id'] = intval($id);
    }

    public function __construct() {
        parent::__construct();
        $this->init_languages();
    }

    // Если нужно обновить список языков, в нужное место добавить вызов этой ф-ии
    /*Инициалищация языков*/
    public function init_languages() {
        $this->languages = array();
        $this->db->query("SELECT * FROM __languages WHERE 1 ORDER BY position");
        foreach ($this->db->results() as $l) {
            $this->languages[$l->id] = $l;
        }
        $this->first_language = reset($this->languages);
        $current_language = $this->get_language($this->lang_id());
        foreach ($this->languages as $l) {
            $l->current_name = $l->{'name_'.$current_language->label};
            foreach ($this->languages as $tl) {
                $l->names[$tl->id] = $l->{'name_'.$tl->label};
            }
        }
    }

    /*Выборка первого языка сайта*/
    public function get_first_language() {
        return $this->first_language;
    }

    /*Выборка конкретного языка*/
    public function get_language($id) {
        if (!empty($id)) {
            if(is_int($id) && isset($this->languages[$id])) {
                return $this->languages[$id];
            } elseif(is_string($id)) {
                foreach ($this->languages as $language) {
                    if ($language->label == $id) {
                        return $language;
                    }
                }
            }
        }
        return false;
    }

    /*Выборка всех языков*/
    public function get_languages() {
        return $this->languages;
    }

    // Если пустой lang_label в запросе, то ф-ия lang_id() может вернуть предыдущий язык сессии,
    // при переключении на основной язык. Так как сперва ищем lang_id в $_GET, потом lang_label,
    // и если этих параметров нету а в сессии есть язык(предыдущий по факту), то вернём его.
    // В этом случае должна быть вызвана ф-ия set_lang_id() до get_lang_link();
    public function get_lang_link() {
        $lang_link = '';
        $lang_id = $this->lang_id();
        $current_language = $this->languages[$lang_id];
        //$current_language = $this->languages[$this->lang_id];
        if (!empty($this->first_language) && !empty($current_language) && $current_language->id !== $this->first_language->id) {
            $lang_link = $current_language->label . '/';
        }
        return $lang_link;
    }

    /*Обновление языка*/
    public function update_language($id, $data) {
        $data = (object)$data;
        $query = $this->db->placehold("UPDATE __languages SET ?% WHERE id in(?@)", $data, (array)$id);
        $this->db->query($query);
        
        $this->init_languages();
        return $id;
    }

    /*Добавление языка*/
    public function add_language($data) {
        $data = (object)$data;
        $query = $this->db->placehold('INSERT INTO __languages SET ?%', $data);
        if(!$this->db->query($query)) {
            return false;
        }
        $last_id = $this->db->insert_id();
        $this->db->query("UPDATE __languages SET position=id WHERE id=? LIMIT 1", $last_id);

        if($last_id) {
            $this->translations->copy_translations($this->first_language->label, $data->label);
            $this->db->query("SHOW FIELDS FROM __languages WHERE field=?", 'name_'.$data->label);
            if (!$this->db->result()) {
                $this->db->query("ALTER TABLE __languages ADD COLUMN `name_$data->label` VARCHAR(255) NOT NULL DEFAULT ''");
            }
            $this->db->query("UPDATE __languages SET name_$data->label=name");

            $description_fields = $this->get_fields();
            foreach($this->tables as $object => $tab) {
                $this->db->query('INSERT INTO __lang_'.$tab.' ('.implode(',', $description_fields[$tab]).', '.$object.'_id, lang_id)
                                    SELECT '.implode(',', $description_fields[$tab]).', id, ?
                                    FROM __'.$tab, $last_id);
            }
            
            if(isset($this->first_language) && !empty($this->first_language)) {
                $this->db->query("SELECT * FROM __options WHERE lang_id=?", $this->first_language->id);
                $options = $this->db->results();
                if(!empty($options)) {
                    foreach($options as $o) {
                        $this->db->query("REPLACE INTO __options SET lang_id=?, value=?, product_id=?, feature_id=?, translit=?", $last_id, $o->value, $o->product_id, $o->feature_id, $o->translit);
                    }
                }

                $settings = $this->settings->get_settings($this->first_language->id);
                if (!empty($settings)) {
                    foreach ($settings as $s) {
                        $this->db->query("REPLACE INTO __settings_lang SET lang_id=?, name=?, value=?", $last_id, $s->name, $s->value);
                    }
                }
            } else {
                $this->db->query("UPDATE __options SET lang_id=?", $last_id);
                $this->db->query("UPDATE __settings_lang SET lang_id=?", $last_id);
            }
            $this->init_languages();
            return $last_id;
        }
    }

    /*Удаление языка*/
    public function delete_language($id, $save_main = false) {
        if(!empty($id)) {
            $query = $this->db->placehold("DELETE FROM __languages WHERE id=? LIMIT 1", intval($id));
            $this->db->query($query);

            foreach($this->tables as $table) {
                $this->db->query("DELETE FROM  __lang_".$table." WHERE lang_id=?", intval($id));
            }

            if (!$save_main) {
                $this->db->query("DELETE FROM  __options WHERE lang_id=?", intval($id));
                $this->db->query("DELETE FROM __settings_lang WHERE lang_id=?", intval($id));
            } else {
                $this->db->query("UPDATE __options set lang_id=0 where lang_id=?", intval($id));
                $this->db->query("UPDATE __settings_lang SET lang_id=0 WHERE lang_id=?", intval($id));
            }
            $this->init_languages();
        }
    }

    /*Действия над мультиязычным контентом*/
    public function action_data($object_id, $data, $object) {
        if(!in_array($object, array_keys($this->tables))) {
            return false;
        }
        
        $this->db->query("SELECT count(*) as count FROM __lang_".$this->tables[$object]." WHERE lang_id=? AND ".$object."_id=? LIMIT 1", $data->lang_id, $object_id);
        $data_lang = $this->db->result('count');
        
        if($data_lang == 0) {
            $object_fild   = $object.'_id';
            $data->$object_fild = $object_id;
            $query = $this->db->placehold('INSERT INTO __lang_'.$this->tables[$object].' SET ?%', $data);
            $this->db->query($query);
            $result = 'add';
        } elseif($data_lang == 1) {
        $sql = $this->db->placehold("UPDATE __lang_".$this->tables[$object]." SET ?% WHERE lang_id=? AND ".$object."_id=?", $data, $data->lang_id, $object_id);
            $this->db->query($sql);
          //  echo $sql;
            $result = 'update';
        }
        return $result;
    }

    /*Выборка мультиязычных данных*/
    public function get_description($data, $object) {
        if(!in_array($object, array_keys($this->tables)) || empty($this->languages)) {
            return false;
        }
        
        $fields      = $this->get_fields($this->tables[$object]);
        $intersect   = array_intersect($fields, array_keys((array)$data));
        if(!empty($intersect)) {
            $description = new stdClass;
            foreach($fields as $f) {
                if (isset($data->$f)) {
                    $description->$f = $data->$f;
                }
                if($this->first_language->id != $this->lang_id()) {
                    unset($data->$f);
                }
            }
            $result = new stdClass();
            $result->description = $description;
            return $result;
        }
        return false;
    }

    /*Выборка мультиязычных данных и их дальнейшая обработка*/
    public function action_description($object_id, $description, $object, $update_lang = null) {
        if(!in_array($object, array_keys($this->tables)) || empty($this->languages)) {
            return false;
        }

        $fields = $this->get_fields($this->tables[$object]);
        if(!empty($fields)) {
            if($update_lang) {
                $upd_languages[] = $this->languages[$update_lang];
            } else {
                $upd_languages = $this->languages;
            }
            foreach($upd_languages as $lang) {
                $description->lang_id = $lang->id;
                $this->action_data($object_id, $description, $object);
            }
            return true;
        } else {
            return false;
        }
    }
    
}