CategoryController.php 8.07 KB
<?php
namespace common\modules\blog\controllers;

use common\models\Language;
use common\modules\blog\models\Article;
use common\modules\blog\models\ArticleCategory;
use common\modules\blog\models\ArticleCategoryLang;
use common\modules\blog\models\ArticleCategoryMedia;
use common\modules\blog\models\ArticleLang;
use yii\data\ActiveDataProvider;
use yii\filters\VerbFilter;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\web\UploadedFile;

class CategoryController extends Controller
{
    public function behaviors()
    {
        return [
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'delete' => ['post']
                ]
            ]
        ];
    }

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

    public function actionCreate()
    {
        $category_langs = array();
        $category = new ArticleCategory();
        $images = array();
        $images['full'] = new ArticleCategoryMedia(['scenario' => ArticleCategoryMedia::SCENARIO_FULL]);
        $images['preview'] = new ArticleCategoryMedia(['scenario' => ArticleCategoryMedia::SCENARIO_PREVIEW]);
        $images['additional'] = new ArticleCategoryMedia(['scenario' => ArticleCategoryMedia::SCENARIO_ADDITIONAL]);
        $category->loadDefaultValues();
        $langs = Language::getActiveLanguages();
        $default_lang = Language::getDefaultLang();
        $isValid = false;
        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())) {
            $isValid = true;
            $category->load(\Yii::$app->request->post());
            $isValid = $category->validate();
            if(empty(\Yii::$app->request->post()['ArticleCategoryLang'])) {
                $category_langs[$default_lang->language_id] = new ArticleCategoryLang();
                $isValid  = ArticleCategoryLang::validateMultiple($category_langs) && $isValid;
            } else {
                foreach(\Yii::$app->request->post()['ArticleCategoryLang'] as $index => $category_lang) {
                    $category_langs[$index] = new ArticleCategoryLang();
                }
                ArticleCategoryLang::loadMultiple($category_langs, \Yii::$app->request->post());
                $isValid = ArticleCategoryLang::validateMultiple($category_langs) && $isValid;
            }
        } else {
            $category_langs[$default_lang->language_id] = new ArticleCategoryLang();
        }
        if($isValid) {
            $category->save(false);
            $first = 1;
            foreach($images as $index => $image) {
                $images[$index]->upload($category->id);
            }
            foreach($category_langs as $category_lang) {
                if($first) {
                    $category_lang_clone = clone $category_lang;
                    $category_lang_clone->lang_id = 0;
                    $category_lang_clone->link('category', $category);
                    unset($category_lang_clone);
                }
                $category_lang->link('category', $category);
                $first = 0;
            }
            echo "ok";
            //$this->redirect('index');
        } else {
            return $this->render('create', [
                'category_langs' => $category_langs,
                'category' => $category,
                'langs' => $langs,
                'images' => $images
            ]);
        }
    }

    public function actionUpdate($id)
    {
        $category = ArticleCategory::findOne($id);
        $images = $category->getArticleCategoryMedia()->indexBy('type')->all();
        if(!array_key_exists('full', $images)) {
            $images['full'] = new ArticleCategoryMedia();
        }
        if(!array_key_exists('preview', $images)) {
            $images['preview'] = new ArticleCategoryMedia();
        }
        foreach($images as $index => $image) {
            $images[$index]->scenario = $index;
        }
        $images['additional'] = array(
            0 => new ArticleCategoryMedia(['scenario' => ArticleCategoryMedia::SCENARIO_ADDITIONAL])
        );
        $images['additional'] = array_merge($images['additional'], $category->getArticleCategoryMedia()->andWhere(['type' => 'additional'])->indexBy('id')->all());
        foreach($images['additional'] as $index => $image) {
            $images['additional'][$index]->scenario = 'additional';
        }
        $category_langs = $category->getArticleCategoryLangs()->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;
            $category->load(\Yii::$app->request->post());
            $isValid = $category->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()['ArticleCategoryLang'])) {
                $isValid  = ArticleCategoryLang::validateMultiple($category_langs) && $isValid;
            } else {
                foreach(\Yii::$app->request->post()['ArticleCategoryLang'] as $index => $category_lang) {
                    if(!array_key_exists($index, $category_langs)) {
                        $category_langs[$index] = new ArticleCategoryLang();
                        $category_langs[$index]->category_id = $category->id;
                    }
                }
                ArticleCategoryLang::loadMultiple($category_langs, \Yii::$app->request->post());
                $isValid = ArticleCategoryLang::validateMultiple($category_langs) && $isValid;
            }
        }
        if($isValid) {
            $category->save(false);
            foreach($images as $index => $image) {
                if($index == 'additional') {
                    $images[$index][0]->upload($category->id);
                } else {
                    if(!empty($images[$index]->imageFile)) {
                        $images[$index]->replace($category->id, true);
                    }
                }
            }
            foreach($category_langs as $category_lang) {
                $category_lang->save(false);
            }
            echo "ok";
            //$this->redirect('index');
        } else {
            return $this->render('update', [
                'category_langs' => $category_langs,
                'category' => $category,
                'langs' => $langs,
                'images' => $images
            ]);
        }
    }

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

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