LangLink.php 3.42 KB
<?php
    
    namespace artbox\core\widgets;
    
    use artbox\core\models\Language;
    use yii\base\Widget;
    use yii\bootstrap\Html;
    use yii\helpers\Url;
    use yii\log\Logger;
    
    class LangLink extends Widget
    {
        public $languageIds = [];
        public $links = [];
        
        public function init()
        {
            if (empty($this->languageIds)) {
                $this->languageIds = Language::find()
                                             ->select(
                                                 [
                                                     'url',
                                                     'id',
                                                 ]
                                             )
                                             ->where([ 'status' => true ])
                                             ->asArray()
                                             ->indexBy('id')
                                             ->column();
            }
            if (count($this->languageIds) < 2) {
                return;
            }
            foreach ($this->languageIds as $languageId => $url) {
                if (Language::getCurrent()->id !== $languageId) {
                    $this->links[ $languageId ] = Html::a(
                        $url,
                        Url::to(
                            [ \Yii::$app->requestedRoute ] + \Yii::$app->request->get(
                            ) + [ 'language_id' => $languageId ],
                            true
                        )
                    );
                } else {
                    $this->links[ $languageId ] = $url;
                }
            }
        }
        
        public function run()
        {
            return $this->render('_langLink');
        }
        
        protected function mapAliases(array $aliases): array
        {
            $map = [];
            $result = [];
            $currentLanguageId = Language::getCurrent()->id;
            foreach ($aliases as $alias) {
                if ($alias[ 'language_id' ] === $currentLanguageId) {
                    $map[ $alias[ 'route' ] ][ 0 ] = $alias[ 'value' ];
                } else {
                    $map[ $alias[ 'route' ] ][ 1 ] = $alias[ 'value' ];
                }
            }
            foreach ($map as $route => $alias) {
                if (!empty($alias[ 0 ]) && !empty($alias[ 1 ])) {
                    $result[ $alias[ 0 ] ] = $alias[ 1 ];
                } else {
                    \Yii::getLogger()
                        ->log("Missing alias for route $route.", Logger::LEVEL_ERROR);
                }
            }
            return $result;
        }
        
        protected function replaceParams(array $map): array
        {
            $params = \Yii::$app->request->get();
            if (isset($params[ 'filter' ])) {
                $filter = explode('_', $params[ 'filter' ]);
            }
            if (array_key_exists($params[ 'category' ], $map)) {
                $params[ 'category' ] = $map[ $params[ 'category' ] ];
            }
            if (!empty($filter)) {
                foreach ($filter as $index => $item) {
                    if (array_key_exists($item, $map)) {
                        $filter[ $index ] = $map[ $item ];
                    }
                }
                $params[ 'filter' ] = implode('_', $filter);
            }
            return $params;
        }
    }