Работа над сайтом 13
This commit is contained in:
parent
83295650c9
commit
fc59eff6db
|
@ -10,13 +10,68 @@ use yii\filters\AccessControl;
|
||||||
use yii\web\Controller;
|
use yii\web\Controller;
|
||||||
use yii\web\Response;
|
use yii\web\Response;
|
||||||
|
|
||||||
|
use app\models\Product;
|
||||||
use app\models\Order;
|
use app\models\Order;
|
||||||
use app\models\OrderEdgeSupply;
|
use app\models\OrderEdgeSupply;
|
||||||
|
|
||||||
use Exception;
|
use Exception;
|
||||||
|
use yii\web\Cookie;
|
||||||
|
|
||||||
class CartController extends Controller
|
class CartController extends Controller
|
||||||
{
|
{
|
||||||
|
public function behaviors()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'access' => [
|
||||||
|
'class' => AccessControl::class,
|
||||||
|
'rules' => [
|
||||||
|
[
|
||||||
|
'allow' => true,
|
||||||
|
'roles' => ['@'],
|
||||||
|
'actions' => [
|
||||||
|
'index',
|
||||||
|
'edit-comm'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'allow' => false,
|
||||||
|
'roles' => ['?'],
|
||||||
|
'denyCallback' => [$this, 'accessDenied']
|
||||||
|
]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function accessDenied()
|
||||||
|
{
|
||||||
|
// Инициализация
|
||||||
|
$cookies = yii::$app->response->cookies;
|
||||||
|
|
||||||
|
// Запись cookie с редиректом, который выполнится после авторизации
|
||||||
|
$cookies->add(new Cookie([
|
||||||
|
'name' => 'redirect',
|
||||||
|
'value' => yii::$app->request->pathInfo
|
||||||
|
]));
|
||||||
|
|
||||||
|
if (yii::$app->request->isPost) {
|
||||||
|
// POST-запрос
|
||||||
|
|
||||||
|
// Настройка
|
||||||
|
yii::$app->response->format = Response::FORMAT_JSON;
|
||||||
|
|
||||||
|
// Генерация ответа
|
||||||
|
yii::$app->response->content = json_encode([
|
||||||
|
'main' => $this->renderPartial('/account/index'),
|
||||||
|
'redirect' => '/cart',
|
||||||
|
'_csrf' => yii::$app->request->getCsrfToken()
|
||||||
|
]);
|
||||||
|
} else if (yii::$app->request->isGet) {
|
||||||
|
// GET-запрос
|
||||||
|
|
||||||
|
$this->redirect('/authentication');
|
||||||
|
}
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Страница: "Корзина"
|
* Страница: "Корзина"
|
||||||
*
|
*
|
||||||
|
|
|
@ -7,7 +7,7 @@ use yii\web\Controller;
|
||||||
|
|
||||||
class ErrorController extends Controller
|
class ErrorController extends Controller
|
||||||
{
|
{
|
||||||
public function actionIndex()
|
public function actionIndex(): string
|
||||||
{
|
{
|
||||||
$exception = Yii::$app->errorHandler->exception;
|
$exception = Yii::$app->errorHandler->exception;
|
||||||
|
|
||||||
|
@ -15,21 +15,26 @@ class ErrorController extends Controller
|
||||||
// Исключение не выброшено
|
// Исключение не выброшено
|
||||||
|
|
||||||
// Запись кода ошибки
|
// Запись кода ошибки
|
||||||
$statusCode = $exception->statusCode ?? $exception->getCode() ?? 0;
|
$code = $exception->statusCode ?? $exception->getCode() ?? 0;
|
||||||
|
|
||||||
// Запись названия ошибки
|
// Запись названия ошибки
|
||||||
$name = match ($statusCode) {
|
$title = match ($code) {
|
||||||
404 => '404 (Не найдено)',
|
404 => '404 (Не найдено)',
|
||||||
default => $exception->getName()
|
default => $exception->getName()
|
||||||
};
|
};
|
||||||
|
|
||||||
// Запись сообщения об ошибке
|
// Запись сообщения об ошибке
|
||||||
$message = match ($statusCode) {
|
$description = match ($code) {
|
||||||
404 => 'Страница не найдена',
|
404 => 'Страница не найдена',
|
||||||
default => $exception->getMessage()
|
default => $exception->getMessage()
|
||||||
};
|
};
|
||||||
|
|
||||||
return $this->render('/error', compact('exception', 'statusCode', 'name', 'message'));
|
return $this->render('/error', compact('exception', 'code', 'title', 'description'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function throw(string $title, string $description): string {
|
||||||
|
|
||||||
|
return yii::$app->controller->render('/error', compact('title', 'description'));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,16 +44,16 @@ class OfferController extends Controller
|
||||||
'value' => yii::$app->request->pathInfo
|
'value' => yii::$app->request->pathInfo
|
||||||
]));
|
]));
|
||||||
|
|
||||||
if (Yii::$app->request->isPost) {
|
if (yii::$app->request->isPost) {
|
||||||
// POST-запрос
|
// POST-запрос
|
||||||
|
|
||||||
// Настройка
|
// Настройка
|
||||||
Yii::$app->response->format = Response::FORMAT_JSON;
|
yii::$app->response->format = Response::FORMAT_JSON;
|
||||||
|
|
||||||
// Генерация ответа
|
// Генерация ответа
|
||||||
Yii::$app->response->content = json_encode([
|
yii::$app->response->content = json_encode([
|
||||||
'redirect' => '/authentication',
|
'redirect' => '/authentication',
|
||||||
'_csrf' => Yii::$app->request->getCsrfToken()
|
'_csrf' => yii::$app->request->getCsrfToken()
|
||||||
]);
|
]);
|
||||||
} else if (Yii::$app->request->isGet) {
|
} else if (Yii::$app->request->isGet) {
|
||||||
// GET-запрос
|
// GET-запрос
|
||||||
|
|
|
@ -42,7 +42,7 @@ class OrderController extends Controller
|
||||||
'write',
|
'write',
|
||||||
'delete',
|
'delete',
|
||||||
'amount-update',
|
'amount-update',
|
||||||
'pay',
|
'request',
|
||||||
'supply-read',
|
'supply-read',
|
||||||
'supply-write-stts',
|
'supply-write-stts',
|
||||||
'supply-edit-time',
|
'supply-edit-time',
|
||||||
|
@ -71,19 +71,19 @@ class OrderController extends Controller
|
||||||
'value' => yii::$app->request->pathInfo
|
'value' => yii::$app->request->pathInfo
|
||||||
]));
|
]));
|
||||||
|
|
||||||
if (Yii::$app->request->isPost) {
|
if (yii::$app->request->isPost) {
|
||||||
// POST-запрос
|
// POST-запрос
|
||||||
|
|
||||||
// Настройка
|
// Настройка
|
||||||
Yii::$app->response->format = Response::FORMAT_JSON;
|
yii::$app->response->format = Response::FORMAT_JSON;
|
||||||
|
|
||||||
// Генерация ответа
|
// Генерация ответа
|
||||||
Yii::$app->response->content = json_encode([
|
yii::$app->response->content = json_encode([
|
||||||
'main' => $this->renderPartial('/orders/index'),
|
'main' => $this->renderPartial('/account/index'),
|
||||||
'redirect' => '/authentication',
|
'redirect' => '/order',
|
||||||
'_csrf' => Yii::$app->request->getCsrfToken()
|
'_csrf' => yii::$app->request->getCsrfToken()
|
||||||
]);
|
]);
|
||||||
} else if (Yii::$app->request->isGet) {
|
} else if (yii::$app->request->isGet) {
|
||||||
// GET-запрос
|
// GET-запрос
|
||||||
|
|
||||||
$this->redirect('/authentication');
|
$this->redirect('/authentication');
|
||||||
|
@ -357,9 +357,9 @@ class OrderController extends Controller
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Оплата
|
* Запросить заказ
|
||||||
*/
|
*/
|
||||||
public function actionPay(): string|array|null
|
public function actionRequest(): string|array|null
|
||||||
{
|
{
|
||||||
// Инициализация
|
// Инициализация
|
||||||
$model = Order::search(supplies: true);
|
$model = Order::search(supplies: true);
|
||||||
|
|
|
@ -32,9 +32,24 @@ class RegistrationController extends Controller
|
||||||
if ($type === 'registration' && (!yii::$app->user->isGuest || $model->registration())) {
|
if ($type === 'registration' && (!yii::$app->user->isGuest || $model->registration())) {
|
||||||
// Данные прошли проверку и аккаунт был создан
|
// Данные прошли проверку и аккаунт был создан
|
||||||
|
|
||||||
|
echo 1; die;
|
||||||
|
|
||||||
// Аутентификация
|
// Аутентификация
|
||||||
$model->scenario = $model::SCENARIO_AUTHENTICATION;
|
$model->scenario = $model::SCENARIO_AUTHENTICATION;
|
||||||
$model->authentication();
|
|
||||||
|
if (!$model->authentication()) {
|
||||||
|
// Не удалось аутентифицироваться
|
||||||
|
|
||||||
|
yii::$app->response->statusCode = 401;
|
||||||
|
|
||||||
|
$model->scenario = $model::SCENARIO_REGISTRATION;
|
||||||
|
|
||||||
|
return [
|
||||||
|
'main' => $this->renderPartial('/account/index', compact('model') + ['registration' => true]),
|
||||||
|
'redirect' => '/registration',
|
||||||
|
'_csrf' => yii::$app->request->getCsrfToken()
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
// Инициализация
|
// Инициализация
|
||||||
$notifications_button = $this->renderPartial('/notification/button');
|
$notifications_button = $this->renderPartial('/notification/button');
|
||||||
|
|
|
@ -14,7 +14,7 @@ use app\models\Supply;
|
||||||
use app\models\Search;
|
use app\models\Search;
|
||||||
|
|
||||||
use app\models\connection\Dellin;
|
use app\models\connection\Dellin;
|
||||||
|
use app\models\Settings;
|
||||||
use Exception;
|
use Exception;
|
||||||
|
|
||||||
class SearchController extends Controller
|
class SearchController extends Controller
|
||||||
|
@ -181,23 +181,62 @@ class SearchController extends Controller
|
||||||
// Инициализация аккаунта
|
// Инициализация аккаунта
|
||||||
$connection['account'] = Account::searchBySupplyId($connection['supply_edge_product'][0]['_from']);
|
$connection['account'] = Account::searchBySupplyId($connection['supply_edge_product'][0]['_from']);
|
||||||
|
|
||||||
|
// Инициализация продукта
|
||||||
|
$connection['product'] = Product::searchBySupplyId($connection['supply_edge_product'][0]['_from']);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Инициализация доставки (автоматическая)
|
// Инициализация данных геолокации
|
||||||
$connection['delivery'] = Dellin::calcDeliveryAdvanced(
|
try {
|
||||||
$connection['account']['opts']['delivery_from_terminal'],
|
$from = (int) $connection['account']['opts']['delivery_from_terminal'] ?? Settings::search()->delivery_from_default ?? 36;
|
||||||
yii::$app->user->identity->opts['delivery_to_terminal'],
|
} catch (Exception $e) {
|
||||||
|
$from = (int) Settings::search()->delivery_from_default ?? 36;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
$to = (int) yii::$app->user->identity->opts['delivery_to_terminal'] ?? 36;
|
||||||
|
} catch (Exception $e) {
|
||||||
|
$to = 36;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($buffer_connection = $connection['product']['bffr']["$from-$to"] ?? false) {
|
||||||
|
// Найдены данные доставки в буфере
|
||||||
|
|
||||||
|
if (time() < $buffer_connection['expires']) {
|
||||||
|
// Срок хранения не превышен, информация актуальна
|
||||||
|
|
||||||
|
// Запись в буфер вывода
|
||||||
|
$connection['delivery'] = $buffer_connection['data'];
|
||||||
|
$connection['delivery']['type'] = 'auto';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Инициализация инстанции продукта в базе данных
|
||||||
|
$product = Product::searchByCatn($connection['product']['catn']);
|
||||||
|
|
||||||
|
// Инициализация доставки Dellin (автоматическая)
|
||||||
|
$product->bffr = ($product->bffr ?? []) + [
|
||||||
|
"$from-$to" => [
|
||||||
|
'data' => $connection['delivery'] = Dellin::calcDeliveryAdvanced(
|
||||||
|
$from,
|
||||||
|
$to,
|
||||||
(int) ($connection['product']['wght'] ?? 0),
|
(int) ($connection['product']['wght'] ?? 0),
|
||||||
(int) ($connection['product']['dmns']['x'] ?? 0),
|
(int) ($connection['product']['dmns']['x'] ?? 0),
|
||||||
(int) ($connection['product']['dmns']['y'] ?? 0),
|
(int) ($connection['product']['dmns']['y'] ?? 0),
|
||||||
(int) ($connection['product']['dmns']['z'] ?? 0)
|
(int) ($connection['product']['dmns']['z'] ?? 0)
|
||||||
);
|
),
|
||||||
|
'expires' => time() + 86400
|
||||||
|
]
|
||||||
|
];
|
||||||
$connection['delivery']['type'] = 'auto';
|
$connection['delivery']['type'] = 'auto';
|
||||||
|
|
||||||
|
// Отправка в базу данных
|
||||||
|
$product->update();
|
||||||
|
}
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
$connection['delivery']['error'] = true;
|
$connection['delivery']['error'] = true;
|
||||||
|
|
||||||
// var_dump($e->getMessage());
|
var_dump($e->getMessage());
|
||||||
// var_dump($e->getTrace());
|
var_dump($e->getTrace());
|
||||||
// var_dump($e->getFile());
|
var_dump($e->getFile());
|
||||||
|
|
||||||
// var_dump(json_decode($e->getMessage(), true)['errors']);
|
// var_dump(json_decode($e->getMessage(), true)['errors']);
|
||||||
// die;
|
// die;
|
||||||
|
@ -209,18 +248,53 @@ class SearchController extends Controller
|
||||||
// Инициализация версии для рассчета доставки по воздуху
|
// Инициализация версии для рассчета доставки по воздуху
|
||||||
$buffer = $connection;
|
$buffer = $connection;
|
||||||
|
|
||||||
|
try {// Инициализация данных геолокации
|
||||||
try {
|
try {
|
||||||
// Инициализация доставки Dellin (самолётом)
|
$from = (int) $connection['account']['opts']['delivery_from_terminal'] ?? Settings::search()->delivery_from_default ?? 36;
|
||||||
$buffer['delivery'] = Dellin::calcDeliveryAdvanced(
|
} catch (Exception $e) {
|
||||||
$buffer['account']['opts']['delivery_from_terminal'],
|
$from = (int) Settings::search()->delivery_from_default ?? 36;
|
||||||
yii::$app->user->identity->opts['delivery_to_terminal'],
|
}
|
||||||
(int) ($buffer['product']['wght'] ?? 0),
|
|
||||||
(int) ($buffer['product']['dmns']['x'] ?? 0),
|
try {
|
||||||
(int) ($buffer['product']['dmns']['y'] ?? 0),
|
$to = (int) yii::$app->user->identity->opts['delivery_to_terminal'] ?? 36;
|
||||||
(int) ($buffer['product']['dmns']['z'] ?? 0),
|
} catch (Exception $e) {
|
||||||
|
$to = 36;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($buffer_connection = $connection['product']['bffr']["$from-$to-avia"] ?? false) {
|
||||||
|
// Найдены данные доставки в буфере
|
||||||
|
|
||||||
|
if (time() < $buffer_connection['expires']) {
|
||||||
|
// Срок хранения не превышен, информация актуальна
|
||||||
|
|
||||||
|
// Запись в буфер вывода
|
||||||
|
$connection['delivery'] = $buffer_connection['data'];
|
||||||
|
$connection['delivery']['type'] = 'avia';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Инициализация инстанции продукта в базе данных
|
||||||
|
$product = Product::searchByCatn($connection['product']['catn']);
|
||||||
|
|
||||||
|
// Инициализация доставки Dellin (автоматическая)
|
||||||
|
$product->bffr = ($product->bffr ?? []) + [
|
||||||
|
"$from-$to-avia" => [
|
||||||
|
'data' => $connection['delivery'] = Dellin::calcDeliveryAdvanced(
|
||||||
|
$from,
|
||||||
|
$to,
|
||||||
|
(int) ($connection['product']['wght'] ?? 0),
|
||||||
|
(int) ($connection['product']['dmns']['x'] ?? 0),
|
||||||
|
(int) ($connection['product']['dmns']['y'] ?? 0),
|
||||||
|
(int) ($connection['product']['dmns']['z'] ?? 0),
|
||||||
avia: true
|
avia: true
|
||||||
);
|
),
|
||||||
$buffer['delivery']['type'] = 'avia';
|
'expires' => time() + 86400
|
||||||
|
]
|
||||||
|
];
|
||||||
|
$connection['delivery']['type'] = 'avia';
|
||||||
|
|
||||||
|
// Отправка в базу данных
|
||||||
|
$product->update();
|
||||||
|
}
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
$buffer['delivery']['error'] = true;
|
$buffer['delivery']['error'] = true;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace app\controllers;
|
||||||
|
|
||||||
|
use yii;
|
||||||
|
use yii\web\Controller;
|
||||||
|
use app\models\Account;
|
||||||
|
use yii\web\Response;
|
||||||
|
|
||||||
|
class VerifyController extends Controller
|
||||||
|
{
|
||||||
|
public function actionIndex(string $vrfy = null): string|Response
|
||||||
|
{
|
||||||
|
if (isset($vrfy)) {
|
||||||
|
// Подтверждение регистрации
|
||||||
|
|
||||||
|
if (Account::verification($vrfy)) {
|
||||||
|
// Успешно подтверждена регистрация
|
||||||
|
|
||||||
|
return $this->redirect('/');
|
||||||
|
}
|
||||||
|
|
||||||
|
return ErrorController::throw('Ошибка подтверждения регистрации', 'Код подтверждения не совпадает с тем, что мы отправили вам на почту, либо регистрация уже была подтверждена. Свяжитесь с администрацией');
|
||||||
|
} else {
|
||||||
|
// Простой запрос
|
||||||
|
|
||||||
|
return $this->render('/account/verify');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Отправить запрос на активацию
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function actionSend(): string|array
|
||||||
|
{
|
||||||
|
yii::$app->user->identity->verifyRegenerate();
|
||||||
|
|
||||||
|
yii::$app->user->identity->sendMailVerify();
|
||||||
|
|
||||||
|
if (yii::$app->request->isPost) {
|
||||||
|
// POST-запрос
|
||||||
|
|
||||||
|
yii::$app->response->format = Response::FORMAT_JSON;
|
||||||
|
|
||||||
|
return [
|
||||||
|
'main' => $this->renderPartial('/account/verify'),
|
||||||
|
'title' => 'Корзина',
|
||||||
|
'_csrf' => yii::$app->request->getCsrfToken()
|
||||||
|
];
|
||||||
|
} else {
|
||||||
|
// Подразумевается как GET-запрос
|
||||||
|
|
||||||
|
return $this->render('/account/verify');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,7 +4,7 @@ declare(strict_types=1);
|
||||||
|
|
||||||
namespace app\models;
|
namespace app\models;
|
||||||
|
|
||||||
use Yii;
|
use yii;
|
||||||
use yii\web\IdentityInterface;
|
use yii\web\IdentityInterface;
|
||||||
|
|
||||||
use carono\exchange1c\interfaces\PartnerInterface;
|
use carono\exchange1c\interfaces\PartnerInterface;
|
||||||
|
@ -50,6 +50,7 @@ class Account extends Document implements IdentityInterface, PartnerInterface
|
||||||
'opts',
|
'opts',
|
||||||
'agnt',
|
'agnt',
|
||||||
'type',
|
'type',
|
||||||
|
'vrfy',
|
||||||
'acpt'
|
'acpt'
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
|
@ -76,6 +77,7 @@ class Account extends Document implements IdentityInterface, PartnerInterface
|
||||||
'opts' => 'Параметры',
|
'opts' => 'Параметры',
|
||||||
'agnt' => 'Агент (поставщик)',
|
'agnt' => 'Агент (поставщик)',
|
||||||
'type' => 'Тип аккаунта',
|
'type' => 'Тип аккаунта',
|
||||||
|
'vrfy' => 'Статус подтверждения владением почты',
|
||||||
'acpt' => 'Согласие с офертой'
|
'acpt' => 'Согласие с офертой'
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
|
@ -114,6 +116,10 @@ class Account extends Document implements IdentityInterface, PartnerInterface
|
||||||
[
|
[
|
||||||
'indx',
|
'indx',
|
||||||
'string'
|
'string'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'vrfy',
|
||||||
|
'validateVrfyUnique'
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
|
@ -129,7 +135,8 @@ class Account extends Document implements IdentityInterface, PartnerInterface
|
||||||
{
|
{
|
||||||
if (parent::beforeSave($data)) {
|
if (parent::beforeSave($data)) {
|
||||||
if ($this->isNewRecord) {
|
if ($this->isNewRecord) {
|
||||||
$this->auth = Yii::$app->security->generateRandomString();
|
$this->auth = yii::$app->security->generateRandomString();
|
||||||
|
$this->vrfy = yii::$app->security->generateRandomString();
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -204,6 +211,17 @@ class Account extends Document implements IdentityInterface, PartnerInterface
|
||||||
return static::findOne(['mail' => $mail]);
|
return static::findOne(['mail' => $mail]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Поиск по статусу активации почты
|
||||||
|
*
|
||||||
|
* @todo Подождать обновление Yii2 и добавить
|
||||||
|
* проверку типов передаваемых параметров
|
||||||
|
*/
|
||||||
|
public static function findByVrfy($vrfy): ?self
|
||||||
|
{
|
||||||
|
return static::findOne(['vrfy' => $vrfy]);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Поиск по идентификатору
|
* Поиск по идентификатору
|
||||||
*
|
*
|
||||||
|
@ -244,11 +262,67 @@ class Account extends Document implements IdentityInterface, PartnerInterface
|
||||||
*/
|
*/
|
||||||
public static function validateMail(string $mail): bool
|
public static function validateMail(string $mail): bool
|
||||||
{
|
{
|
||||||
if (static::findByMail($mail)) {
|
if ($account = static::findByMail($mail)) {
|
||||||
// Почта найдена в базе данных
|
// Почта найдена в базе данных
|
||||||
|
|
||||||
|
if (isset($account) && $account->vrfy === true) {
|
||||||
|
// Регистрация подтверждена
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Проверка статуса подтверждения регистрации
|
||||||
|
*/
|
||||||
|
public static function validateVrfy(string $vrfy): bool
|
||||||
|
{
|
||||||
|
if ($account = static::findByVrfy($vrfy)) {
|
||||||
|
// Статус найден в базе данных
|
||||||
|
|
||||||
|
if ($account->vrfy === true) {
|
||||||
|
// Регистрация подтверждена
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Проверка данных для поля подтверждения регистрации
|
||||||
|
*/
|
||||||
|
public function validateVrfyUnique($attribute, $params)
|
||||||
|
{
|
||||||
|
if (!$this->hasErrors()) {
|
||||||
|
// Проблем нет
|
||||||
|
|
||||||
|
if ($attribute !== true && $this->validateVrfy($attribute)) {
|
||||||
|
// Проверка не пройдена
|
||||||
|
|
||||||
|
$this->addError($attribute, 'Ключ подтверждения регистрации уже используется');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Подтверждение регистрации
|
||||||
|
*/
|
||||||
|
public static function verification(string $vrfy): bool
|
||||||
|
{
|
||||||
|
if ($account = static::findByVrfy($vrfy)) {
|
||||||
|
// Аккаунт найден
|
||||||
|
|
||||||
|
// Запись в буфер
|
||||||
|
$account->vrfy = true;
|
||||||
|
|
||||||
|
// Отправка изменений
|
||||||
|
return $account->update() > 0 ? true : false;
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -258,7 +332,8 @@ class Account extends Document implements IdentityInterface, PartnerInterface
|
||||||
*/
|
*/
|
||||||
public function validatePassword(string $pswd): bool
|
public function validatePassword(string $pswd): bool
|
||||||
{
|
{
|
||||||
return Yii::$app->security->validatePassword($pswd, $this->pswd);
|
// return yii::$app->security->validatePassword($pswd, $this->pswd);
|
||||||
|
return $pswd === $this->pswd;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -553,4 +628,111 @@ class Account extends Document implements IdentityInterface, PartnerInterface
|
||||||
default => 'Покупатель',
|
default => 'Покупатель',
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function sendMailVerify(): bool
|
||||||
|
{
|
||||||
|
if (isset($this->mail, $this->vrfy) && !$this->validateVrfy($this->vrfy)) {
|
||||||
|
// Данные инициализированы, а регистрация ещё не была подтверждена
|
||||||
|
|
||||||
|
// Отправка письма
|
||||||
|
yii::$app->mail_system->compose()
|
||||||
|
->setFrom(yii::$app->params['mail']['system'])
|
||||||
|
->setTo($this->mail)
|
||||||
|
->setSubject('Подтверждение регистрации')
|
||||||
|
->setHtmlBody(yii::$app->controller->renderPartial('/mails/verify', ['vrfy' => $this->vrfy, 'password' => $this->pswd]))
|
||||||
|
->send();
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Гениальный генератор пароля
|
||||||
|
*
|
||||||
|
* 35 * 19 * 9 = 5985 комбинаций
|
||||||
|
*
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
public static function passwordGenerate(): ?string
|
||||||
|
{
|
||||||
|
return match (rand(1, 35)) {
|
||||||
|
1 => 'салазки',
|
||||||
|
2 => 'запчасти',
|
||||||
|
3 => 'инструменты',
|
||||||
|
4 => 'детали',
|
||||||
|
5 => 'компоненты',
|
||||||
|
6 => 'ремни',
|
||||||
|
7 => 'шестерни',
|
||||||
|
8 => 'блоки',
|
||||||
|
9 => 'коронки',
|
||||||
|
10 => 'вал',
|
||||||
|
11 => 'пыльник',
|
||||||
|
12 => 'шкив',
|
||||||
|
13 => 'станок',
|
||||||
|
14 => 'сальник',
|
||||||
|
15 => 'кольцо',
|
||||||
|
16 => 'цепь',
|
||||||
|
17 => 'редуктор',
|
||||||
|
18 => 'фильтр',
|
||||||
|
19 => 'клапан',
|
||||||
|
20 => 'фару',
|
||||||
|
21 => 'мотор',
|
||||||
|
22 => 'подшипник',
|
||||||
|
23 => 'болт',
|
||||||
|
24 => 'стартер',
|
||||||
|
25 => 'двигатель',
|
||||||
|
26 => 'трубку',
|
||||||
|
27 => 'прокладку',
|
||||||
|
28 => 'помпу',
|
||||||
|
29 => 'запчасть',
|
||||||
|
30 => 'втулку',
|
||||||
|
31 => 'уплотнение',
|
||||||
|
32 => 'ролик',
|
||||||
|
33 => 'датчик',
|
||||||
|
34 => 'насос',
|
||||||
|
default => 'машину'
|
||||||
|
}
|
||||||
|
. ' ' . match (rand(1, 15)) {
|
||||||
|
1 => 'забыли',
|
||||||
|
2 => 'отжали',
|
||||||
|
3 => 'забрали',
|
||||||
|
4 => 'порвали',
|
||||||
|
5 => 'украли',
|
||||||
|
6 => 'обменяли',
|
||||||
|
7 => 'угнали',
|
||||||
|
8 => 'взорвали',
|
||||||
|
9 => 'поломали',
|
||||||
|
1 => 'доломали',
|
||||||
|
11 => 'утопили',
|
||||||
|
12 => 'испортили',
|
||||||
|
13 => 'добили',
|
||||||
|
14 => 'разбили',
|
||||||
|
default => 'сломали'
|
||||||
|
}
|
||||||
|
. ' ' . match (rand(1, 9)) {
|
||||||
|
1 => 'закажу',
|
||||||
|
2 => 'найду',
|
||||||
|
3 => 'отыщу',
|
||||||
|
4 => 'запрошу',
|
||||||
|
5 => 'поищу',
|
||||||
|
6 => 'оформлю',
|
||||||
|
7 => 'заменю',
|
||||||
|
8 => 'поменяю',
|
||||||
|
default => 'куплю'
|
||||||
|
}
|
||||||
|
. ' в скиллпартсе';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Пересоздать ключ подтверждения регистрации и пароль к аккаунту
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function verifyRegenerate(): bool
|
||||||
|
{
|
||||||
|
$this->pswd = static::passwordGenerate();
|
||||||
|
$this->vrfy = yii::$app->security->generateRandomString();
|
||||||
|
|
||||||
|
return $this->update() > 0 ? true : false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,37 +37,45 @@ class AccountForm extends Model
|
||||||
[
|
[
|
||||||
[
|
[
|
||||||
'mail',
|
'mail',
|
||||||
'pswd'
|
|
||||||
],
|
],
|
||||||
'required',
|
'required',
|
||||||
'message' => 'Заполните поле'
|
'message' => 'Заполните поле'
|
||||||
],
|
],
|
||||||
// Обязательные поля для регистрации
|
// Обязательные поля для аутентификации
|
||||||
[
|
[
|
||||||
[
|
[
|
||||||
'rept',
|
'pswd',
|
||||||
'pols'
|
|
||||||
],
|
],
|
||||||
'required',
|
'required',
|
||||||
'message' => 'Заполните поле',
|
'message' => 'Заполните поле',
|
||||||
'on' => self::SCENARIO_REGISTRATION
|
'on' => self::SCENARIO_AUTHENTICATION
|
||||||
],
|
],
|
||||||
|
// Обязательные поля для регистрации
|
||||||
|
// [
|
||||||
|
// [
|
||||||
|
// 'rept',
|
||||||
|
// 'pols'
|
||||||
|
// ],
|
||||||
|
// 'required',
|
||||||
|
// 'message' => 'Заполните поле',
|
||||||
|
// 'on' => self::SCENARIO_REGISTRATION
|
||||||
|
// ],
|
||||||
// Повтор пароля
|
// Повтор пароля
|
||||||
[
|
// [
|
||||||
'rept',
|
// 'rept',
|
||||||
'compare',
|
// 'compare',
|
||||||
'compareAttribute' => 'pswd',
|
// 'compareAttribute' => 'pswd',
|
||||||
'message' => "Пароли не совпадают",
|
// 'message' => "Пароли не совпадают",
|
||||||
'on' => self::SCENARIO_REGISTRATION,
|
// 'on' => self::SCENARIO_REGISTRATION,
|
||||||
],
|
// ],
|
||||||
// Принятие политики конфидециальности
|
// Принятие политики конфидециальности
|
||||||
[
|
// [
|
||||||
'pols',
|
// 'pols',
|
||||||
'compare',
|
// 'compare',
|
||||||
'compareValue' => 'on',
|
// 'compareValue' => 'on',
|
||||||
'message' => "Чтобы продолжить примите нашу политику конфидециальности",
|
// 'message' => "Чтобы продолжить примите нашу политику конфидециальности",
|
||||||
'on' => self::SCENARIO_REGISTRATION,
|
// 'on' => self::SCENARIO_REGISTRATION,
|
||||||
],
|
// ],
|
||||||
// Функция "Запомнить меня"
|
// Функция "Запомнить меня"
|
||||||
[
|
[
|
||||||
'auto',
|
'auto',
|
||||||
|
@ -180,15 +188,26 @@ class AccountForm extends Model
|
||||||
|
|
||||||
// Запись параметров
|
// Запись параметров
|
||||||
$this->account->mail = $this->mail;
|
$this->account->mail = $this->mail;
|
||||||
$this->account->pswd = yii::$app->security->generatePasswordHash($this->pswd);
|
// $this->account->pswd = yii::$app->security->generatePasswordHash(Account::passwordGenerate());
|
||||||
|
$this->account->pswd = $this->pswd = Account::passwordGenerate();
|
||||||
|
|
||||||
|
if (($account = Account::findByMail($this->mail)) || isset($account) && $account->vrfy !== true) {
|
||||||
|
// Аккаунт найден, но не подтверждён
|
||||||
|
|
||||||
|
// Удаление аккаунта (сейчас его создадим снова)
|
||||||
|
$account->delete();
|
||||||
|
}
|
||||||
|
|
||||||
// Регистрация
|
// Регистрация
|
||||||
if ($this->account->save()) {
|
if ($this->account->save()) {
|
||||||
// Успешно завершена регистрация
|
// Успешно завершена регистрация или обновлены данные не до конца зарегистрировавшегося пользователя
|
||||||
|
|
||||||
// Генерация индекса
|
// Генерация индекса
|
||||||
Account::generateIndexes([$this->account]);
|
Account::generateIndexes([$this->account]);
|
||||||
|
|
||||||
|
// Отправка письма для подтверждения почты
|
||||||
|
$this->account->sendMailVerify();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,10 +46,10 @@ class Dellin extends Document
|
||||||
/**
|
/**
|
||||||
* Поиск по идентификатору терминала
|
* Поиск по идентификатору терминала
|
||||||
*
|
*
|
||||||
* @param string $id Идентификатор терминала
|
* @param int $id Идентификатор терминала
|
||||||
* @param bool $terminal_data_only Запрос только данных терминала
|
* @param bool $terminal_data_only Запрос только данных терминала
|
||||||
*/
|
*/
|
||||||
public static function searchByTerminalId(string $id, bool $terminal_data_only = false): bool|static|array|null|ArangoDBDocument
|
public static function searchByTerminalId(int $id, bool $terminal_data_only = false): bool|static|array|null|ArangoDBDocument
|
||||||
{
|
{
|
||||||
if ($terminal_data_only) {
|
if ($terminal_data_only) {
|
||||||
return static::find()->foreach(['terminal' => self::collectionName() . '.data["terminals"]["terminal"]'])->where(['terminal["id"] == "' . $id . '"'])->select('terminal')->createCommand()->execute()->getAll()[0];
|
return static::find()->foreach(['terminal' => self::collectionName() . '.data["terminals"]["terminal"]'])->where(['terminal["id"] == "' . $id . '"'])->select('terminal')->createCommand()->execute()->getAll()[0];
|
||||||
|
|
|
@ -465,22 +465,58 @@ class Order extends Document implements DocumentInterface
|
||||||
// Доставка автоматическая
|
// Доставка автоматическая
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
// Инициализация данных геолокации
|
||||||
|
try {
|
||||||
|
$from = (int) $connection['account']['opts']['delivery_from_terminal'] ?? Settings::search()->delivery_from_default ?? 36;
|
||||||
|
} catch (Exception $e) {
|
||||||
|
$from = (int) Settings::search()->delivery_from_default ?? 36;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
$to = (int) yii::$app->user->identity->opts['delivery_to_terminal'] ?? 36;
|
||||||
|
} catch (Exception $e) {
|
||||||
|
$to = 36;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($buffer_connection = $connection['product']['bffr']["$from-$to"] ?? false) {
|
||||||
|
// Найдены данные доставки в буфере
|
||||||
|
|
||||||
|
if (time() < $buffer_connection['expires']) {
|
||||||
|
// Срок хранения не превышен, информация актуальна
|
||||||
|
|
||||||
|
// Запись в буфер вывода
|
||||||
|
$connection['delivery'] = $buffer_connection['data'];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Инициализация инстанции продукта в базе данных
|
||||||
|
$product = Product::searchByCatn($connection['product']['catn']);
|
||||||
|
|
||||||
// Инициализация доставки Dellin (автоматическая)
|
// Инициализация доставки Dellin (автоматическая)
|
||||||
$connection['delivery'] = Dellin::calcDeliveryAdvanced(
|
$product->bffr = ($product->bffr ?? []) + [
|
||||||
$connection['account']['opts']['delivery_from_terminal'],
|
"$from-$to" => [
|
||||||
yii::$app->user->identity->opts['delivery_to_terminal'],
|
'data' => $connection['delivery'] = Dellin::calcDeliveryAdvanced(
|
||||||
|
$from,
|
||||||
|
$to,
|
||||||
(int) ($connection['product']['wght'] ?? 0),
|
(int) ($connection['product']['wght'] ?? 0),
|
||||||
(int) ($connection['product']['dmns']['x'] ?? 0),
|
(int) ($connection['product']['dmns']['x'] ?? 0),
|
||||||
(int) ($connection['product']['dmns']['y'] ?? 0),
|
(int) ($connection['product']['dmns']['y'] ?? 0),
|
||||||
(int) ($connection['product']['dmns']['z'] ?? 0),
|
(int) ($connection['product']['dmns']['z'] ?? 0),
|
||||||
count($connection['order_edge_supply'])
|
count($connection['order_edge_supply'])
|
||||||
);
|
),
|
||||||
|
'expires' => time() + 86400
|
||||||
|
]
|
||||||
|
];
|
||||||
|
|
||||||
|
// Отправка в базу данных
|
||||||
|
$product->update();
|
||||||
|
}
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
$connection['delivery']['error'] = true;
|
$connection['delivery']['error'] = true;
|
||||||
|
|
||||||
var_dump($e->getMessage());
|
// var_dump($e->getMessage());
|
||||||
var_dump($e->getTrace());
|
// var_dump($e->getTrace());
|
||||||
var_dump($e->getFile()); die;
|
// var_dump($e->getFile());
|
||||||
|
// die;
|
||||||
|
|
||||||
// var_dump(json_decode($e->getMessage(), true)['errors']); die;
|
// var_dump(json_decode($e->getMessage(), true)['errors']); die;
|
||||||
}
|
}
|
||||||
|
@ -491,23 +527,59 @@ class Order extends Document implements DocumentInterface
|
||||||
// Доставка самолётом
|
// Доставка самолётом
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Инициализация доставки Dellin (самолётом)
|
// Инициализация данных геолокации
|
||||||
$connection['delivery'] = Dellin::calcDeliveryAdvanced(
|
try {
|
||||||
$connection['account']['opts']['delivery_from_terminal'],
|
$from = (int) $connection['account']['opts']['delivery_from_terminal'] ?? Settings::search()->delivery_from_default ?? 36;
|
||||||
yii::$app->user->identity->opts['delivery_to_terminal'],
|
} catch (Exception $e) {
|
||||||
|
$from = (int) Settings::search()->delivery_from_default ?? 36;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
$to = (int) yii::$app->user->identity->opts['delivery_to_terminal'] ?? 36;
|
||||||
|
} catch (Exception $e) {
|
||||||
|
$to = 36;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($buffer_connection = $connection['product']['bffr']["$from-$to-avia"] ?? false) {
|
||||||
|
// Найдены данные доставки в буфере
|
||||||
|
|
||||||
|
if (time() < $buffer_connection['expires']) {
|
||||||
|
// Срок хранения не превышен, информация актуальна
|
||||||
|
|
||||||
|
// Запись в буфер вывода
|
||||||
|
$connection['delivery'] = $buffer_connection['data'];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Инициализация инстанции продукта в базе данных
|
||||||
|
$product = Product::searchByCatn($connection['product']['catn']);
|
||||||
|
|
||||||
|
// Инициализация доставки Dellin (автоматическая)
|
||||||
|
$product->bffr = ($product->bffr ?? []) + [
|
||||||
|
"$from-$to-avia" => [
|
||||||
|
'data' => $connection['delivery'] = Dellin::calcDeliveryAdvanced(
|
||||||
|
$from,
|
||||||
|
$to,
|
||||||
(int) ($connection['product']['wght'] ?? 0),
|
(int) ($connection['product']['wght'] ?? 0),
|
||||||
(int) ($connection['product']['dmns']['x'] ?? 0),
|
(int) ($connection['product']['dmns']['x'] ?? 0),
|
||||||
(int) ($connection['product']['dmns']['y'] ?? 0),
|
(int) ($connection['product']['dmns']['y'] ?? 0),
|
||||||
(int) ($connection['product']['dmns']['z'] ?? 0),
|
(int) ($connection['product']['dmns']['z'] ?? 0),
|
||||||
count($connection['order_edge_supply']),
|
count($connection['order_edge_supply']),
|
||||||
avia: true
|
avia: true
|
||||||
);
|
),
|
||||||
|
'expires' => time() + 86400
|
||||||
|
]
|
||||||
|
];
|
||||||
|
|
||||||
|
// Отправка в базу данных
|
||||||
|
$product->update();
|
||||||
|
}
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
$connection['delivery']['error'] = true;
|
$connection['delivery']['error'] = true;
|
||||||
|
|
||||||
var_dump($e->getMessage());
|
// var_dump($e->getMessage());
|
||||||
var_dump($e->getTrace());
|
// var_dump($e->getTrace());
|
||||||
var_dump($e->getFile()); die;
|
// var_dump($e->getFile());
|
||||||
|
// die;
|
||||||
|
|
||||||
// var_dump(json_decode($e->getMessage(), true)['errors']); die;
|
// var_dump(json_decode($e->getMessage(), true)['errors']); die;
|
||||||
}
|
}
|
||||||
|
|
|
@ -82,7 +82,8 @@ class Product extends Document
|
||||||
'dmns',
|
'dmns',
|
||||||
'wght',
|
'wght',
|
||||||
'imgs',
|
'imgs',
|
||||||
'time'
|
'time',
|
||||||
|
'bffr',
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -103,6 +104,7 @@ class Product extends Document
|
||||||
'wght' => 'Вес (wght)',
|
'wght' => 'Вес (wght)',
|
||||||
'imgs' => 'Изображения (imgs)',
|
'imgs' => 'Изображения (imgs)',
|
||||||
'time' => 'Срок доставки (time)',
|
'time' => 'Срок доставки (time)',
|
||||||
|
'bffr' => 'Буфер',
|
||||||
'file_excel' => 'Документ (file_excel)',
|
'file_excel' => 'Документ (file_excel)',
|
||||||
'file_image' => 'Изображение (file_image)',
|
'file_image' => 'Изображение (file_image)',
|
||||||
'group' => 'Группа (group)'
|
'group' => 'Группа (group)'
|
||||||
|
|
|
@ -26,7 +26,8 @@ class Settings extends Document
|
||||||
parent::attributes(),
|
parent::attributes(),
|
||||||
[
|
[
|
||||||
'search_period',
|
'search_period',
|
||||||
'search_connect_keep'
|
'search_connect_keep',
|
||||||
|
'delivery_from_default'
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -40,7 +41,8 @@ class Settings extends Document
|
||||||
parent::attributeLabels(),
|
parent::attributeLabels(),
|
||||||
[
|
[
|
||||||
'search_period' => 'Поисковый период',
|
'search_period' => 'Поисковый период',
|
||||||
'search_connect_keep' => 'Режим удержания'
|
'search_connect_keep' => 'Режим удержания',
|
||||||
|
'delivery_from_default' => 'Место отправки поставки по умолчанию'
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -55,7 +57,8 @@ class Settings extends Document
|
||||||
[
|
[
|
||||||
[
|
[
|
||||||
[
|
[
|
||||||
'search_period'
|
'search_period',
|
||||||
|
'delivery_from_default'
|
||||||
],
|
],
|
||||||
'integer',
|
'integer',
|
||||||
'message' => '{attribute} должен хранить цифровое значение'
|
'message' => '{attribute} должен хранить цифровое значение'
|
||||||
|
@ -70,4 +73,14 @@ class Settings extends Document
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Найти активную запись с настройками
|
||||||
|
*
|
||||||
|
* @todo Доделать
|
||||||
|
*/
|
||||||
|
public static function search(): ?self
|
||||||
|
{
|
||||||
|
return static::findOne(['active' => true]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,8 @@ use yii;
|
||||||
use yii\base\Model;
|
use yii\base\Model;
|
||||||
|
|
||||||
use app\models\Dellin as DellinModel;
|
use app\models\Dellin as DellinModel;
|
||||||
|
use app\models\Product;
|
||||||
|
use app\models\Settings;
|
||||||
use GuzzleHttp\Client as Guzzle;
|
use GuzzleHttp\Client as Guzzle;
|
||||||
use GuzzleHttp\Exception\ClientException as GuzzleException;
|
use GuzzleHttp\Exception\ClientException as GuzzleException;
|
||||||
|
|
||||||
|
@ -54,15 +55,14 @@ class Dellin extends Model
|
||||||
// ])
|
// ])
|
||||||
// });
|
// });
|
||||||
// }
|
// }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Рассчет доставки (расширенный)
|
* Рассчет доставки (расширенный)
|
||||||
*
|
*
|
||||||
* Рассчет нескольких товаров идет через простое перемножение результатов доставки одного товара
|
* Рассчет нескольких товаров идет через простое перемножение результатов доставки одного товара
|
||||||
* В API всегда идет рассчет для одного товара, так было решено
|
* В API всегда идет рассчет для одного товара, так было решено
|
||||||
*
|
*
|
||||||
* @param string $from Идентификатор терминала Dellin
|
* @param int $from Идентификатор терминала Dellin
|
||||||
* @param string $to Идентификатор терминала Dellin
|
* @param int $to Идентификатор терминала Dellin
|
||||||
* @param int $weight Вес (г)
|
* @param int $weight Вес (г)
|
||||||
* @param int $x Ширина (cм)
|
* @param int $x Ширина (cм)
|
||||||
* @param int $y Высота (cм)
|
* @param int $y Высота (cм)
|
||||||
|
@ -74,8 +74,9 @@ class Dellin extends Model
|
||||||
* @todo Загружать помимо терминалов ещё и адреса, чтобы доделать доставку малогабаритных грузов
|
* @todo Загружать помимо терминалов ещё и адреса, чтобы доделать доставку малогабаритных грузов
|
||||||
* Разрабраться с параметрами 0,54м * 0,39м * 0,39м (0.082134м) и 0.1 куб метр в чем разница
|
* Разрабраться с параметрами 0,54м * 0,39м * 0,39м (0.082134м) и 0.1 куб метр в чем разница
|
||||||
*/
|
*/
|
||||||
public static function calcDeliveryAdvanced(string $from, string $to, int $weight, int $x, int $y, int $z, int $amount = 1, bool $avia = false): array
|
public static function calcDeliveryAdvanced(int $from, int $to, int $weight, int $x, int $y, int $z, int $amount = 1, bool $avia = false): array
|
||||||
{
|
{
|
||||||
|
|
||||||
return self::handle(function () use ($from, $to, $weight, $x, $y, $z, $amount, $avia) {
|
return self::handle(function () use ($from, $to, $weight, $x, $y, $z, $amount, $avia) {
|
||||||
// Всё готово к работе
|
// Всё готово к работе
|
||||||
|
|
||||||
|
@ -85,7 +86,7 @@ class Dellin extends Model
|
||||||
|
|
||||||
// Значения по умолчанию, если указан 0
|
// Значения по умолчанию, если указан 0
|
||||||
$x === 0 and $x = 25;
|
$x === 0 and $x = 25;
|
||||||
$y === 0 and $y = 55;
|
$y === 0 and $y = 50;
|
||||||
$z === 0 and $z = 25;
|
$z === 0 and $z = 25;
|
||||||
$weight === 0 and $weight = 300;
|
$weight === 0 and $weight = 300;
|
||||||
|
|
||||||
|
|
|
@ -72,12 +72,18 @@ use app\models\AccountForm;
|
||||||
|
|
||||||
<?php if ($registration ?? false) : ?>
|
<?php if ($registration ?? false) : ?>
|
||||||
<script defer>
|
<script defer>
|
||||||
document.addEventListener('DOMContentLoaded', function() {
|
let registration_start_macros = function() {
|
||||||
let form = document.getElementById('<?= $form_id ?>');
|
let form = document.getElementById('<?= $form_id ?>');
|
||||||
|
|
||||||
$(form).on('afterInit', function(e) {
|
$(form).on('afterInit', function(e) {
|
||||||
registration_start(form);
|
registration_start(form);
|
||||||
});
|
});
|
||||||
}, false);
|
};
|
||||||
|
|
||||||
|
if (document.readyState === "complete") {
|
||||||
|
registration_start_macros();
|
||||||
|
} else {
|
||||||
|
document.addEventListener('DOMContentLoaded', registration_start_macros(), false);
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
<?php endif ?>
|
<?php endif ?>
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
<div class="container d-flex flex-column">
|
||||||
|
<div class="my-auto">
|
||||||
|
<div class="col-md-10 col-lg-8 mx-auto p-5 alert alert_white d-flex flex-column">
|
||||||
|
<h4 class="text-center"><b>Подтвердите аккаунт</b></h4>
|
||||||
|
<p class="text-center mb-5">Мы выслали вам письмо с паролем и ссылкой на активацию</p>
|
||||||
|
|
||||||
|
<a class="btn button_blue button_clean mx-auto" type="button" onclick="return verify_resend();">Повторить</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script src="/js/verify.js" defer></script>
|
|
@ -95,7 +95,7 @@ use DateTime;
|
||||||
<input id="cart_list_amnt_{$connection['supply']['catn']}" class="form-control text-center" type="text" value="{$connection['amount']}" onchange="return cart_list_amount_update('{$connection['supply']['catn']}', this)" aria-invalid="false">
|
<input id="cart_list_amnt_{$connection['supply']['catn']}" class="form-control text-center" type="text" value="{$connection['amount']}" onchange="return cart_list_amount_update('{$connection['supply']['catn']}', this)" aria-invalid="false">
|
||||||
</div>
|
</div>
|
||||||
<div class="col-2 my-auto text-right">
|
<div class="col-2 my-auto text-right">
|
||||||
<p>$delivery_icon $delivery дн</p>
|
<p title="Ориентировочно">$delivery_icon $delivery дн</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-2 my-auto mr-3 text-right">
|
<div class="col-2 my-auto mr-3 text-right">
|
||||||
$cost
|
$cost
|
||||||
|
@ -134,7 +134,7 @@ use DateTime;
|
||||||
<span id="cart_cost">0</span>
|
<span id="cart_cost">0</span>
|
||||||
руб
|
руб
|
||||||
</p>
|
</p>
|
||||||
<a class="btn button_clean button_blue" title="Оформить заказ" href="/pay" role="button" onclick="return cart_pay();">
|
<a class="btn button_clean button_blue" title="Оформить заказ" href="/orders" role="button" onclick="return cart_request();">
|
||||||
Оформить заказ
|
Оформить заказ
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -143,3 +143,12 @@ use DateTime;
|
||||||
|
|
||||||
<script src="/js/textarea.js" defer></script>
|
<script src="/js/textarea.js" defer></script>
|
||||||
<script src="/js/cart.js" defer></script>
|
<script src="/js/cart.js" defer></script>
|
||||||
|
<script defer>
|
||||||
|
if (document.readyState === "complete") {
|
||||||
|
cart_cost_calculate();
|
||||||
|
} else {
|
||||||
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
|
cart_cost_calculate();
|
||||||
|
}, false);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
|
@ -2,16 +2,16 @@
|
||||||
|
|
||||||
use yii\helpers\Html;
|
use yii\helpers\Html;
|
||||||
|
|
||||||
$this->title = $name;
|
$this->title = $title;
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<div id="page_error" class="container d-flex flex-column">
|
<div id="page_error" class="container d-flex flex-column">
|
||||||
<div class="my-auto">
|
<div class="my-auto">
|
||||||
<h1 class="text-center mb-4 gilroy"><b><?= Html::encode($this->title) ?></b></h1>
|
<h1 class="text-center mb-4 gilroy"><b><?= Html::encode($title) ?></b></h1>
|
||||||
|
|
||||||
<div class="col-md-8 col-lg-6 mx-auto alert alert_white">
|
<div class="col-md-10 col-lg-8 mx-auto p-5 alert alert_white">
|
||||||
<?= nl2br(Html::encode($message)) ?>
|
<?= nl2br(Html::encode($description)) ?>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
|
@ -0,0 +1,17 @@
|
||||||
|
<div style="padding: 0 14%;">
|
||||||
|
<div style="background: #fff; padding: 25px 0;">
|
||||||
|
<a title="SkillParts" href="https://skillparts.ru">
|
||||||
|
<img style="width: 150px;" src="https://skillparts.ru/img/logos/skillparts.svg" alt="SkillParts">
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div style="background: #f0eefb; padding: 40px; margin: 30px 0;">
|
||||||
|
<h3 style="text-align: center; margin-bottom: 30px;"><b>Подтвердите регистрацию</b></h3>
|
||||||
|
<p style="margin: 0 40px; margin-bottom: 8px;"><b>Ваш пароль: </b>"<?= $password ?? 'Ошибка' ?>"</p>
|
||||||
|
<small style="display: block; margin: 0 40px; margin-bottom: 40px;">Нажимая на кнопку ниже вы соглашаетесь с <a href="https://skillparts.ru/policy">политикой конфиденциальности</a></small>
|
||||||
|
<a style="display: block; text-align: center;" href="https://skillparts.ru/verify/<?= $vrfy ?? '' ?>">Принять и подтвердить</a>
|
||||||
|
</div>
|
||||||
|
<div style="background: #fff;">
|
||||||
|
<small>Вы получили это сообщение потому, что на ваш почтовый адрес была совершена регистрация</small>
|
||||||
|
<small>Если это были не вы, проверьте безопасность ваших аккаунтов и свяжитесь с администрацией</small>
|
||||||
|
</div>
|
||||||
|
</div>
|
|
@ -4,7 +4,7 @@
|
||||||
<article class="p-5 rounded overflow-hidden">
|
<article class="p-5 rounded overflow-hidden">
|
||||||
<div class="row mb-5">
|
<div class="row mb-5">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<h3 class="mb-5 text-center"><b>Политика конфидециальности</b></h3>
|
<h3 class="mb-5 text-center"><b>Политика конфиденциальности</b></h3>
|
||||||
|
|
||||||
В данной Политике обработки персональных данных (далее – Политика) мы информируем Вас о порядке обработки Ваших персональных данных при использовании нашего веб-сайта https://skillparts.ru/ (далее - «Сайт») в целях исполнения заключенных договоров.
|
В данной Политике обработки персональных данных (далее – Политика) мы информируем Вас о порядке обработки Ваших персональных данных при использовании нашего веб-сайта https://skillparts.ru/ (далее - «Сайт») в целях исполнения заключенных договоров.
|
||||||
</br></br>
|
</br></br>
|
||||||
|
|
|
@ -13,12 +13,12 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
color: #0b3397;
|
color: #123EAB;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
a:hover {
|
a:hover {
|
||||||
color: #001752;
|
color: #09246a;
|
||||||
}
|
}
|
||||||
|
|
||||||
p {
|
p {
|
||||||
|
|
|
@ -142,86 +142,96 @@ function registration_start(form, type) {
|
||||||
// Удаление кнопок аутентификации
|
// Удаление кнопок аутентификации
|
||||||
form.children[4].remove();
|
form.children[4].remove();
|
||||||
|
|
||||||
// Инициализация поля ввода пароля
|
// Инициализация поля ввода почты
|
||||||
let password = form.children[3];
|
let mail = form.children[2];
|
||||||
|
|
||||||
// Изменение стиля
|
// // Инициализация поля ввода пароля
|
||||||
password.classList.add('mb-2');
|
// let password = form.children[3];
|
||||||
|
|
||||||
// Инициализация кнопки регистрации
|
// Инициализация кнопки регистрации
|
||||||
let registration = form.children[4];
|
let registration = form.children[4];
|
||||||
|
|
||||||
// Изменение размера
|
// Изменение отступа поля
|
||||||
|
mail.classList.add('mb-4');
|
||||||
|
|
||||||
|
// // Изменение стиля
|
||||||
|
// password.classList.add('mb-2');
|
||||||
|
|
||||||
|
// Удаление поля ввода пароля
|
||||||
|
form.children[3].remove();
|
||||||
|
|
||||||
|
// Изменение размера кнопки регистрации
|
||||||
registration.classList.remove('btn-sm');
|
registration.classList.remove('btn-sm');
|
||||||
registration.classList.add('btn');
|
registration.classList.add('btn');
|
||||||
|
|
||||||
|
|
||||||
// Изменение вызываемой функции
|
// Изменение вызываемой функции
|
||||||
registration.setAttribute('onclick', 'return registration_end(this.parentElement);');
|
registration.setAttribute('onclick', 'return registration_end(this.parentElement);');
|
||||||
|
|
||||||
// Инициализация оболочки поля повтора пароля
|
// // Инициализация оболочки поля повтора пароля
|
||||||
let password_repeat_wrap = document.createElement('div');
|
// let password_repeat_wrap = document.createElement('div');
|
||||||
password_repeat_wrap.setAttribute('class', 'mb-3 field-accountform-rept required');
|
// password_repeat_wrap.setAttribute('class', 'mb-3 field-accountform-rept required');
|
||||||
|
|
||||||
// Инициализация поля повтора пароля
|
// // Инициализация поля повтора пароля
|
||||||
let password_repeat = document.createElement('input');
|
// let password_repeat = document.createElement('input');
|
||||||
password_repeat.setAttribute('id', 'accountform-rept' + postfix);
|
// password_repeat.setAttribute('id', 'accountform-rept' + postfix);
|
||||||
password_repeat.classList.add('form-control');
|
// password_repeat.classList.add('form-control');
|
||||||
password_repeat.setAttribute('type', 'password');
|
// password_repeat.setAttribute('type', 'password');
|
||||||
password_repeat.setAttribute('name', 'AccountForm[rept]');
|
// password_repeat.setAttribute('name', 'AccountForm[rept]');
|
||||||
password_repeat.setAttribute('placeholder', 'Повтор пароля');
|
// password_repeat.setAttribute('placeholder', 'Повтор пароля');
|
||||||
password_repeat.setAttribute('aria-required', 'true');
|
// password_repeat.setAttribute('aria-required', 'true');
|
||||||
password_repeat.setAttribute('aria-invalid', 'true');
|
// password_repeat.setAttribute('aria-invalid', 'true');
|
||||||
|
|
||||||
// Инициализация элемента с текстом ошибок поля повтора пароля
|
// // Инициализация элемента с текстом ошибок поля повтора пароля
|
||||||
let password_repeat_errors = document.createElement('p');
|
// let password_repeat_errors = document.createElement('p');
|
||||||
password_repeat_errors.setAttribute('class', 'help-block help-block-error small');
|
// password_repeat_errors.setAttribute('class', 'help-block help-block-error small');
|
||||||
|
|
||||||
// Инициализация оболочки элемента с подтверждением политики персональных данных
|
// // Инициализация оболочки элемента с подтверждением политики персональных данных
|
||||||
let private_policy_wrap = document.createElement('div');
|
// let private_policy_wrap = document.createElement('div');
|
||||||
private_policy_wrap.setAttribute('class', 'mb-3 field-accountform-pols required');
|
// private_policy_wrap.setAttribute('class', 'mb-3 field-accountform-pols required');
|
||||||
|
|
||||||
// Инициализация оболочки для класса checkbox для элемента с подтверждением политики персональных данных
|
// // Инициализация оболочки для класса checkbox для элемента с подтверждением политики персональных данных
|
||||||
let private_policy_checkbox = document.createElement('div');
|
// let private_policy_checkbox = document.createElement('div');
|
||||||
private_policy_checkbox.classList.add('checkbox');
|
// private_policy_checkbox.classList.add('checkbox');
|
||||||
private_policy_checkbox.classList.add('text-center');
|
// private_policy_checkbox.classList.add('text-center');
|
||||||
|
|
||||||
// Инициализация оболочки для класса label для элемента с подтверждением политики персональных данных
|
// // Инициализация оболочки для класса label для элемента с подтверждением политики персональных данных
|
||||||
let private_policy_label = document.createElement('label');
|
// let private_policy_label = document.createElement('label');
|
||||||
private_policy_label.setAttribute('for', 'accountform-pols');
|
// private_policy_label.setAttribute('for', 'accountform-pols');
|
||||||
|
|
||||||
// Инициализация скрытого элемента с подтверждением политики персональных данных
|
// // Инициализация скрытого элемента с подтверждением политики персональных данных
|
||||||
let private_policy_hidden = document.createElement('input');
|
// let private_policy_hidden = document.createElement('input');
|
||||||
private_policy_hidden.setAttribute('type', 'hidden');
|
// private_policy_hidden.setAttribute('type', 'hidden');
|
||||||
private_policy_hidden.setAttribute('name', 'AccountForm[pols]');
|
// private_policy_hidden.setAttribute('name', 'AccountForm[pols]');
|
||||||
private_policy_hidden.setAttribute('value', '0');
|
// private_policy_hidden.setAttribute('value', '0');
|
||||||
|
|
||||||
// Инициализация элемента с подтверждением политики персональных данных
|
// // Инициализация элемента с подтверждением политики персональных данных
|
||||||
let private_policy = document.createElement('input');
|
// let private_policy = document.createElement('input');
|
||||||
private_policy.setAttribute('id', 'accountform-pols' + postfix);
|
// private_policy.setAttribute('id', 'accountform-pols' + postfix);
|
||||||
private_policy.setAttribute('type', 'checkbox');
|
// private_policy.setAttribute('type', 'checkbox');
|
||||||
private_policy.setAttribute('name', 'AccountForm[pols]');
|
// private_policy.setAttribute('name', 'AccountForm[pols]');
|
||||||
private_policy.setAttribute('placeholder', 'Политика конфиденциальности');
|
// private_policy.setAttribute('placeholder', 'Политика конфиденциальности');
|
||||||
|
|
||||||
// Инициализация оболочки элемента с текстом элемента с подтверждением политики персональных данных
|
// // Инициализация оболочки элемента с текстом элемента с подтверждением политики персональных данных
|
||||||
let private_policy_text_wrap = document.createElement('small');
|
// let private_policy_text_wrap = document.createElement('small');
|
||||||
private_policy_text_wrap.setAttribute('class', 'ml-2');
|
// private_policy_text_wrap.setAttribute('class', 'ml-2');
|
||||||
|
|
||||||
// Инициализация элемента с текстом элемента с подтверждением политики персональных данных
|
// // Инициализация элемента с текстом элемента с подтверждением политики персональных данных
|
||||||
let private_policy_text = document.createElement('a');
|
// let private_policy_text = document.createElement('a');
|
||||||
private_policy_text.setAttribute('href', '/policy');
|
// private_policy_text.setAttribute('href', '/policy');
|
||||||
private_policy_text.innerText = 'Политика';
|
// private_policy_text.innerText = 'Политика';
|
||||||
|
|
||||||
// Запись в документ
|
// // Запись в документ
|
||||||
form.insertBefore(password_repeat_wrap, registration);
|
// form.insertBefore(password_repeat_wrap, registration);
|
||||||
password_repeat_wrap.appendChild(password_repeat);
|
// password_repeat_wrap.appendChild(password_repeat);
|
||||||
password_repeat_wrap.appendChild(password_repeat_errors);
|
// password_repeat_wrap.appendChild(password_repeat_errors);
|
||||||
form.insertBefore(private_policy_wrap, registration);
|
// form.insertBefore(private_policy_wrap, registration);
|
||||||
private_policy_wrap.appendChild(private_policy_checkbox);
|
// private_policy_wrap.appendChild(private_policy_checkbox);
|
||||||
private_policy_checkbox.appendChild(private_policy_label);
|
// private_policy_checkbox.appendChild(private_policy_label);
|
||||||
private_policy_label.appendChild(private_policy);
|
// private_policy_label.appendChild(private_policy);
|
||||||
private_policy_label.appendChild(private_policy_text_wrap);
|
// private_policy_label.appendChild(private_policy_text_wrap);
|
||||||
private_policy_text_wrap.appendChild(private_policy_text);
|
// private_policy_text_wrap.appendChild(private_policy_text);
|
||||||
private_policy_text_wrap.appendChild(document.createTextNode(' конфиденциальности'));
|
// private_policy_text_wrap.appendChild(document.createTextNode(' конфиденциальности'));
|
||||||
|
|
||||||
// Инициализация заголовка
|
// Инициализация заголовка
|
||||||
let title = form.children[1];
|
let title = form.children[1];
|
||||||
|
|
|
@ -42,9 +42,9 @@ function cart_delete() {
|
||||||
/**
|
/**
|
||||||
* Сформировать заказ
|
* Сформировать заказ
|
||||||
*/
|
*/
|
||||||
function cart_pay() {
|
function cart_request() {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: '/order/pay',
|
url: '/order/request',
|
||||||
type: 'post',
|
type: 'post',
|
||||||
dataType: 'json',
|
dataType: 'json',
|
||||||
data: {
|
data: {
|
||||||
|
@ -298,8 +298,6 @@ function cart_list_comment_save(catn, element) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
cart_cost_calculate();
|
|
||||||
|
|
||||||
function cart_response(data, status) {
|
function cart_response(data, status) {
|
||||||
// Обработка ответов
|
// Обработка ответов
|
||||||
|
|
||||||
|
|
|
@ -2,8 +2,8 @@ function reinitialization(target) {
|
||||||
// Уничтожает все внешние файлы загруженные внутри блока с переданным ID и загружает их в <head> и <body>
|
// Уничтожает все внешние файлы загруженные внутри блока с переданным ID и загружает их в <head> и <body>
|
||||||
|
|
||||||
if (target !== undefined) {
|
if (target !== undefined) {
|
||||||
links = target.getElementsByTagName('link');
|
let links = target.getElementsByTagName('link');
|
||||||
scripts = target.getElementsByTagName('script');
|
let scripts = target.getElementsByTagName('script');
|
||||||
|
|
||||||
// Запись CSS
|
// Запись CSS
|
||||||
for (link of links) {
|
for (link of links) {
|
||||||
|
@ -16,10 +16,15 @@ function reinitialization(target) {
|
||||||
|
|
||||||
// Запись JS
|
// Запись JS
|
||||||
for (script of scripts) {
|
for (script of scripts) {
|
||||||
|
if (script.getAttribute('src') !== null) {
|
||||||
new_script = document.createElement("script");
|
new_script = document.createElement("script");
|
||||||
new_script.src = script.src;
|
new_script.src = script.src;
|
||||||
document.getElementsByTagName("body")[0].appendChild(new_script);
|
document.getElementsByTagName("body")[0].appendChild(new_script);
|
||||||
script.remove();
|
} else {
|
||||||
|
eval(script.innerText);
|
||||||
|
}
|
||||||
|
|
||||||
|
// script.remove(); По каким-то причинам не работает, надо бы доделать
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -0,0 +1,59 @@
|
||||||
|
/**
|
||||||
|
* Записать в корзину (создать корзину, если не существует)
|
||||||
|
*/
|
||||||
|
function verify_resend() {
|
||||||
|
// Инициализация
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
url: '/verify/send',
|
||||||
|
type: 'post',
|
||||||
|
dataType: 'json',
|
||||||
|
success: verify_response_success,
|
||||||
|
error: verify_response_error
|
||||||
|
});
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function verify_response(data, status) {
|
||||||
|
// Обработка ответов
|
||||||
|
|
||||||
|
// Основной блок
|
||||||
|
if (data.main !== undefined) {
|
||||||
|
main = document.getElementsByTagName('main')[0];
|
||||||
|
|
||||||
|
// Обновление документа
|
||||||
|
main.innerHTML = data.main;
|
||||||
|
|
||||||
|
// Реинициализация
|
||||||
|
reinitialization(main);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Перенаправление
|
||||||
|
if (data.redirect !== undefined) {
|
||||||
|
// Перенаправление
|
||||||
|
history.pushState({}, document.title, data.redirect);
|
||||||
|
}
|
||||||
|
|
||||||
|
// CSRF-токен
|
||||||
|
if (data._csrf !== undefined) {
|
||||||
|
// Обновление документа
|
||||||
|
$('meta[name=csrf-token]').prop("content", data._csrf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function verify_response_success(data, status) {
|
||||||
|
// Обработка ответов от удавшихся запросов
|
||||||
|
|
||||||
|
verify_response(data, status);
|
||||||
|
}
|
||||||
|
|
||||||
|
function verify_response_error(data, status) {
|
||||||
|
// Обработка ответов от неудавшихся запросов
|
||||||
|
|
||||||
|
// Инициализвация
|
||||||
|
data = data.responseJSON;
|
||||||
|
|
||||||
|
verify_response(data, status);
|
||||||
|
}
|
Reference in New Issue