You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							108 lines
						
					
					
						
							3.7 KiB
						
					
					
				
			
		
		
	
	
							108 lines
						
					
					
						
							3.7 KiB
						
					
					
				<?php | 
						|
/** | 
						|
 * Created by Error202 | 
						|
 * Date: 24.08.2018 | 
						|
 */ | 
						|
 | 
						|
namespace core\components; | 
						|
 | 
						|
use yii\base\DynamicModel; | 
						|
use Yii; | 
						|
use yii\db\ActiveRecord; | 
						|
 | 
						|
class LanguageDynamicModel extends DynamicModel | 
						|
{ | 
						|
    private $_new_labels = []; | 
						|
    private $_new_hints = []; | 
						|
    private $_new_rules = []; | 
						|
 | 
						|
    public function __construct(ActiveRecord $entity = null, array $attributes = [], array $config = []) | 
						|
    { | 
						|
        $used_attributes = $this->getStringAttributes(); | 
						|
        parent::__construct(array_merge($this->getPublicAttributes(), $this->prepareLanguageAttributes()), $config); | 
						|
 | 
						|
        if ($entity) { | 
						|
            foreach ($used_attributes as $used_attribute) { | 
						|
                foreach ($entity->translations as $translate) { | 
						|
                    if (!in_array($translate->language, $entity->translatedLanguages)) { | 
						|
                        continue; | 
						|
                    } | 
						|
 | 
						|
                    $defaultLanguage = basename(\Yii::$app->getBasePath()) === 'backend' | 
						|
                        ? | 
						|
                        Yii::$app->params['backendDefaultLanguage'] | 
						|
                        : | 
						|
                        Yii::$app->params['defaultLanguage']; | 
						|
 | 
						|
                    $languageAttribute = $used_attribute . '_' . $translate->language; | 
						|
 | 
						|
                    if ($translate->language === $defaultLanguage && isset($translate->{$used_attribute})) { | 
						|
                        $this->{$used_attribute} = $translate->{$used_attribute}; | 
						|
                    } elseif (isset($translate->{$used_attribute})) { | 
						|
                        $this->{$languageAttribute} = $translate->{$used_attribute}; | 
						|
                    } | 
						|
                } | 
						|
            } | 
						|
        } | 
						|
    } | 
						|
 | 
						|
    private function getStringAttributes() | 
						|
    { | 
						|
        $string_attributes = []; | 
						|
        foreach ($this->rules() as $rule) { | 
						|
            $attributes = is_array($rule[0]) ? $rule[0] : [$rule[0]]; | 
						|
            $type       = $rule[1]; | 
						|
            if ($type == 'string') { | 
						|
                foreach ($attributes as $attribute) { | 
						|
                    $string_attributes[] = $attribute; | 
						|
                } | 
						|
            } | 
						|
        } | 
						|
 | 
						|
        return $string_attributes; | 
						|
    } | 
						|
 | 
						|
    private function prepareLanguageAttributes() | 
						|
    { | 
						|
        $language_attributes = []; | 
						|
        $labels              = $this->attributeLabels(); | 
						|
        $hints               = $this->attributeHints(); | 
						|
        foreach ($this->rules() as $rule) { | 
						|
            $attributes = is_array($rule[0]) ? $rule[0] : [$rule[0]]; | 
						|
            $type       = $rule[1]; | 
						|
            if ($type == 'string') { | 
						|
                foreach (Yii::$app->params['translatedLanguages'] as $language => $language_name) { | 
						|
                    $rule_attributes = []; | 
						|
                    foreach ($attributes as $attribute) { | 
						|
                        // add attribute | 
						|
                        $language_attributes[]                          = $attribute . '_' . $language; | 
						|
                        $this->_new_labels[$attribute . '_' . $language] = isset($labels[$attribute]) ? $labels[$attribute] : null; | 
						|
                        $this->_new_hints[$attribute . '_' . $language]  = isset($hints[$attribute]) ? $hints[$attribute] : null; | 
						|
                        $rule_attributes[]                              = $attribute . '_' . $language; | 
						|
                    } | 
						|
                    // add rule | 
						|
                    if (!empty($rule_attributes)) { | 
						|
                        $this->_new_rules[] = [$rule_attributes, $rule[1]]; | 
						|
                    } | 
						|
                } | 
						|
            } | 
						|
        } | 
						|
 | 
						|
        return $language_attributes; | 
						|
    } | 
						|
 | 
						|
    public function attributeLabels() | 
						|
    { | 
						|
        return $this->_new_labels; | 
						|
    } | 
						|
 | 
						|
    public function rules() | 
						|
    { | 
						|
        return $this->_new_rules; | 
						|
    } | 
						|
 | 
						|
    public function getPublicAttributes() | 
						|
    { | 
						|
        return call_user_func('get_object_vars', $this); | 
						|
    } | 
						|
}
 | 
						|
 |