Работа над сайтом 16

This commit is contained in:
Arsen Mirzaev Tatyano-Muradovich 2021-07-26 05:27:41 +10:00
parent 177de6b3ef
commit 5f3623a258
18 changed files with 443 additions and 181 deletions

View File

@ -38,6 +38,7 @@ class AppAsset extends AssetBundle
'https://cdn.jsdelivr.net/bxslider/4.1.1/jquery.bxslider.min.js', 'https://cdn.jsdelivr.net/bxslider/4.1.1/jquery.bxslider.min.js',
'https://unpkg.com/cookielib/src/cookie.min.js', 'https://unpkg.com/cookielib/src/cookie.min.js',
'https://api-maps.yandex.ru/2.0-stable/?load=package.standard&lang=ru-RU', 'https://api-maps.yandex.ru/2.0-stable/?load=package.standard&lang=ru-RU',
'js/moment.min.js',
'js/menu.js', 'js/menu.js',
'js/main.js', 'js/main.js',
'js/account.js', 'js/account.js',

View File

@ -39,8 +39,16 @@ class AuthenticationController extends Controller
// Инициализация // Инициализация
$model = new AccountForm(yii::$app->request->post('AccountForm')); $model = new AccountForm(yii::$app->request->post('AccountForm'));
$type = yii::$app->request->post('type') ?? yii::$app->request->get('type'); $type = yii::$app->request->post('type') ?? yii::$app->request->get('type');
$target = yii::$app->request->post('target') ?? yii::$app->request->get('target');
$model->scenario = $model::SCENARIO_AUTHENTICATION; $model->scenario = $model::SCENARIO_AUTHENTICATION;
// Фильтрация
$target = match ($target) {
'menu' => 'menu',
'main' => 'main',
default => 'main'
};
if (yii::$app->request->isPost) { if (yii::$app->request->isPost) {
// AJAX-POST-запрос // AJAX-POST-запрос
@ -48,13 +56,13 @@ class AuthenticationController extends Controller
yii::$app->response->format = Response::FORMAT_JSON; yii::$app->response->format = Response::FORMAT_JSON;
// Валидация формы // Валидация формы
if (!empty($errors = ActiveForm::validate($model))) { // if (!empty($errors = ActiveForm::validate($model))) {
// Настройка кода ответа // // Настройка кода ответа
yii::$app->response->statusCode = 401; // yii::$app->response->statusCode = 401;
return $errors; // return $errors;
}; // };
if (!yii::$app->user->isGuest || $model->authentication()) { if (!yii::$app->user->isGuest || $model->authentication()) {
// Аккаунт аутентифицирован // Аккаунт аутентифицирован
@ -69,7 +77,7 @@ class AuthenticationController extends Controller
// Запись ответа // Запись ответа
$return = [ $return = [
'menu' => $this->renderPartial('/account/panel/authenticated', compact( $target => $this->renderPartial('/account/panel/authenticated', compact(
'notifications_button', 'notifications_button',
'notifications_panel', 'notifications_panel',
'notifications_panel_full' 'notifications_panel_full'
@ -123,7 +131,7 @@ class AuthenticationController extends Controller
yii::$app->response->statusCode = 400; yii::$app->response->statusCode = 400;
return [ return [
'main' => $this->renderPartial('/account/index', compact('model')), $target => $this->renderPartial('/account/index', compact('model')),
'redirect' => '/authentication', 'redirect' => '/authentication',
'_csrf' => yii::$app->request->getCsrfToken() '_csrf' => yii::$app->request->getCsrfToken()
]; ];

View File

@ -30,7 +30,17 @@ class InvoiceController extends Controller
// Инициализация файла // Инициализация файла
$file = YII_PATH_PUBLIC . '/../assets/invoices/' . $order . '/invoice.xlsx'; $file = YII_PATH_PUBLIC . '/../assets/invoices/' . $order . '/invoice.xlsx';
if (file_exists($file)) return $this->response->sendFile($file); if (file_exists($file)) {
else yii::$app->response->statusCode = 500; // Удалось найти файл
return $this->response->sendFile($file);
} else {
// Не удалось найти файл
// Запись кода ответа
yii::$app->response->statusCode = 500;
return yii::$app->response->redirect('/orders');
}
} }
} }

View File

@ -18,11 +18,13 @@ use app\models\AccountEdgeOrder;
use app\models\connection\Dellin; use app\models\connection\Dellin;
use app\models\Invoice; use app\models\Invoice;
use app\models\Notification; use app\models\Notification;
use app\models\Settings;
use app\models\SupplyEdgeProduct; use app\models\SupplyEdgeProduct;
use Codeception\PHPUnit\ResultPrinter\HTML; use Codeception\PHPUnit\ResultPrinter\HTML;
use DateTime; use DateTime;
use Exception; use Exception;
use Throwable;
class OrderController extends Controller class OrderController extends Controller
{ {
@ -38,7 +40,6 @@ class OrderController extends Controller
'actions' => [ 'actions' => [
'index', 'index',
'accept', 'accept',
'read',
'write', 'write',
'delete', 'delete',
'amount-update', 'amount-update',
@ -62,13 +63,23 @@ class OrderController extends Controller
public function accessDenied() public function accessDenied()
{ {
// Инициализация // Инициализация cookie
$cookies = yii::$app->response->cookies; $cookies = yii::$app->response->cookies;
// Инициализация данных из HTTP-заголовка referrer
$referrer = trim(parse_url(yii::$app->request->referrer, PHP_URL_PATH) . '?' . parse_url(yii::$app->request->referrer, PHP_URL_QUERY), '/');
$redirect = match(yii::$app->request->pathInfo) {
'order/write' => $referrer,
'order/delete', 'order/amount-update', 'order/request' => 'cart',
'order/accept', 'order/supply-read', 'order/supply-write-stts', 'order/supply-edit-time', 'order/supply-edit-cost', 'order/supply-edit-comm' => 'orders',
default => yii::$app->request->pathInfo
};
// Запись cookie с редиректом, который выполнится после авторизации // Запись cookie с редиректом, который выполнится после авторизации
$cookies->add(new Cookie([ $cookies->add(new Cookie([
'name' => 'redirect', 'name' => 'redirect',
'value' => yii::$app->request->pathInfo 'value' => $redirect
])); ]));
if (yii::$app->request->isPost) { if (yii::$app->request->isPost) {
@ -90,11 +101,100 @@ class OrderController extends Controller
} }
} }
public function actionIndex(string $type = 'all') public function actionIndex(string $filter = 'all')
{ {
// Инициализация // Инициализация cookie
$orders = Order::search(type: $type, limit: 10, page: 1, select: '{account_edge_order, order}', supplies: true); $cookies = yii::$app->response->cookies;
// Инициализация фильтра по типу
if ($filter === 'last') {
// Запрошено использование прошлых данных о фильтрации по типу
// Чтение сохраненных cookie с данными прошлой фильтрации по типу
$filter = $cookies->get('filter');
} else {
// Запрошена сортировка
// Запись cookie с данными текущей фильтрации по типу
$cookies->add(new Cookie([
'name' => 'filter',
'value' => $filter
]));
}
// Инициализация входных данных
$from = yii::$app->request->post('from') ?? yii::$app->request->get('from');
$to = yii::$app->request->post('to') ?? yii::$app->request->get('to');
// Инициализация фильтра по периоду
if (!empty($from) && !empty($to) && filter_var($from, FILTER_VALIDATE_INT) && filter_var($to, FILTER_VALIDATE_INT)) {
// Данные фильтра по периоду переданы и представляют собой целые числа (подразумевается unixtime)
// Конвертация типов
$from = (int) $from;
$to = (int) $to;
// Запись cookie с данными начала периода
$cookies->add(new Cookie([
'name' => 'from',
'value' => $from
]));
// Запись cookie с данными окончания периода
$cookies->add(new Cookie([
'name' => 'to',
'value' => $to
]));
} else {
// Некоректные данные или их отсутствие
// Чтение сохраненных cookie с данными прошлой фильтрации по периоду (начало)
$from = $cookies->get('from');
// Чтение сохраненных cookie с данными прошлой фильтрации по периоду (конец)
$to = $cookies->get('to');
if (empty($from) || empty($to) || filter_var($from, FILTER_VALIDATE_INT) || filter_var($to, FILTER_VALIDATE_INT)) {
// Каких-то cookie не оказалось, либо данные в них не подходящие, либо это первый запрос, но без фильтрации по периоду
// Реинициализация на стандартные параметры (неделя)
$from = time() - 604800;
$to = time();
} else {
// Данные в cookie найдены и подходят для выполнения
// Конвертация типов
$from = (int) $from;
$to = (int) $to;
}
}
// Инициализация заказов
$orders = Order::search(
type: $filter,
limit: 10,
page: 1,
select: '{account_edge_order, order}',
supplies: true,
from: $from,
to: $to
);
if (
!yii::$app->user->isGuest
&& yii::$app->user->identity->type === 'administrator'
|| yii::$app->user->identity->type === 'moderator'
) {
// Пользователь имеет доступ
// Инициализация заказов для модератора
$moderator_orders = self::genOrdersForModeration(); $moderator_orders = self::genOrdersForModeration();
} else {
// Пользователь не имеет доступ
// Инициализация заглушки
$moderator_orders = null;
}
if (yii::$app->request->isPost) { if (yii::$app->request->isPost) {
// POST-запрос // POST-запрос
@ -102,8 +202,12 @@ class OrderController extends Controller
// Настройка // Настройка
yii::$app->response->format = Response::FORMAT_JSON; yii::$app->response->format = Response::FORMAT_JSON;
// Конвертация из UNIXTIME в формат поддерживаемый календарём по спецификации HTML
$from = DateTime::createFromFormat('U', (string) $from)->format('Y-m-d');
$to = DateTime::createFromFormat('U', (string) $to)->format('Y-m-d');
return [ return [
'main' => $this->renderPartial('/orders/index', compact('orders', 'moderator_orders')), 'main' => $this->renderPartial('/orders/index', compact('orders', 'moderator_orders', 'from', 'to')),
'title' => 'Заказы', 'title' => 'Заказы',
'redirect' => '/orders', 'redirect' => '/orders',
'_csrf' => yii::$app->request->getCsrfToken() '_csrf' => yii::$app->request->getCsrfToken()
@ -382,6 +486,9 @@ class OrderController extends Controller
if ($edge->update()) { if ($edge->update()) {
// Удалось сохранить изменения // Удалось сохранить изменения
// Запись в журнал
$model->journal('requested');
// Инициализация буфера поставок // Инициализация буфера поставок
$supplies = []; $supplies = [];
@ -412,31 +519,11 @@ class OrderController extends Controller
] ]
])); ]));
// Запись в журнал
$model->journal('requested');
// Отправка уведомлений модераторам // Отправка уведомлений модераторам
Notification::_write($this->renderPartial('/notification/system/orders/new', ['id' => $edge->_key]), true, '@auth', Notification::TYPE_MODERATOR_ORDER_NEW); Notification::_write($this->renderPartial('/notification/system/orders/new', ['id' => $edge->_key]), true, '@auth', Notification::TYPE_MODERATOR_ORDER_NEW);
} }
// Инициализация return $this->actionIndex();
$orders = Order::search(type: 'all', limit: 10, page: 1, select: '{account_edge_order, order}', supplies: true);
$moderator_orders = self::genOrdersForModeration();
if (yii::$app->request->isPost) {
// POST-запрос
yii::$app->response->format = Response::FORMAT_JSON;
return [
'main' => $this->renderPartial('/orders/index', compact('orders', 'moderator_orders')),
'title' => 'Заказы',
'redirect' => '/orders',
'_csrf' => yii::$app->request->getCsrfToken()
];
}
return $this->render('/orders/index', compact('orders', 'moderator_orders'));
} }
/** /**
@ -486,10 +573,23 @@ class OrderController extends Controller
$product = Product::searchBySupplyId($order_edge_supply->_to); $product = Product::searchBySupplyId($order_edge_supply->_to);
try { try {
// Инициализация данных геолокации
try {
$from = (int) $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;
}
// Инициализация доставки // Инициализация доставки
$delivery = Dellin::calcDeliveryAdvanced( $delivery = Dellin::calcDeliveryAdvanced(
$account['opts']['delivery_from_terminal'], $from,
yii::$app->user->identity->opts['delivery_to_terminal'], $to,
(int) ($product['wght'] ?? 0), (int) ($product['wght'] ?? 0),
(int) ($product['dmns']['x'] ?? 0), (int) ($product['dmns']['x'] ?? 0),
(int) ($product['dmns']['y'] ?? 0), (int) ($product['dmns']['y'] ?? 0),
@ -497,13 +597,30 @@ class OrderController extends Controller
avia: $order_edge_supply->dlvr['type'] === 'avia' avia: $order_edge_supply->dlvr['type'] === 'avia'
); );
// Рассчет времени // Инициализация даты отправки
try { try {
// Взять данные из "arrivalToOspSender" (Дата прибытия на терминал-отправитель)
$delivery_send_date = DateTime::createFromFormat('Y-m-d', $delivery['orderDates']['arrivalToOspSender'])->getTimestamp();
} catch (Throwable $e) {
// Взять данные из "pickup" (Дата передачи груза на адресе отправителя)
$delivery_send_date = DateTime::createFromFormat('Y-m-d', $delivery['orderDates']['pickup'])->getTimestamp();
}
// Инициализация времени доставки
try {
// Доставка по воздуху (подразумевается), данные из "giveoutFromOspReceiver" (Дата и время, с которого груз готов к выдаче на терминале)
$delivery_converted = DateTime::createFromFormat('Y-m-d H:i:s', $delivery['orderDates']['giveoutFromOspReceiver'])->getTimestamp(); $delivery_converted = DateTime::createFromFormat('Y-m-d H:i:s', $delivery['orderDates']['giveoutFromOspReceiver'])->getTimestamp();
} catch (Exception $e) { } catch (Throwable $e) {
// Автоматическая доставка (подразумевается), данные из "arrivalToOspReceiver" (Дата прибытия натерминал-получатель)
$delivery_converted = DateTime::createFromFormat('Y-m-d', $delivery['orderDates']['arrivalToOspReceiver'])->getTimestamp(); $delivery_converted = DateTime::createFromFormat('Y-m-d', $delivery['orderDates']['arrivalToOspReceiver'])->getTimestamp();
} }
$delivery = ceil(($delivery_converted - time()) / 60 / 60 / 24) + 1;
// Рассчет времени доставки
$delivery = ceil(($delivery_converted - ($delivery_send_date ?? 0)) / 60 / 60 / 24) + 1;
} catch (Exception $e) { } catch (Exception $e) {
// var_dump($e->getMessage()); // var_dump($e->getMessage());
// var_dump($e->getTrace()); // var_dump($e->getTrace());

View File

@ -115,6 +115,7 @@ class ProductController extends Controller
// Товар обновлён // Товар обновлён
$return['main'] = $this->renderPartial('index', compact('model')); $return['main'] = $this->renderPartial('index', compact('model'));
$return['redirect'] = '/product/' . $model->catn;
} }
} }
@ -131,10 +132,16 @@ class ProductController extends Controller
return $return; return $return;
} }
if ($model = Product::searchByCatn($catn)) { if (Product::searchByCatn($catn)) {
return $this->render('index', compact('model')); // Старый товар ещё существует (подразумевается, что произошла ошибка)
// Возврат на страницу товара
return $this->redirect("/product/$catn");
} else { } else {
return $this->redirect('/'); // Старый товар не существует (подразумевается, что его артикул успешно изменён)
// Переадресация на новую страницу товара
return $this->redirect("/product/$model->catn");
} }
} }

View File

@ -29,6 +29,12 @@ class ProfileController extends Controller
'access' => [ 'access' => [
'class' => AccessControl::class, 'class' => AccessControl::class,
'rules' => [ 'rules' => [
[
'allow' => true,
'actions' => [
'geolocation-init'
]
],
[ [
'allow' => true, 'allow' => true,
'roles' => ['@'], 'roles' => ['@'],
@ -37,8 +43,7 @@ class ProfileController extends Controller
'supplies', 'supplies',
'import', 'import',
'monitoring', 'monitoring',
'readGroups', 'readGroups'
'geolocation-init'
] ]
], ],
[ [
@ -468,8 +473,21 @@ class ProfileController extends Controller
{ {
if (Yii::$app->request->isPost) { if (Yii::$app->request->isPost) {
// POST-запрос // POST-запрос
// Инициализация аккаунта
$account ?? $account = yii::$app->user->identity; if (is_null($account)) {
// Данные аккаунта не переданы
if (yii::$app->user->isGuest) {
// Аккаунт не аутентифицирован
return false;
} else {
// Аккаунт аутентифицирован
// Инициализация
$account = yii::$app->user->identity;
}
}
// Инициализация IP-адреса // Инициализация IP-адреса
$ip = yii::$app->request->userIp === 'localhost' || yii::$app->request->userIp === '127.0.0.1' ? '46.226.227.20' : yii::$app->request->userIp; $ip = yii::$app->request->userIp === 'localhost' || yii::$app->request->userIp === '127.0.0.1' ? '46.226.227.20' : yii::$app->request->userIp;
@ -509,6 +527,6 @@ class ProfileController extends Controller
return false; return false;
} }
yii::$app->response->redirect('/'); return false;
} }
} }

View File

@ -19,16 +19,59 @@ class VerifyController extends Controller
if (Account::verification($vrfy, auth: true)) { if (Account::verification($vrfy, auth: true)) {
// Успешно подтверждена регистрация // Успешно подтверждена регистрация
return $this->redirect('/'); return $this->redirect('/profile');
} }
return ErrorController::throw('Ошибка подтверждения регистрации', 'Код подтверждения не совпадает с тем, что мы отправили вам на почту, либо регистрация уже была подтверждена. Свяжитесь с администрацией'); return ErrorController::throw('Ошибка подтверждения регистрации', 'Код подтверждения не совпадает с тем, что мы отправили вам на почту, либо регистрация уже была подтверждена. Свяжитесь с администрацией');
} else { } else {
// Простой запрос // Простой запрос
if (yii::$app->user->isGuest) {
// Пользователь не аутентифицирован
return yii::$app->response->redirect('/registration');
} else {
// Пользователь аутентифицирован
if (yii::$app->user->identity->vrfy === true) {
// Регистрация аккаунта уже подтверждена
if (yii::$app->request->isPost) {
// POST-запрос
// Запись формата ответа
yii::$app->response->format = Response::FORMAT_JSON;
return [
'main' => $this->renderPartial('/profile/index'),
'title' => 'Профиль',
'redirect' => '/profile',
'_csrf' => yii::$app->request->getCsrfToken()
];
} else {
// GET-запрос (подразумевается)
return $this->render('/profile/index');
}
} else {
// Регистрация аккаунта ещё не подтверждена
if (yii::$app->request->isPost) {
// POST-запрос
// Запись формата ответа
yii::$app->response->format = Response::FORMAT_JSON;
return $this->genPostVerify();
} else {
// GET-запрос (подразумевается)
return $this->render('/account/verify'); return $this->render('/account/verify');
} }
} }
}
}
}
/** /**
* Отправить запрос на активацию * Отправить запрос на активацию
@ -37,24 +80,39 @@ class VerifyController extends Controller
*/ */
public function actionSend(): string|array public function actionSend(): string|array
{ {
if (!yii::$app->user->isGuest) {
// Пользователь аутентифицирован
// Регенерация кода подтверждения
yii::$app->user->identity->verifyRegenerate(); yii::$app->user->identity->verifyRegenerate();
// Отправка кода подтверждения на почту
yii::$app->user->identity->sendMailVerify(); yii::$app->user->identity->sendMailVerify();
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;
return [ return $this->genPostVerify();
'main' => $this->renderPartial('/account/verify'),
'title' => 'Корзина',
'_csrf' => yii::$app->request->getCsrfToken()
];
} else { } else {
// Подразумевается как GET-запрос // GET-запрос (подразумевается)
return $this->render('/account/verify'); return $this->render('/account/verify');
} }
} }
}
/**
* Генерация данных для POST-запроса с переадресацией на страницу подтверждения
*/
function genPostVerify(): array {
return [
'main' => $this->renderPartial('/account/verify'),
'title' => 'Подтверждение аккаунта',
'redirect' => '/account/verify',
'_csrf' => yii::$app->request->getCsrfToken()
];
}
} }

View File

@ -259,6 +259,53 @@ class Account extends Document implements IdentityInterface, PartnerInterface
return static::find()->where(['type' => 'moderator'])->orWhere(['type' => 'administrator'])->all(); return static::find()->where(['type' => 'moderator'])->orWhere(['type' => 'administrator'])->all();
} }
/**
* Подтверждение регистрации
*/
public static function verification(string $vrfy, bool $auth = false): bool
{
if ($account = static::findByVrfy($vrfy)) {
// Аккаунт найден
// Запись в буфер
$account->vrfy = true;
// Отправка изменений
$updated = $account->update() > 0;
if ($updated && $auth) {
// Регистрация была подтверждена, а так же запрошена автоматическая аутентификация
// Аутентификация
yii::$app->user->login($account, true ? 3600 * 24 * 30 : 0);
}
return $updated;
}
return false;
}
/**
* Проверка пароля
*/
public function validatePassword(string $pswd): bool
{
// return yii::$app->security->validatePassword($pswd, $this->pswd);
return $pswd === $this->pswd;
}
/**
* Проверка аутентификационного ключа
*
* @todo Подождать обновление Yii2 и добавить
* проверку типов передаваемых параметров
*/
public function validateAuthKey($auth): bool
{
return $this->getAuthKey() === $auth;
}
/** /**
* Проверка почты * Проверка почты
*/ */
@ -311,53 +358,6 @@ class Account extends Document implements IdentityInterface, PartnerInterface
} }
} }
/**
* Подтверждение регистрации
*/
public static function verification(string $vrfy, bool $auth = false): bool
{
if ($account = static::findByVrfy($vrfy)) {
// Аккаунт найден
// Запись в буфер
$account->vrfy = true;
// Отправка изменений
$updated = $account->update() > 0;
if ($updated && $auth) {
// Регистрация была подтверждена, а так же запрошена автоматическая аутентификация
// Аутентификация
yii::$app->user->login($account, true ? 3600 * 24 * 30 : 0);
}
return $updated;
}
return false;
}
/**
* Проверка пароля
*/
public function validatePassword(string $pswd): bool
{
// return yii::$app->security->validatePassword($pswd, $this->pswd);
return $pswd === $this->pswd;
}
/**
* Проверка аутентификационного ключа
*
* @todo Подождать обновление Yii2 и добавить
* проверку типов передаваемых параметров
*/
public function validateAuthKey($auth): bool
{
return $this->getAuthKey() === $auth;
}
/** /**
* Записать параметр * Записать параметр
* *

View File

@ -237,7 +237,7 @@ class Order extends Document implements DocumentInterface
* *
* @todo Привести в порядок * @todo Привести в порядок
*/ */
public static function search(Account|string $account = null, string $type = 'current', int $limit = 1, int $page = 1, string $select = null, bool $supplies = false): self|array|null public static function search(Account|string $account = null, string $type = 'current', int $limit = 1, int $page = 1, string $select = null, bool $supplies = false, int|null $from = null, int|null $to = null): self|array|null
{ {
// Инициализация аккаунта // Инициализация аккаунта
if (empty($account) && isset(yii::$app->user->identity)) { if (empty($account) && isset(yii::$app->user->identity)) {
@ -276,13 +276,35 @@ class Order extends Document implements DocumentInterface
// Инициализация сдвига по запрашиваемым данным (пагинация) // Инициализация сдвига по запрашиваемым данным (пагинация)
$offset = $limit * ($page - 1); $offset = $limit * ($page - 1);
// Запрос // Инициализация фильтрации
if (isset($from, $to)) {
// Задан период
// Инициализация логики
$foreach = [
['edge' => 'account_edge_order'],
['jrnl' => 'order.jrnl']
];
// Инициализация фильтра
$where = "edge._to == order._id && jrnl.action == 'requested' && jrnl.date >= $from && jrnl.date <= $to";
} else {
// Ничего не задано
// Инициализация логики
$foreach = ['edge' => 'account_edge_order'];
// Инициализация фильтра
$where = "edge._to == order._id";
}
// Запрос на поиск заказов
$return = self::searchByEdge( $return = self::searchByEdge(
from: 'account', from: 'account',
to: 'order', to: 'order',
subquery_where: $subquery_where, subquery_where: $subquery_where,
foreach: ['edge' => 'account_edge_order'], foreach: $foreach,
where: 'edge._to == order._id', where: $where,
limit: $limit, limit: $limit,
offset: $offset, offset: $offset,
sort: ['DESC'], sort: ['DESC'],

View File

@ -17,12 +17,21 @@ use app\models\AccountForm;
<div class="row"> <div class="row">
<div class="mx-auto"> <div class="mx-auto">
<?php <?php
Pjax::begin([
// Опции Pjax
]);
// Инициализация идентификатора формы // Инициализация идентификатора формы
$form_id = ($isPopupMenu ?? false) ? 'form_account_menu' : 'form_account'; if ($isPopupMenu ?? false) {
// Генерация документа во всплывающем меню
// Инициализация параметров
$form_id = 'form_account_menu';
$target = 'menu';
} else {
// Генерация документа в основном блоке страницы
// Инициализация параметров
$form_id = 'form_account';
$target = 'main';
}
$form = ActiveForm::begin([ $form = ActiveForm::begin([
'id' => $form_id, 'id' => $form_id,
@ -35,10 +44,7 @@ use app\models\AccountForm;
], ],
'options' => [ 'options' => [
'class' => 'form_account', 'class' => 'form_account',
'onsubmit' => 'return false;', 'onsubmit' => 'return false;'
'data' => [
'pjax' => true
]
], ],
'enableClientValidation' => false, 'enableClientValidation' => false,
'enableAjaxValidation' => true 'enableAjaxValidation' => true
@ -61,11 +67,11 @@ use app\models\AccountForm;
<?php endif ?> <?php endif ?>
<?php endif ?> <?php endif ?>
<?= $form->field($model, 'mail', ['enableLabel' => false, 'options' => ['class' => 'mb-2'], 'errorOptions' => ['class' => 'help-block help-block-error small']])->textInput(['autofocus' => true, 'placeholder' => $model->getAttributeLabel('mail')]) ?> <?= $form->field($model, 'mail', ['enableLabel' => false, 'options' => ['class' => 'mb-2'], 'errorOptions' => ['class' => 'help-block help-block-error px-2 small']])->textInput(['autofocus' => true, 'placeholder' => $model->getAttributeLabel('mail')]) ?>
<?= $form->field($model, 'pswd', ['enableLabel' => false, 'errorOptions' => ['class' => 'help-block help-block-error small']])->passwordInput(['placeholder' => $model->getAttributeLabel('pswd')]) ?> <?= $form->field($model, 'pswd', ['enableLabel' => false, 'errorOptions' => ['class' => 'help-block help-block-error px-2 small']])->passwordInput(['placeholder' => $model->getAttributeLabel('pswd')]) ?>
<div class="d-flex mb-2 mt-4"> <div class="d-flex mb-2 mt-4">
<?= Html::submitButton('Войти', ['name' => 'submitAuthentication', 'onclick' => 'authentication(this.parentElement.parentElement);', 'class' => 'flex-grow-1 mr-2 btn btn-primary button_clean']) ?> <?= Html::submitButton('Войти', ['name' => 'submitAuthentication', 'onclick' => 'authentication(this.parentElement.parentElement, \'' . $target . '\');', 'class' => 'flex-grow-1 mr-2 btn btn-primary button_clean']) ?>
<?= $form->field($model, 'auto', ['checkboxTemplate' => '<div class="checkbox button_clean">{beginLabel}' . <?= $form->field($model, 'auto', ['checkboxTemplate' => '<div class="checkbox button_clean">{beginLabel}' .
Html::submitButton('{labelTitle}', ['name' => 'submit', 'data-toggle' => 'button', 'class' => 'w-100 btn btn-primary button_clean', 'aria-pressed' => 'false', 'onclick' => 'return authentication_auto_button_status_switch(this);']) . Html::submitButton('{labelTitle}', ['name' => 'submit', 'data-toggle' => 'button', 'class' => 'w-100 btn btn-primary button_clean', 'aria-pressed' => 'false', 'onclick' => 'return authentication_auto_button_status_switch(this);']) .
'{endLabel}</div>'])->checkbox()->label($model->getAttributeLabel('auto'), ['class' => 'w-100 m-0']) ?> '{endLabel}</div>'])->checkbox()->label($model->getAttributeLabel('auto'), ['class' => 'w-100 m-0']) ?>
@ -77,8 +83,6 @@ use app\models\AccountForm;
ActiveForm::end(); ActiveForm::end();
Pjax::end();
?> ?>
</div> </div>
</div> </div>

View File

@ -182,19 +182,15 @@ if (
</div> </div>
<div class="row mb-4"> <div class="row mb-4">
<small class="ml-auto d-flex"> <small class="ml-auto d-flex">
<a class="btn btn-sm button_white button_clean mb-0 mr-2" type="button" onclick="return orders_read('all');">День</a> <a class="btn btn-sm button_white button_clean mb-0 mr-2" type="button" onclick="return orders_read('last','<?= time() - 86400 ?>', '<?= time() ?>');">День</a>
<a class="btn btn-sm button_white button_clean mb-0 mr-2" type="button" onclick="return orders_read('all');">Неделя</a> <a class="btn btn-sm button_white button_clean mb-0 mr-2" type="button" onclick="return orders_read('last', '<?= time() - 604800 ?>', '<?= time() ?>');">Неделя</a>
<a class="btn btn-sm button_white button_clean mb-0 mr-2" type="button" onclick="return orders_read('requested');">Месяц</a> <a class="btn btn-sm button_white button_clean mb-0 mr-2" type="button" onclick="return orders_read('last', '<?= time() - 2592000 ?>', '<?= time() ?>');">Месяц</a>
<a class="btn btn-sm button_white button_clean mb-0 mr-2" type="button" onclick="return orders_read('accepted');">Год</a> <a class="btn btn-sm button_white button_clean mb-0 mr-2" type="button" onclick="return orders_read('last',' '<?= time() - 31536000 ?>', '<?= time() ?>');">Год</a>
</small> </small>
<div class="ml-2 mr-3 d-flex"> <div class="ml-2 mr-3 d-flex">
<div class="ml-auto"> <input id="orders_period_calendar_from" class="form-control form-control-sm form_control_clean" type="date" value="<?= $from ?? date('Y-m-d', time() - 604800) ?>" onchange="return orders_read('last', moment(this.value, 'YYYY-MM-DD').unix(), moment(document.getElementById('orders_period_calendar_to').value, 'YYYY-MM-DD').unix());" pattern="[0-9]{4}-[0-9]{2}-[0-9]{2}" />
<input class="form-contro form-control-sm" type="date" value="<?= date('Y-m-d', time() - 604800) ?>" />
</div>
<p class="mx-2 p-0">-</p> <p class="mx-2 p-0">-</p>
<div> <input id="orders_period_calendar_to" class="form-control form-control-sm form_control_clean" type="date" value="<?= $to ?? date('Y-m-d', time()) ?>" onchange="return orders_read('last', moment(document.getElementById('orders_period_calendar_from').value, 'YYYY-MM-DD').unix(), moment(this.value, 'YYYY-MM-DD').unix());" pattern="[0-9]{4}-[0-9]{2}-[0-9]{2}" />
<input class="form-contro form-control-sm" type="date" value="<?= date('Y-m-d', time()) ?>" />
</div>
</div> </div>
</div> </div>
<div class="col mb-4 list rounded"> <div class="col mb-4 list rounded">

View File

@ -87,7 +87,7 @@ if (
// Инициализация // Инициализация
$model ?? $model = yii::$app->user->identity; $model ?? $model = yii::$app->user->identity;
$delivery_from_terminal_list or $delivery_from_terminal_list = ['Нет данных']; $delivery_from_terminal_list ?? $delivery_from_terminal_list = ['Нет данных'];
?> ?>
<?= $form->field($model, 'opts[delivery_from_terminal]', ['options' => ['class' => "mb-1"]]) <?= $form->field($model, 'opts[delivery_from_terminal]', ['options' => ['class' => "mb-1"]])
@ -118,7 +118,7 @@ if (
// Инициализация // Инициализация
$model ?? $model = yii::$app->user->identity; $model ?? $model = yii::$app->user->identity;
$import_oem_list or $import_oem_list = ['Нет данных']; $import_oem_list ?? $import_oem_list = ['Нет данных'];
?> ?>
<?= $form->field($model, 'opts[import_supplies_oem]', ['options' => ['class' => "mb-1"]]) <?= $form->field($model, 'opts[import_supplies_oem]', ['options' => ['class' => "mb-1"]])

View File

@ -70,7 +70,6 @@ main {
.button_clean_full:focus, .button_clean_full:focus,
.button_clean_full:active { .button_clean_full:active {
outline : none !important; outline : none !important;
box-shadow: none !important;
} }
.button_clean_full, .button_clean_full,
@ -81,6 +80,13 @@ main {
background: none !important; background: none !important;
} }
.form_control_clean,
.form_control_clean:hover,
.form_control_clean:focus,
.form_control_clean:active {
box-shadow: none !important;
}
.button_blue_simple { .button_blue_simple {
color : #eee; color : #eee;
background-color: #123EAB; background-color: #123EAB;

View File

@ -11,7 +11,8 @@ function identification() {
document.addEventListener('DOMContentLoaded', identification(), true); document.addEventListener('DOMContentLoaded', identification(), true);
function authentication(form) { function authentication(form, target = 'main') {
if (form == undefined) { if (form == undefined) {
form = { form = {
'_csrf': yii.getCsrfToken() '_csrf': yii.getCsrfToken()
@ -20,10 +21,17 @@ function authentication(form) {
form = $(form).serializeArray(); form = $(form).serializeArray();
} }
form.push({ form.push(
{
name: 'type', name: 'type',
value: 'authentication' value: 'authentication'
}); },
{
name: 'target',
value: target
}
);
$.ajax({ $.ajax({
url: '/authentication', url: '/authentication',
@ -248,6 +256,19 @@ function account_response(data, status, xhr) {
// reinitialization(main); // reinitialization(main);
// } // }
main_response(data, status, xhr);
}
function account_response_success(data, status, xhr) {
// Обработка ответов от удавшихся запросов
// Реинициализация панели поиска
// Перенести в отдельный файл который подгружается в зависимости от настроек
// search_panel_show();
// // Обновление панели поиска
// product_search();
if (data !== undefined) { if (data !== undefined) {
// Получены данные с сервера // Получены данные с сервера
@ -264,19 +285,6 @@ function account_response(data, status, xhr) {
} }
} }
main_response(data, status, xhr);
}
function account_response_success(data, status, xhr) {
// Обработка ответов от удавшихся запросов
// Реинициализация панели поиска
// Перенести в отдельный файл который подгружается в зависимости от настроек
// search_panel_show();
// // Обновление панели поиска
// product_search();
account_response(data, status, xhr); account_response(data, status, xhr);
} }

File diff suppressed because one or more lines are too long

View File

@ -1,13 +1,32 @@
// Запросить заказы // Запросить заказы
function orders_read(type = 'all') { function orders_read(type = 'all', from, to) {
// type = 'last' (оставить без изменений и взять данные из cookie
// Пустые from и to тоже возьмутся из текущих значений в cookie
if (from !== undefined && to !== undefined) {
// Данные периода переданы
// Инициализация буфера с данными запроса
data = {
'_csrf': yii.getCsrfToken(),
'from': from,
'to': to
};
} else {
// Данные периода не переданы
// Инициализация буфера с данными запроса
data = {
'_csrf': yii.getCsrfToken()
};
};
// Запрос // Запрос
$.ajax({ $.ajax({
url: '/orders/' + type, url: '/orders/' + type,
type: 'post', type: 'post',
dataType: 'json', dataType: 'json',
data: { data: data,
'_csrf': yii.getCsrfToken()
},
success: orders_response_success, success: orders_response_success,
error: orders_response_error error: orders_response_error
}); });

View File

@ -30,7 +30,7 @@ function product_response(data, status, xhr) {
function product_response_success(data, status, xhr) { function product_response_success(data, status, xhr) {
// Обработка ответов от удавшихся запросов // Обработка ответов от удавшихся запросов
product_response(data, status); product_response(data, status, xhr);
}; };
function product_response_error(data, status, xhr) { function product_response_error(data, status, xhr) {

View File

@ -86,21 +86,7 @@ function product_panel_catn_save(catn, element, redirect = false) {
'_csrf': yii.getCsrfToken(), '_csrf': yii.getCsrfToken(),
'text': text 'text': text
}, },
success: function (data, status, xhr) { success: product_response_success,
if (data !== undefined) {
// Получены данные с сервера
// Заголовок
if (data.catn !== undefined && element !== null && element !== undefined) {
if (redirect) {
// Перенаправление
history.pushState({}, '/product/' + catn, '/product/' + data.catn);
};
};
};
product_response_success(data, status, xhr);
},
error: product_response_error error: product_response_error
}); });