BackendController.php 8.33 KB
Newer Older
1 2 3 4 5 6 7 8 9
<?php
/**
 * @author Semenov Alexander <semenov@skeeks.com>
 * @link http://skeeks.com/
 * @copyright 2010 SkeekS (СкикС)
 * @date 15.03.2015
 */
namespace skeeks\modules\cms\shop\controllers;
use skeeks\cms\base\Controller;
10
use skeeks\cms\helpers\RequestResponse;
1  
semenov committed
11 12
use skeeks\cms\helpers\UrlHelper;
use skeeks\cms\models\forms\SignupForm;
13 14 15 16
use skeeks\modules\cms\form\models\Form;
use skeeks\modules\cms\form\models\FormField;
use skeeks\modules\cms\form\models\FormSendMessage;
use skeeks\modules\cms\shop\models\ShopOrder;
1  
semenov committed
17
use skeeks\modules\cms\shop\models\ShopPaySystem;
18 19 20
use skeeks\modules\cms\shop\models\ShopPersonType;
use yii\base\Exception;
use yii\base\UserException;
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
use yii\filters\VerbFilter;
use yii\helpers\ArrayHelper;
use yii\web\Response;
use yii\widgets\ActiveForm;

/**
 * Class BackendController
 * @package skeeks\modules\cms\form\controllers
 */
class BackendController extends Controller
{
    /**
     * @return array
     */
    public function behaviors()
    {
        return ArrayHelper::merge(parent::behaviors(), [

            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'validate' => ['post'],
                    'submit' => ['post'],
                ],
            ],
        ]);
    }


    /**
     * Процесс отправки формы
     * @return array
     */
    public function actionCreateOrder()
    {
56 57
        if (\Yii::$app->request->isAjax && !\Yii::$app->request->isPjax)
        {
58 59
            \Yii::$app->response->format = Response::FORMAT_JSON;

60 61 62 63 64 65 66 67
            $rr = new RequestResponse();

            try
            {
                if (!$formId = \Yii::$app->request->post(Form::FROM_PARAM_ID_NAME))
                {
                    throw new UserException('Не найден параметр формы');
                }
68 69 70 71

                /**
                 * @var $modelForm Form
                 */
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
                $modelForm  = Form::find()->where(['id' => $formId])->one();
                $model      = $modelForm->createValidateModel();

                if ($model->load(\Yii::$app->request->post()) && $model->validate())
                {
                    $shopPersonTypeId = (int) \Yii::$app->request->post('shopPersonType');
                    if (!$shopPersonTypeId)
                    {
                        throw new UserException('Не передан параметр тип плательщика');
                    }

                    $shopPersonType = ShopPersonType::findOne($shopPersonTypeId);
                    if (!$shopPersonType)
                    {
                        throw new UserException('Не указан плательщик');
                    }
88

1  
semenov committed
89 90 91 92 93 94 95
                    $shopPaySystemId = (int) \Yii::$app->request->post('shopPaySystemId');
                    $shopPaySystem = ShopPaySystem::findOne($shopPaySystemId);
                    if (!$shopPaySystem)
                    {
                        throw new UserException('Не указана система оплаты');
                    }

96 97 98 99
                    if (!$model->email)
                    {
                        throw new UserException('Не указан email.');
                    }
100

101 102 103 104
                    if (!\Yii::$app->shop->cart->countProducts())
                    {
                        throw new UserException('Нет товаров в корзине.');
                    }
105 106 107 108 109


                    //Пользователь авторизован или нет.
                    if (\Yii::$app->user->isGuest)
                    {
1  
semenov committed
110 111 112 113 114 115 116 117 118
                        $registerForm = new SignupForm();
                        $registerForm->setScenario(SignupForm::SCENARION_ONLYEMAIL);
                        $registerForm->email = $model->email;

                        $user = $registerForm->signup();

                        //Проверим может что то можно заполнить в профиле пользователя.
                        if ($user)
                        {
1  
semenov committed
119
                            foreach ($model->attributeValues() as $code => $value)
1  
semenov committed
120 121 122 123 124 125 126 127 128 129
                            {
                                if ($user->hasAttribute($code))
                                {
                                    $user->{$code} = $value;
                                }
                            }

                            $user->save(false);
                        } else
                        {
1  
semenov committed
130
                            throw new UserException("Не удалось зарегистрировать пользователя, возможно пользователь с указанным email адресом уже зарегистрирован.");
1  
semenov committed
131
                        }
132

1  
semenov committed
133 134 135
                        //Авторизация пользователя
                        \Yii::$app->user->login($user, 0);

136 137
                    } else
                    {
138
                        $user = \Yii::$app->cms->getAuthUser();
139 140
                    }

141 142 143
                    $cost       = \Yii::$app->shop->cart->cost();
                    $currency   = $cost->getCurrency();

144 145
                    //Создание нового заказа
                    $shopOrder = new ShopOrder([
146 147 148 149
                        'person_type_id'    => $shopPersonType->id,
                        'price'             => $cost->getAmount() / $currency->getSubUnit(),
                        'currency'          => (string) $currency,
                        'user_id'           => $user->id,
1  
semenov committed
150 151
                        'pay_system_id'     => $shopPaySystem->id,
                        'data'              => $model->attributeLabelsValues(),
152 153
                    ]);

154 155 156 157 158 159 160 161 162 163 164
                    if (!$shopOrder->save())
                    {
                        $result = [];
                        $errors = $shopOrder->getErrors();
                        foreach ($errors as $errorData)
                        {
                            $result[] = implode(', ', $errorData);
                        }

                        throw new UserException('Не получилось оформить заказ: ' . implode('; ', $result));
                    }
165

166 167 168 169 170 171 172 173 174
                    //Переписать позиции корзины
                    if ($shopBaskets = \Yii::$app->shop->cart->getShopBaskets())
                    {
                        foreach ($shopBaskets as $shopBasket)
                        {
                            $shopBasket->order_id = $shopOrder->id;
                            $shopBasket->save();
                        }
                    }
175 176

                    //Отправка сообщения с формы
177 178 179 180 181 182 183 184 185 186 187 188 189
                    //Все проверки прошли, формируем модель отправленного сообщения и сохраняем ее
                    $modelFormSendMessage = new FormSendMessage();

                    $modelFormSendMessage->data_values = $model->attributeValues();
                    $modelFormSendMessage->data_labels = $model->attributeLabels();

                    $modelFormSendMessage->page_url = \Yii::$app->request->referrer;
                    $modelFormSendMessage->form_id = $formId;

                    if ($modelFormSendMessage->save())
                    {
                        $modelFormSendMessage->notify();

190 191 192 193 194 195
                        $rr->success = true;
                        $rr->message = 'Успешно отправлена';

                    } else
                    {
                        $rr->message = 'Не удалось сохранить сообщение в базу';
196 197
                    }

198

1  
semenov committed
199 200 201 202 203 204 205 206 207
                    $rr->success = true;
                    $rr->message = 'Заказ успешно создан';
                    \Yii::$app->session->setFlash("success", 'Заказ успешно создан');

                    return $this->redirect( UrlHelper::construct('shop/order/view', [
                        'id' => $shopOrder->id,
                        'sx-new' => '1'
                    ])->toString() );

208 209 210
                } else
                {
                    $rr->message = 'Форма заполнена неправильно';
211 212
                }

213 214 215
            } catch(\Exception $e)
            {
                $rr->message = $e->getMessage();
216
            }
217 218 219

            return (array) $rr;

220 221 222
        }
    }
}