ArticleController.php 8.56 KB
<?php
namespace common\modules\blog\controllers;

use common\models\Language;
use common\modules\blog\models\Article;
use common\modules\blog\models\ArticleLang;
use common\modules\blog\models\ArticleMedia;
use common\modules\blog\models\ArticleToCategory;
use yii\data\ActiveDataProvider;
use yii\web\Controller;
use yii\web\UploadedFile;

class ArticleController extends Controller
{

	public function actionIndex()
    {
        $dataProvider = new ActiveDataProvider([
            'query' => Article::find(),
            'pagination' => [
                'pageSize' => 1,
            ],
        ]);
        return $this->render('index', ['dataProvider' => $dataProvider]);
    }

    public function actionCreate()
    {
        $article_langs = array();
        $article = new Article();
        $images = array();
        $images['full'] = new ArticleMedia(['scenario' => ArticleMedia::SCENARIO_FULL]);
        $images['preview'] = new ArticleMedia(['scenario' => ArticleMedia::SCENARIO_PREVIEW]);
        $images['additional'] = new ArticleMedia(['scenario' => ArticleMedia::SCENARIO_ADDITIONAL]);
        $article->loadDefaultValues();
        $langs = Language::getActiveLanguages();
        $default_lang = Language::getDefaultLang();
        $isValid = false;
        if(!empty(\Yii::$app->request->post())) {
            $isValid = true;
            $article->load(\Yii::$app->request->post());
            $article->author = \Yii::$app->user->getId();
            $isValid = $article->validate();
            foreach($images as $index => $value) {
                $images[$index]->type = $index;
                if($index == 'additional') {
                    $images[$index]->imageFile = UploadedFile::getInstances($images[$index], "[{$index}]imageFile");
                } else {
                    $images[$index]->imageFile = UploadedFile::getInstance($images[$index], "[{$index}]imageFile");
                }
                $isValid = $images[$index]->validate(['imageFile']) && $isValid;
            }
            if(empty(\Yii::$app->request->post()['ArticleLang'])) {
                $article_langs[$default_lang->language_id] = new ArticleLang();
                $isValid  = ArticleLang::validateMultiple($article_langs) && $isValid;
            } else {
                foreach(\Yii::$app->request->post()['ArticleLang'] as $index => $article_lang) {
                    $article_langs[$index] = new ArticleLang();
                }
                ArticleLang::loadMultiple($article_langs, \Yii::$app->request->post());
                $isValid = ArticleLang::validateMultiple($article_langs) && $isValid;
            }
        } else {
            $article_langs[$default_lang->language_id] = new ArticleLang();
        }
        if($isValid) {
            $article->save(false);
            $article_categories = \Yii::$app->request->post('Article')['articleCategoriesArray'];
            if(!empty($article_categories)) {
                foreach($article_categories as $article_category) {
                    $articletocategory[$article_category] = new ArticleToCategory();
                    $articletocategory[$article_category]->category_id = $article_category;
                    $articletocategory[$article_category]->link('article', $article);
                }
            }
            $first = 1;
            foreach($images as $index => $image) {
                $images[$index]->upload($article->id);
            }
            foreach($article_langs as $article_lang) {
                if($first) {
                    $article_lang_clone = clone $article_lang;
                    $article_lang_clone->lang_id = 0;
                    $article_lang_clone->link('article', $article);
                    unset($article_lang_clone);
                }
                $article_lang->link('article', $article);
                $first = 0;
            }
            echo "ok";
            //$this->redirect('index');
        } else {
            return $this->render('create', [
                'article_langs' => $article_langs,
                'article' => $article,
                'langs' => $langs,
                'images' => $images
            ]);
        }
    }

    public function actionUpdate($id)
    {
        $article = Article::findOne($id);
        $images = $article->getArticleMedia()->indexBy('type')->all();
        if(!array_key_exists('full', $images)) {
            $images['full'] = new ArticleMedia();
        }
        if(!array_key_exists('preview', $images)) {
            $images['preview'] = new ArticleMedia();
        }
        foreach($images as $index => $image) {
            $images[$index]->scenario = $index;
        }
        $images['additional'] = array(
            0 => new ArticleMedia(['scenario' => ArticleMedia::SCENARIO_ADDITIONAL])
        );
        $images['additional'] = array_merge($images['additional'], $article->getArticleMedia()->andWhere(['type' => 'additional'])->indexBy('id')->all());
        foreach($images['additional'] as $index => $image) {
            $images['additional'][$index]->scenario = 'additional';
        }
        $article_langs = $article->getArticleLangs()->where(['>=', 'lang_id', '1'])->indexBy('lang_id')->all();
        $langs = Language::getActiveLanguages();
        $default_lang = Language::getDefaultLang();
        $isValid = false;
        if(!empty(\Yii::$app->request->post())) {
            $isValid = true;
            $article->load(\Yii::$app->request->post());
            ArticleToCategory::deleteAll(['article_id' => $article->id]);
            $article_categories = \Yii::$app->request->post('Article')['articleCategoriesArray'];
            if(!empty($article_categories)) {
                foreach($article_categories as $article_category) {
                    $articletocategory[$article_category] = new ArticleToCategory();
                    $articletocategory[$article_category]->category_id = $article_category;
                    $articletocategory[$article_category]->link('article', $article);
                }
            }
            $isValid = $article->validate();
            foreach($images as $index => $value) {
                if($index == 'additional') {
                    $images[$index][0]->type = $index;
                    $images[$index][0]->imageFile = UploadedFile::getInstances($images[$index][0], "[{$index}]imageFile");
                    $isValid = $images[$index][0]->validate(['imageFile']) && $isValid;
                } else {
                    $images[$index]->type = $index;
                    $images[$index]->imageFile = UploadedFile::getInstance($images[$index], "[{$index}]imageFile");
                    $isValid = $images[$index]->validate(['imageFile']) && $isValid;
                }
            }
            if(empty(\Yii::$app->request->post()['ArticleLang'])) {
                $isValid  = ArticleLang::validateMultiple($article_langs) && $isValid;
            } else {
                foreach(\Yii::$app->request->post()['ArticleLang'] as $index => $article_lang) {
                    if (!array_key_exists($index, $article_langs)) {
                        $article_langs[$index] = new ArticleLang();
                        $article_langs[$index]->article_id = $article->id;
                    }
                }
                ArticleLang::loadMultiple($article_langs, \Yii::$app->request->post());
                $isValid = ArticleLang::validateMultiple($article_langs) && $isValid;
            }
        }
        if($isValid) {
            $article->save(false);
            foreach($images as $index => $image) {
                if($index == 'additional') {
                    $images[$index][0]->upload($article->id);
                } else {
                    if(!empty($images[$index]->imageFile)) {
                        $images[$index]->replace($article->id, true);
                    }
                }
            }
            foreach($article_langs as $article_lang) {
                $article_lang->save(false);
            }
            echo "ok";
            //$this->redirect('index');
        } else {
            return $this->render('update', [
                'article_langs' => $article_langs,
                'article' => $article,
                'langs' => $langs,
                'images' => $images
            ]);
        }
    }

    public function actionDelete($id)
    {
        $this->findModel($id)->delete();
        return $this->redirect(['index']);
    }

    protected function findModel($id)
    {
        if (($model = Article::findOne($id)) !== null) {
            return $model;
        } else {
            throw new NotFoundHttpException('The requested page does not exist.');
        }
    }
}