public function run()
 {
     $controller = $this->controller;
     $modelName = $controller::getModelName();
     $contentModelName = $controller::getContentModelName();
     $model = new $modelName();
     $session = Yii::$app->session;
     $modelContent = new $contentModelName();
     $modelContent->lang_id = Languages::currentLangId();
     if ($model->load(Yii::$app->request->post()) && $modelContent->load(Yii::$app->request->post())) {
         $transaction = Yii::$app->db->beginTransaction();
         try {
             $res = $model->save();
             if ($res) {
                 $modelContent->parent_id = $model->id;
                 $modelContent->save();
                 $transaction->commit();
             } else {
                 print_r($model->errors);
                 throw new \Exception('Не удалось сохранить модель - ошибка валидации');
             }
         } catch (\Exception $e) {
             $transaction->rollBack();
             throw $e;
         }
         //$session->setFlash('pageCreated', 'Страница оновлена.'); ##!! Edit
         return $controller->redirect(['update', 'id' => $model->id]);
     } else {
         return $controller->render('create', ['model' => $model, 'modelContent' => $modelContent]);
     }
 }
 /**
  * Этот метод должен вызываться при инициализации контроллера, он 
  * делает редирект (если нужно) на выбранную языковую версию
  */
 public static function init()
 {
     // Определяем текущий язык
     self::detectClientLangId();
     $languageInurl = Yii::$app->request->languageInurl;
     $inurl = $languageInurl !== null ? Languages::all()->getConfigByParam('url', $languageInurl) : null;
     $current = Languages::all()->getConfigCurrent();
     $default = Languages::all()->getConfigDefault();
     $inurl_real_id = $inurl ? $inurl['id'] : $default['id'];
     if ($current !== null) {
         if ($inurl_real_id !== $current['id']) {
             // Префикс в ссылке и текущий язык не совпадают
             if (Yii::$app->urlManager->multilanguageHideDefaultPrefix && YII_ENV !== 'test' && Yii::$app->getRequest()->getMethod() === 'GET' && !Yii::$app->getRequest()->isAjax) {
                 $url = \yii\helpers\Url::current(['x-language-url' => $current['url']]);
                 Yii::$app->getResponse()->redirect($url)->send();
                 Yii::$app->end();
             }
         } else {
             if (Yii::$app->urlManager->multilanguageHideDefaultPrefix && $inurl && $inurl['id'] === $default['id']) {
                 $url = \yii\helpers\Url::current(['x-language-url' => false]);
                 Yii::$app->getResponse()->redirect($url)->send();
                 Yii::$app->end();
             }
         }
     } else {
         Yii::error('Unexpected null in $current language.', 'multilanguage');
     }
     if ($current) {
         Yii::$app->language = $current['locale'];
     }
 }
 public function run($id, $lang_id = null)
 {
     $controller = $this->controller;
     $modelName = $controller::getModelName();
     $contentModelName = $controller::getContentModelName();
     if (!$lang_id) {
         $lang_id = Languages::currentLangId();
     }
     $model = $controller->findModel($id);
     $session = Yii::$app->session;
     $modelContent = $model->getContent($lang_id)->one();
     if (!$modelContent) {
         $modelContent = new $contentModelName();
         $modelContent->lang_id = $lang_id;
     }
     if ($model->load(Yii::$app->request->post()) && $modelContent->load(Yii::$app->request->post())) {
         $modelContent->lang_id = $lang_id;
         $modelContent->parent_id = $model->id;
         $transaction = Yii::$app->db->beginTransaction();
         try {
             $model->save();
             $modelContent->save();
             $transaction->commit();
         } catch (\Exception $e) {
             $transaction->rollBack();
             throw $e;
         }
         //$session->setFlash('pageUpdated', 'Страница оновлена.'); ##!! Edit
         return $controller->redirect(['update', 'id' => $model->id, 'lang_id' => $lang_id]);
     } else {
         return $controller->render('update', ['model' => $model, 'modelContent' => $modelContent]);
     }
 }
 public function beforeAction($action)
 {
     Languages::init();
     if (!parent::beforeAction($action)) {
         return false;
     }
     return true;
 }
 public function getDataCellValue($model, $key, $index)
 {
     $list = Languages::all()->getConfig();
     $items = [];
     foreach ($list as $id => $lang) {
         $items[] = Html::a($lang['name'], ['update', 'id' => $model->id, 'lang_id' => $lang['id']], ['class' => $this->issetContent($model, $lang['id']) ? 'btn btn-primary' : 'btn btn-default']);
     }
     return implode(' ', $items);
 }
 public function getPathInfo()
 {
     // Добавить кэш $pathInfo (не забыть про setPathInfo)
     $pathInfo = parent::getPathInfo();
     $pattern = Languages::all()->pattern();
     if (preg_match("/^({$pattern})\\/(.*)/", $pathInfo, $arr)) {
         $this->lang_url = $arr[1];
         $pathInfo = $arr[count($arr) - 1];
     }
     return $pathInfo;
 }
 public function createUrl($params)
 {
     $default = Languages::all()->getConfigDefault();
     $current = Languages::all()->getConfigCurrent();
     $url_prefix = null;
     if (isset($params['x-language-url']) && !$params['x-language-url']) {
         $params['x-language-url'] = $default['url'];
     }
     if (isset($params['x-language-url']) && Languages::all()->getConfigByParam('url', $params['x-language-url'])) {
         $url_prefix = $params['x-language-url'] === $default['url'] && $this->multilanguageHideDefaultPrefix ? '' : $params['x-language-url'];
         unset($params['x-language-url']);
     }
     //        echo "url_prefix: ";
     //        var_export($url_prefix);
     //        echo "\n";
     //
     //        print_r($params);
     //        exit;
     if ($url_prefix === null) {
         // Иначе подставляем текущий язык
         $url_prefix = Yii::$app->request->getLanguageInurl();
     }
     $url = parent::createUrl($params);
     if ($url_prefix) {
         $url = '/' . $url_prefix . $url;
     }
     return $url;
 }