Language.php 6.38 KB
<?php
    
    namespace artbox\core\models;
    
    use Yii;
    use yii\db\ActiveRecord;
    use yii\helpers\VarDumper;

    /**
     * This is the model class for table "language".
     *
     * @property integer $id
     * @property string  $url
     * @property string  $local
     * @property string  $name
     * @property boolean $default
     * @property integer $created_at
     * @property integer $updated_at
     * @property integer $status
     */
    class Language extends ActiveRecord
    {
        
        /**
         * @var null|self
         */
        public static $current = null;
    
        /**
         * @var null|self[]
         */
        public static $active = null;
        
        /**
         * @inheritdoc
         */
        public static function tableName()
        {
            return 'language';
        }
        
        /**
         * @inheritdoc
         */
        public function behaviors()
        {
            return [
                'timestamp' => [
                    'class'      => 'yii\behaviors\TimestampBehavior',
                    'attributes' => [
                        ActiveRecord::EVENT_BEFORE_INSERT => [
                            'created_at',
                            'updated_at',
                        ],
                        ActiveRecord::EVENT_BEFORE_UPDATE => [
                            'updated_at',
                        ],
                    ],
                ],
            ];
        }
        
        /**
         * @inheritdoc
         */
        public function rules()
        {
            return [
                [
                    [
                        'url',
                        'local',
                        'name',
                        'created_at',
                        'updated_at',
                    ],
                    'required',
                ],
                [
                    [ 'default' ],
                    'boolean',
                ],
                [
                    [
                        'created_at',
                        'updated_at',
                    ],
                    'integer',
                ],
                [
                    [
                        'url',
                        'local',
                        'name',
                    ],
                    'string',
                    'max' => 255,
                ],
            ];
        }
        
        /**
         * @inheritdoc
         */
        public function attributeLabels()
        {
            return [
                'id'         => Yii::t('core', 'Language ID'),
                'url'        => Yii::t('core', 'Url'),
                'local'      => Yii::t('core', 'Local'),
                'name'       => Yii::t('core', 'Name'),
                'default'    => Yii::t('core', 'Default'),
                'created_at' => Yii::t('core', 'Date Create'),
                'updated_at' => Yii::t('core', 'Date Update'),
            ];
        }
        
        /**
         * Get current language
         *
         * @return null|Language
         */
        public static function getCurrent()
        {
            if (self::$current === null) {
                self::$current = self::getDefaultLanguage();
            }
            return self::$current;
        }
        
        /**
         * Set current language by Url param
         *
         * @param null|string $url Language url param
         *
         * @return bool
         */
        public static function setCurrent($url = null)
        {
            $language = self::getLanguageByUrl($url);
            self::$current = ( $language === null ) ? self::getDefaultLanguage() : $language;
            Yii::$app->language = self::getCurrent()->local;
            if ($language === null) {
                return false;
            } else {
                return true;
            }
        }
        
        /**
         * Get default language
         *
         * @return null|Language
         */
        public static function getDefaultLanguage()
        {
            if (\Yii::$app->request->hasMethod('getPreferredLanguage')) {
                $preferred = \Yii::$app->request->getPreferredLanguage(
                    self::find()
                        ->select([ 'local' ])
                        ->where(
                            [
                                'status' => true,
                            ]
                        )
                        ->asArray()
                        ->column()
                );
            }
            if (!empty($preferred)) {
                return self::getLanguageByUrl(strtolower(substr($preferred, -2, 2)));
            } else {
                /**
                 * @var null|Language $language
                 */
                $language = self::find()
                                ->where([ 'default' => true ])
                                ->one();
                return $language;
            }
        }
        
        /**
         * Get language by Url param
         *
         * @param null|string $url Language url param
         *
         * @return null|Language
         */
        public static function getLanguageByUrl($url = null)
        {
            if ($url === null) {
                return null;
            } else {
                /**
                 * @var null|Language $language
                 */
                $language = self::find()
                                ->where(
                                    [
                                        'url'    => $url,
                                        'status' => true,
                                    ]
                                )
                                ->one();
                if ($language === null) {
                    return null;
                } else {
                    return $language;
                }
            }
        }
    
        /**
         * Get active Languages and cache them
         *
         * @return array|\artbox\core\models\Language[]|null|\yii\db\ActiveRecord[]
         */
        public static function getActive()
        {
            if (empty(self::$active)) {
                self::$active = self::find()
                                    ->where([ 'status' => true ])
                                    ->indexBy('id')
                                    ->all();
            }
            return self::$active;
        }
    }