SiteController.php 6.95 KB
<?php
namespace frontend\controllers;

use common\models\Articles;
use common\models\Blog;
use common\models\Slider;
use common\modules\product\models\Category;
use common\models\Page;
use common\modules\product\models\Product;
use common\modules\product\models\ProductVariant;
use Yii;
use yii\base\InvalidParamException;
use yii\web\BadRequestHttpException;
use yii\web\Controller;
use yii\filters\VerbFilter;
use yii\filters\AccessControl;
use common\models\LoginForm;
use frontend\models\PasswordResetRequestForm;
use frontend\models\ResetPasswordForm;
use frontend\models\SignupForm;
use yii\web\NotFoundHttpException;
use yii\data\ActiveDataProvider;
use yii\data\ArrayDataProvider;

/**
 * Site controller
 */
class SiteController extends Controller
{
    /**
     * @inheritdoc
     */
    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'only' => ['logout', 'signup'],
                'rules' => [
                    [
                        'actions' => ['signup'],
                        'allow' => true,
                        'roles' => ['?'],
                    ],
                    [
                        'actions' => ['logout'],
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                ],
            ],
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'logout' => ['post'],
                ],
            ],
        ];
    }

    /**
     * @inheritdoc
     */
    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
            'captcha' => [
                'class' => 'yii\captcha\CaptchaAction',
                'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
            ],
        ];
    }
    
    public function beforeAction($action)
    {
        if ($this->action->id == 'sku')
        {
            $this->enableCsrfValidation = false;
        }
        
        return parent::beforeAction($action);
        
    }
    
    /**
     * Displays homepage.
     *
     * @return mixed
     */
    public function actionIndex()
    {
        $newCollections = new ArrayDataProvider([
            'allModels' => Category::find()->where([
                'new_collection' => true,
            ])->limit(3)->all(),
        ]);

        $blog_article = Blog::find()->one();
        $event_article = Articles::find()->one();
        $slider = Slider::find()
            ->where([
                'main_page' => true,
            ])->one();
        return $this->render('index', [
            'newCollections' => $newCollections,
            'blog_article' => $blog_article,
            'event_article' => $event_article,
            'slider' => $slider,
        ]);
    }

    /**
     * Logs in a user.
     *
     * @return mixed
     */
    public function actionLogin()
    {
        if (!Yii::$app->user->isGuest) {
            return $this->goHome();
        }

        $model = new LoginForm();
        if ($model->load(Yii::$app->request->post()) && $model->login()) {
            return $this->goBack();
        } else {
            return $this->render('login', [
                'model' => $model,
            ]);
        }
    }

    /**
     * Logs out the current user.
     *
     * @return mixed
     */
    public function actionLogout()
    {
        Yii::$app->user->logout();

        return $this->goHome();
    }

    /**
     * Displays contact page.
     *
     * @return string
     */
    public function actionContact()
    {
        return $this->render('contact');
    }

    /**
     * Signs user up.
     *
     * @return mixed
     */
    public function actionSignup()
    {
        $model = new SignupForm();
        if ($model->load(Yii::$app->request->post())) {
            if ($user = $model->signup()) {
                if (Yii::$app->getUser()->login($user)) {
                    return $this->goHome();
                }
            }
        }

        return $this->render('signup', [
            'model' => $model,
        ]);
    }

    /**
     * Requests password reset.
     *
     * @return mixed
     */
    public function actionRequestPasswordReset()
    {
        $model = new PasswordResetRequestForm();
        if ($model->load(Yii::$app->request->post()) && $model->validate()) {
            if ($model->sendEmail()) {
                Yii::$app->session->setFlash('success', 'Check your email for further instructions.');

                return $this->goHome();
            } else {
                Yii::$app->session->setFlash('error', 'Sorry, we are unable to reset password for email provided.');
            }
        }

        return $this->render('requestPasswordResetToken', [
            'model' => $model,
        ]);
    }

    /**
     * Resets password.
     *
     * @param string $token
     * @return mixed
     * @throws BadRequestHttpException
     */
    public function actionResetPassword($token)
    {
        try {
            $model = new ResetPasswordForm($token);
        } catch (InvalidParamException $e) {
            throw new BadRequestHttpException($e->getMessage());
        }

        if ($model->load(Yii::$app->request->post()) && $model->validate() && $model->resetPassword()) {
            Yii::$app->session->setFlash('success', 'New password was saved.');

            return $this->goHome();
        }

        return $this->render('resetPassword', [
            'model' => $model,
        ]);
    }
    
    /**
     * Show brand page.
     *
     * @return string
     */
    public function actionBrand()
    {
        return $this->render('brand');
    }
    
    /**
     * Show laminate page.
     *
     * @return string
     */
    public function actionLaminate()
    {
        return $this->render('laminate');
    }
    
    /**
     * Show certificates page.
     *
     * @return string
     */
    public function actionCertificates()
    {
        return $this->render('certificates');
    }
    
    public function actionPage($id) {
        $model = Page::findOne($id);
        if(empty($model)) {
            throw new NotFoundHttpException();
        }
        return $this->render('page', [
            'model' => $model,
        ]);
    }
    
    public function actionSku()
    {
        $sku = Yii::$app->request->post('sku');
        if(empty($sku)) throw new NotFoundHttpException('Не задан артикул');
        
        $variant = ProductVariant::find()
            ->where([
                'sku' => $sku,
            ])
            ->with('product')->one();
        if(empty($variant))
        {
            throw new NotFoundHttpException('Артикул не найден');
        } else
        {
            return $this->redirect([
                'catalog/product',
                'product' => $variant->product->alias,
                'variant' => $variant->sku,
            ]);
        }
    }
}