Passed
Push — master ( c523c5...2aef85 )
by
unknown
02:17
created

getSettingByKeyInAnyLanguage()   A

Complexity

Conditions 5
Paths 3

Size

Total Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 5
c 0
b 0
f 0
nc 3
nop 1
dl 0
loc 9
rs 9.6111
1
<?php
2
3
namespace andmemasin\language\models;
4
5
6
use andmemasin\language\interfaces\WithLanguagesInterface;
7
use yii\base\Model;
8
use yii;
9
10
/**
11
 * Class LanguageSettingsPack is a pack of BaseLanguageSettings each in different language
12
 *
13
 * @property Language $language
14
 * @package andmemasin\language\models
15
 */
16
class LanguageSettingsPack extends Model
17
{
18
    /** @var string */
19
    public $languageSettingsClass;
20
21
    /** @var BaseLanguageSettings[] Settings for one language. array is indexed by language_id */
22
    public $languageSettings;
23
24
    /** @var WithLanguagesInterface */
25
    public $parent;
26
27
28
    /** {@inheritdoc} */
29
    public function init()
30
    {
31
        parent::init();
32
33
        if(!$this->parent){
34
            throw new yii\base\InvalidConfigException('Parent Model must be defined while initiating languages-settings');
35
        }
36
37
        if(!$this->parent instanceof WithLanguagesInterface){
38
            throw new yii\base\InvalidConfigException('Parent Model must implement WithLanguagesInterface');
39
        }
40
41
        $this->setLanguageSettings();
42
    }
43
44
    protected function setLanguageSettings() {
45
        if(!empty($this->parent->languages)){
46
            foreach ($this->parent->languages as $language){
47
                /* @var BaseLanguageSettings */
48
                $languageSettings = Yii::createObject([
49
                    'class' => $this->languageSettingsClass,
50
                    'parent'=>$this->parent,
51
                    'language'=>$language,
52
                ]);
53
                $this->languageSettings[$language->language_id] = $languageSettings;
54
            }
55
        }
56
    }
57
58
    public function save($runValidation = true,$attributeNames=null){
59
        if(!empty($this->languageSettings)){
60
            // language by language
61
            foreach ($this->languageSettings as $key => $languageSetting){
62
                $languageSetting->save($runValidation,$attributeNames);
63
                $this->addErrors($languageSetting->errors);
64
                $this->languageSettings[$key] = $languageSetting;
65
            }
66
        }
67
        $this->setLanguageSettings();
68
69
        return empty($this->errors);
70
    }
71
72
    /**
73
     *
74
     * @param Language $language
75
     * @param string $key
76
     * @return bool|string
77
     */
78
    public function getSettingByLanguageAndKey($language, $key){
79
        $setting = $this->getSettingByKeyAndLanguage($language, $key);
80
        if(!$setting){
81
            $setting = $this->getSettingByKeyInAnyLanguage($key);
82
        }
83
        return $setting;
84
    }
85
86
    /**
87
     * Get the setting value in specified language by key.
88
     * Returns false if setting is missing or empty
89
     * @param Language $language
90
     * @param string $key
91
     * @return bool|string
92
     */
93
    public function getSettingByKeyAndLanguage($language, $key){
94
        if(isset($this->languageSettings[$language->primaryKey])){
95
            $languageSettings = $this->languageSettings[$language->primaryKey];
96
            if($languageSettings->{$key} && $languageSettings->{$key} != ''){
97
                return $languageSettings->{$key};
98
            }
99
        }
100
        return false;
101
    }
102
103
104
    /**
105
     * Get the setting value in any language
106
     * Returns false if setting is missing or empty in all languages
107
     * @param string $key
108
     * @return bool|string
109
     */
110
    public function getSettingByKeyInAnyLanguage($key){
111
        if(!empty($this->languageSettings)){
112
            foreach ($this->languageSettings as $language_id => $languageSettings){
113
                if($languageSettings->{$key} && $languageSettings->{$key} != ''){
114
                    return $languageSettings->{$key};
115
                }
116
            }
117
        }
118
        return false;
119
    }
120
121
    /**
122
     * {@inheritdoc}
123
     */
124
    public function load($data, $formName = null)
125
    {
126
        $scope = yii\helpers\StringHelper::basename($this->languageSettingsClass);
127
        if (isset($data[$scope])) {
128
            foreach ($data[$scope] as $language_id => $attributes){
129
                $language = Language::findOne($language_id);
130
                /** @var BaseLanguageSettings $model */
131
                if(isset($this->languageSettings[$language_id])){
132
                    $model = $this->languageSettings[$language_id];
133
                }else{
134
                    $model = Yii::createObject([
135
                        'class' => $this->languageSettingsClass,
136
                        'parent'=>$this->parent,
137
                        'language'=>$language,
138
                    ]);
139
                }
140
                $model->settingsData = $attributes;
141
                $model->setSettings();
142
                $model->validate();
143
144
                // load this language
145
                $this->addErrors($model->errors);
146
            }
147
            return true;
148
        }
149
        return false;
150
    }
151
152
}