From 53d7e2a048c3ce58c1d80776099fbb62b8b1fc03 Mon Sep 17 00:00:00 2001 From: Arsen Mirzaev Tatyano-Muradovich Date: Sun, 7 Mar 2021 20:29:19 +1000 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BA=D0=BE=D1=80=D0=B7=D0=B8=D0=BD=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/controllers/CartController.php | 111 +++++++++++ .../controllers/NotificationController.php | 20 +- .../system/controllers/OrderController.php | 94 +++++++++ .../system/controllers/ProductController.php | 44 ++--- .../system/controllers/ProfileController.php | 8 +- .../system/controllers/SearchController.php | 85 ++++++-- ...m210303_192326_create_order_collection.php | 16 ++ ...51_create_order_edge_supply_collection.php | 16 ++ ...0_create_account_edge_order_collection.php | 16 ++ .../system/models/AccountEdgeOrder.php | 13 ++ mirzaev/skillparts/system/models/Document.php | 2 +- .../skillparts/system/models/Notification.php | 21 +- mirzaev/skillparts/system/models/Order.php | 186 ++++++++++++++++++ .../system/models/OrderEdgeSupply.php | 13 ++ mirzaev/skillparts/system/models/Product.php | 29 +-- mirzaev/skillparts/system/models/Search.php | 4 +- mirzaev/skillparts/system/models/Supply.php | 99 ++++++---- .../system/models/traits/SearchByAccount.php | 74 ------- .../system/models/traits/SearchByEdge.php | 83 ++++++++ .../system/views/account/authentication.php | 6 +- .../system/views/account/deauthentication.php | 4 +- .../skillparts/system/views/cart/index.php | 56 ++++++ .../skillparts/system/views/layouts/main.php | 19 +- .../skillparts/system/views/product/index.php | 4 +- .../skillparts/system/views/profile/index.php | 9 +- .../skillparts/system/views/search/index.php | 153 +++++++++----- .../system/views/{ => search}/loading.php | 0 .../skillparts/system/views/search/panel.php | 14 +- .../skillparts/system/web/css/pages/cart.css | 11 ++ .../system/web/css/pages/search.css | 16 +- mirzaev/skillparts/system/web/js/account.js | 14 ++ mirzaev/skillparts/system/web/js/cart.js | 61 ++++++ mirzaev/skillparts/system/web/js/menu.js | 181 +++++++++-------- mirzaev/skillparts/system/web/js/search.js | 162 ++++++++++----- 34 files changed, 1248 insertions(+), 396 deletions(-) create mode 100644 mirzaev/skillparts/system/controllers/CartController.php create mode 100644 mirzaev/skillparts/system/controllers/OrderController.php create mode 100644 mirzaev/skillparts/system/migrations/arangodb/m210303_192326_create_order_collection.php create mode 100644 mirzaev/skillparts/system/migrations/arangodb/m210303_192451_create_order_edge_supply_collection.php create mode 100644 mirzaev/skillparts/system/migrations/arangodb/m210307_000210_create_account_edge_order_collection.php create mode 100644 mirzaev/skillparts/system/models/AccountEdgeOrder.php create mode 100644 mirzaev/skillparts/system/models/Order.php create mode 100644 mirzaev/skillparts/system/models/OrderEdgeSupply.php delete mode 100644 mirzaev/skillparts/system/models/traits/SearchByAccount.php create mode 100644 mirzaev/skillparts/system/models/traits/SearchByEdge.php create mode 100644 mirzaev/skillparts/system/views/cart/index.php rename mirzaev/skillparts/system/views/{ => search}/loading.php (100%) create mode 100644 mirzaev/skillparts/system/web/css/pages/cart.css create mode 100644 mirzaev/skillparts/system/web/js/cart.js diff --git a/mirzaev/skillparts/system/controllers/CartController.php b/mirzaev/skillparts/system/controllers/CartController.php new file mode 100644 index 0000000..ed7de6e --- /dev/null +++ b/mirzaev/skillparts/system/controllers/CartController.php @@ -0,0 +1,111 @@ + [ + 'class' => AccessControl::class, + 'only' => ['index'], + 'rules' => [ + [ + 'allow' => true, + 'roles' => ['@'] + ] + ] + ] + ]; + } + + /** + * Страница: "Корзина" + * + * @see $this->behaviors Доступ только аутентифицированным + */ + public function actionIndex(): string|array|null + { + // Инициализация настроек страницы + $page = yii::$app->request->get('page') ?? 1; + + // Инициализация корзина + $model = Order::search(); + + // Инициализация содержимого корзины + $supplies = $model->content(10, $page); + + // Инициализация реестра дубликатов + $registry = []; + + // Подсчёт и перестройка массива + foreach ($supplies as $key => &$supply) { + // Перебор поставок + + if (in_array($supply->catn, $registry)) { + // Если данная поставка найдена в реестре + + // Удаление + unset($supplies[$key]); + + // Пропуск итерации + continue; + } + + $amount = 0; + + // Повторный перебор для поиска дубликатов + foreach ($supplies as &$supply4check) { + if ($supply == $supply4check) { + // Найден дубликат + + // Постинкрементация счётчика + $amount++; + + // Запись в реестр + $registry []= $supply4check->catn; + } + } + + // Запись количества + $supply->amnt = $amount; + } + + // Инициализация возврата по умолчанию + $return = [ + '_csrf' => yii::$app->request->getCsrfToken() + ]; + + if (yii::$app->request->isPost) { + // POST-запрос + + yii::$app->response->format = Response::FORMAT_JSON; + + $return = array_merge($return, [ + 'main' => $this->renderPartial('index', compact('model', 'supplies')), + 'title' => 'Корзина', + 'redirect' => '/cart' + ]); + } else { + // GET-запрос (подразумевается) + + return $this->render('index', compact('model', 'supplies')); + } + + return $return; + } +} diff --git a/mirzaev/skillparts/system/controllers/NotificationController.php b/mirzaev/skillparts/system/controllers/NotificationController.php index 5a25221..9ecbf98 100644 --- a/mirzaev/skillparts/system/controllers/NotificationController.php +++ b/mirzaev/skillparts/system/controllers/NotificationController.php @@ -30,6 +30,9 @@ class NotificationController extends Controller ]; } + /** + * @todo Перенести логику в модель + */ public function actionIndex() { if (yii::$app->request->isPost) { @@ -84,12 +87,17 @@ class NotificationController extends Controller /** * Поиск рёбер: (УВЕДОМЛЕНИЕ)? -> ПОЛЬЗОВАТЕЛЬ * - * @param bool $check Активация проверки получения + * @param bool $check Активация проверки на то, что уведомление не получено */ $search = function (bool $check = false) use ($model, $type, $let, $limit): array { - return $model::searchByAccount( + return $model::searchByEdge( + from: 'account', + to: 'notification', params: $check ? $let->getBindVars() : [], - where: [ + subquery_where: [ + [ + 'account._id' => yii::$app->user->id + ], [ [ 'notification.html' => null @@ -101,10 +109,10 @@ class NotificationController extends Controller ] ], let: [ - $model::collectionName() . '_edge_account', + 'notification_edge_account', '(' . (string) $let . ')' ], - post_where: $check ? [ + where: $check ? [ 'account_edge_notification[0]._to' => null ] : [], limit: $limit, @@ -126,7 +134,7 @@ class NotificationController extends Controller if (empty($notifications)) { // Уведомления не найдены - yii::$app->response->statusCode = 404; + yii::$app->response->statusCode = 100; goto end; } diff --git a/mirzaev/skillparts/system/controllers/OrderController.php b/mirzaev/skillparts/system/controllers/OrderController.php new file mode 100644 index 0000000..86d6ec1 --- /dev/null +++ b/mirzaev/skillparts/system/controllers/OrderController.php @@ -0,0 +1,94 @@ + [ + 'class' => AccessControl::class, + 'only' => ['index'], + 'rules' => [ + [ + 'allow' => true, + 'roles' => ['@'] + ] + ] + ] + ]; + } + + public function actionIndex() + { + + } + + public function actionWrite(): string|array|null { + if (yii::$app->request->isPost) { + // POST-запрос + + // Инициализация входных данных + $account = yii::$app->user; + $supplies = yii::$app->request->post('supplies'); + + yii::$app->response->format = Response::FORMAT_JSON; + + // Инициализация возврата по умолчанию + $return = [ + '_csrf' => yii::$app->request->getCsrfToken() + ]; + + if (is_null($supplies)) { + // 501 Not Implemented + yii::$app->response->statusCode = 501; + } + + if (!is_null($supplies)) { + // Переданы поставки для записи + + if (!$model = Order::search($account)) { + // Корзина не найдена (текущий заказ) + + // Инициализация + $model = new Order(); + $model->save() or throw new Exception('Не удалось инициализировать заказ'); + + // Запись в аккаунт + AccountEdgeOrder::write($account->id, $model->readId(), 'current') or $model->addError('errors', 'Не удалось инициализировать ребро: АККАУНТ -> ЗАКАЗ'); + } + + // Проверка входных данных + if (!is_array($supplies)) { + // Неверные входные данные + + // Запись ошибки + $model->addError('errors', 'Переменная должна быть массивом'); + } + + // Если запись не удалась, то вернуть код: 500 Internal Server Error + $model->write($supplies) or yii::$app->response->statusCode = 500; + } + + return $return; + } + + yii::$app->response->statusCode = 500; + + return null; + } +} diff --git a/mirzaev/skillparts/system/controllers/ProductController.php b/mirzaev/skillparts/system/controllers/ProductController.php index 8234bbb..3c3f531 100644 --- a/mirzaev/skillparts/system/controllers/ProductController.php +++ b/mirzaev/skillparts/system/controllers/ProductController.php @@ -14,28 +14,28 @@ use app\models\Product; class ProductController extends Controller { - /** - * {@inheritdoc} - */ - public function behaviors() - { - return [ - 'access' => [ - 'class' => AccessControl::class, - 'rules' => [ - [ - 'allow' => true, - 'actions' => ['index'], - 'roles' => ['@'] - ], - [ - 'allow' => false, - 'roles' => ['?'] - ], - ] - ] - ]; - } + // /** + // * {@inheritdoc} + // */ + // public function behaviors() + // { + // return [ + // 'access' => [ + // 'class' => AccessControl::class, + // 'rules' => [ + // [ + // 'allow' => true, + // 'actions' => ['index'], + // 'roles' => ['@'] + // ], + // [ + // 'allow' => false, + // 'roles' => ['?'] + // ], + // ] + // ] + // ]; + // } public function actionIndex(string $catn) { diff --git a/mirzaev/skillparts/system/controllers/ProfileController.php b/mirzaev/skillparts/system/controllers/ProfileController.php index 13d09b8..fc468cb 100644 --- a/mirzaev/skillparts/system/controllers/ProfileController.php +++ b/mirzaev/skillparts/system/controllers/ProfileController.php @@ -85,7 +85,7 @@ class ProfileController extends Controller { // Инициализация $model = yii::$app->user->identity; - $attributes = Supply::searchByAccount(yii::$app->user->id); + $supplies = Supply::searchByAccount(select: 'supply.onec["ЗначенияСвойств"]'); if ($vars = yii::$app->request->post('Account') ?? yii::$app->request->get('Account')) { // Обнаружены входные параметры @@ -116,13 +116,13 @@ class ProfileController extends Controller yii::$app->response->format = Response::FORMAT_JSON; return [ - 'main' => $this->renderPartial('index', compact('model', 'sidebar', 'attributes')), + 'main' => $this->renderPartial('index', compact('model', 'sidebar', 'supplies')), 'redirect' => '/profile', '_csrf' => yii::$app->request->getCsrfToken() ]; } - return $this->render('index', compact('model', 'sidebar', 'attributes')); + return $this->render('index', compact('model', 'sidebar', 'supplies')); } /** @@ -137,7 +137,7 @@ class ProfileController extends Controller $sidebar = $this->renderPartial('sidebar'); if (yii::$app->request->isPost) { - // AJAX-POST-запрос + // POST-запрос yii::$app->response->format = Response::FORMAT_JSON; diff --git a/mirzaev/skillparts/system/controllers/SearchController.php b/mirzaev/skillparts/system/controllers/SearchController.php index 2b82d73..142ae43 100644 --- a/mirzaev/skillparts/system/controllers/SearchController.php +++ b/mirzaev/skillparts/system/controllers/SearchController.php @@ -9,6 +9,7 @@ use yii\web\Controller; use yii\web\Response; use app\models\Product; +use app\models\Supply; use app\models\Search; class SearchController extends Controller @@ -18,6 +19,19 @@ class SearchController extends Controller */ public function actionIndex(): array|string { + // Инициализация параметров + $auth_only = false; + + if ($auth_only && yii::$app->user->isGuest) { + // Если активирован режим "Поиск только аутентифицированным" и запрос пришел не от аутентифицированного + + // Запись кода ответа: 401 (необходима авторизация) + yii::$app->response->statusCode = 401; + + // Переход к концу обработки + goto skip_search; + } + // Инициализация $query = yii::$app->request->post('request') ?? yii::$app->request->get('q'); @@ -30,7 +44,7 @@ class SearchController extends Controller yii::$app->response->format = Response::FORMAT_JSON; return [ - 'search_line_window' => $this->renderPartial('/search/panel', ['history' => true]), + 'panel' => $this->renderPartial('/search/panel', ['history' => true]), '_csrf' => yii::$app->request->getCsrfToken() ]; } @@ -46,7 +60,7 @@ class SearchController extends Controller $timer = 0; // Период пропуска запросов (в секундах) - $period = 3; + $period = 1; $keep_connect = true; $sanction = false; $sanction_condition = ($session['last_request'] + $period - time()) < $period; @@ -68,39 +82,45 @@ class SearchController extends Controller // Инициализация $session['last_request'] = time(); + // Пропуск проверок goto first_request; } + // Метка: "Повтор обработки поиска" (для создания непрерывного соединения) keep_connect_wait: // Запись времени последнего запроса и вычисление об истечении таймера $timer = $session['last_request'] + $period - time(); if ($timer > 0) { - // Ожидание перед повторным запросом при условии что старых запросов нет + // Время блокировки не истекло + // Запись кода ответа: 202 (запрос не обработан) yii::$app->response->statusCode = 202; $return = [ 'timer' => $timer, - 'search_line_window' => $this->renderPartial('/loading'), + 'panel' => $this->renderPartial('/search/loading'), '_csrf' => yii::$app->request->getCsrfToken() ]; } else { - // Повторный запрос по истечению ожидания + // Запрос // Очистка времени последнего запроса unset($session['last_request']); + // Метка: "Первый запрос" first_request: if (strlen($query) < $query_min) { // Выход за ограничения длины с недостатком + // Пропуск поиска goto skip_query; } else if (strlen($query) > $query_max) { // Выход за ограничения длины с превышением + // Пропуск поиска goto skip_query; } @@ -109,12 +129,39 @@ class SearchController extends Controller $limit = yii::$app->request->isPost ? 10 : 20; - if ($response = Product::searchByCatn($query, $limit, [])) { + if ($response = Product::searchByCatn($query, $limit, ['catn' => 'catn', '_key' => '_key'])) { // Данные найдены по поиску в полях Каталожного номера + foreach ($response as &$row) { + // Перебор продуктов + + // Поиск поставок привязанных к продуктам + $row['supplies'] = Supply::searchByEdge( + from: 'product', + to: 'supply', + edge: 'supply_edge_product', + limit: 11, + direction: 'OUTBOUND', + subquery_where: [ + ['product._key' => $row['_key']], + ['supply.catn == product.catn'], + ['supply_edge_product.type' => 'connect'] + ], + where: 'supply._id == supply_edge_product[0]._from', + select: 'supply_edge_product[0]' + ); + + if (count($row['supplies']) === 11) { + // Если в базе данных хранится много поставок + + // Инициализация + $row['overload'] = true; + } + } + // Запись ответа $return = [ - 'search_line_window' => $this->renderPartial('/search/panel', compact('response')), + 'panel' => $this->renderPartial('/search/panel', compact('response')), '_csrf' => yii::$app->request->getCsrfToken() ]; @@ -123,16 +170,18 @@ class SearchController extends Controller // Запись ответа $return['main'] = $this->renderPartial('/search/index', compact('response')); - $return['search_line_window_hide'] = 1; + $return['hide'] = 1; $return['redirect'] = '/search?type=product&q=' . $query; } } else { // Данные не найдены + // Запись кода ответа: 404 (запрашиваемые данные не найдены) yii::$app->response->statusCode = 404; } } + // Метка: "Пропуск запроса" (для пропуска самого поиска и возврата ответа) skip_query: if (yii::$app->request->isPost) { @@ -141,7 +190,7 @@ class SearchController extends Controller yii::$app->response->format = Response::FORMAT_JSON; return $return ?? [ - 'search_line_window' => $this->renderPartial('/search/panel'), + 'panel' => $this->renderPartial('/search/panel'), '_csrf' => yii::$app->request->getCsrfToken() ]; } else { @@ -153,6 +202,7 @@ class SearchController extends Controller // Ожидание sleep($timer); + // Повтор обработки goto keep_connect_wait; } @@ -160,9 +210,22 @@ class SearchController extends Controller } } - if (yii::$app->user->isGuest) { - return $this->render('/search/index', ['error_auth' => true]); + // Метка: "Пропуск обработки" + skip_search: + + if (yii::$app->request->isPost) { + // POST-запрос + + yii::$app->response->format = Response::FORMAT_JSON; + + return [ + 'panel' => $this->renderPartial('/search/panel'), + 'hide' => (int) $auth_only, + '_csrf' => yii::$app->request->getCsrfToken() + ]; } else { + // GET-запрос + return $this->render('/search/index'); } } diff --git a/mirzaev/skillparts/system/migrations/arangodb/m210303_192326_create_order_collection.php b/mirzaev/skillparts/system/migrations/arangodb/m210303_192326_create_order_collection.php new file mode 100644 index 0000000..a15e13b --- /dev/null +++ b/mirzaev/skillparts/system/migrations/arangodb/m210303_192326_create_order_collection.php @@ -0,0 +1,16 @@ +createCollection('order', []); + } + + public function down() + { + $this->dropCollection('order'); + } +} diff --git a/mirzaev/skillparts/system/migrations/arangodb/m210303_192451_create_order_edge_supply_collection.php b/mirzaev/skillparts/system/migrations/arangodb/m210303_192451_create_order_edge_supply_collection.php new file mode 100644 index 0000000..6702229 --- /dev/null +++ b/mirzaev/skillparts/system/migrations/arangodb/m210303_192451_create_order_edge_supply_collection.php @@ -0,0 +1,16 @@ +createCollection('order_edge_supply', ['type' => 3]); + } + + public function down() + { + $this->dropCollection('order_edge_supply'); + } +} diff --git a/mirzaev/skillparts/system/migrations/arangodb/m210307_000210_create_account_edge_order_collection.php b/mirzaev/skillparts/system/migrations/arangodb/m210307_000210_create_account_edge_order_collection.php new file mode 100644 index 0000000..a357407 --- /dev/null +++ b/mirzaev/skillparts/system/migrations/arangodb/m210307_000210_create_account_edge_order_collection.php @@ -0,0 +1,16 @@ +createCollection('account_edge_order', ['type' => 3]); + } + + public function down() + { + $this->dropCollection('account_edge_order'); + } +} diff --git a/mirzaev/skillparts/system/models/AccountEdgeOrder.php b/mirzaev/skillparts/system/models/AccountEdgeOrder.php new file mode 100644 index 0000000..ef138d5 --- /dev/null +++ b/mirzaev/skillparts/system/models/AccountEdgeOrder.php @@ -0,0 +1,13 @@ +$attribute)) { return true; diff --git a/mirzaev/skillparts/system/models/Notification.php b/mirzaev/skillparts/system/models/Notification.php index b81eda5..d0e9380 100644 --- a/mirzaev/skillparts/system/models/Notification.php +++ b/mirzaev/skillparts/system/models/Notification.php @@ -7,7 +7,9 @@ namespace app\models; use yii; use yii\web\IdentityInterface; -use app\models\traits\SearchByAccount; +use app\models\traits\SearchByEdge; + +use Exception; /** * Поиск @@ -16,7 +18,7 @@ use app\models\traits\SearchByAccount; */ class Notification extends Document { - use SearchByAccount; + use SearchByEdge; /** * Сценарий для доверенного пользователя с созданием уведомления @@ -116,9 +118,9 @@ class Notification extends Document public function write(string $html = null, IdentityInterface|array|string $trgt = null, string $type = 'notice'): self|array|null { // Инициализация - isset($this->html) ? $html = $this->html : null; - isset($this->trgt) ? $trgt = $this->trgt : null; - isset($this->type) ? $type = $this->type : null; + $html ?? $html = $this->html ?? throw new Exception('Не удалось инициализировать содержимое'); + $trgt ?? $trgt = yii::$app->user ?? throw new Exception('Не удалось инициализировать получателя'); + $type ?? $trgt = $this->type ?? throw new Exception('Не удалось инициализировать тип'); // Инициализация уведомления if (isset($html) && (bool) (int) $html) { @@ -193,15 +195,6 @@ class Notification extends Document return AccountEdgeNotification::writeSafe($this->readId(), $target->readId(), $type) ? $this : null; } - // "or" имеет приоритет ниже чем у "||" относительно "=" - // - // if ($target = $buffer = Account::searchById($target) or - // $target = Account::searchById(Account::collectionName() . '/' . $buffer) - // ) { - // - // if (($target = Account::searchById($target)) || - // ($target = Account::searchById(Account::collectionName() . '/' . $target)) - // ) { if ($target = Account::searchById(Account::collectionName() . '/' . $target)) { // Аккаунт найден diff --git a/mirzaev/skillparts/system/models/Order.php b/mirzaev/skillparts/system/models/Order.php new file mode 100644 index 0000000..fff408a --- /dev/null +++ b/mirzaev/skillparts/system/models/Order.php @@ -0,0 +1,186 @@ +user ?? throw new Exception('Не удалось инициализировать заказчика'); + + if ($supply instanceof Supply) { + // Передана инстанция класса поставки + + // Унификация входных данных + $supply = [$supply, 1]; + } + + if (is_null($this->_key)) { + // Корзина не инициализирована + + // Инициализация + if (!$this->save()) { + // Инициализация заказа не удалась + + throw new Exception('Ошибка при записи заказа в базу данных'); + } + + // Инициализация ребра: АККАУНТ -> ЗАКАЗ + if (!AccountEdgeOrder::write($trgt->readId(), $this->readId(), 'create')) { + // Инициализация не удалась + + throw new Exception('Ошибка при записи ребра от аккаунта до заказа в базу данных'); + } + } + + foreach ($supply as $supply_raw) { + // Перебор поставок + + for ($i = 0; $i < $supply_raw[1]; $i++) { + // Создание рёбер соразмерно запросу (добавление нескольких продуктов в корзину) + + // Инициализация ребра: ЗАКАЗ -> ПОСТАВКА + if (!$supply = Supply::searchByCatn($supply_raw[0]) or !OrderEdgeSupply::write($this->readId(), $supply->readId(), 'add')) { + // Поставка не найдена или инициализация ребра не удалась + + continue; + } + } + } + + // Отправка на сервер базы данных + return $this->save() ? $this : null; + } + + /** + * Поиск заказа + */ + public static function search(Account $account = null, string $type = 'current', int $limit = 1): self|array + { + $account or $account = yii::$app->user ?? throw new Exception('Не удалось инициализировать пользователя'); + + $return = self::searchByEdge( + from: 'account', + to: 'order', + subquery_where: [ + [ + 'account._id' => $account->id + ], + [ + 'account_edge_order.type' => $type + ] + ], + limit: $limit, + sort: ['DESC'], + direction: 'INBOUND' + ); + + return $limit === 1 ? $return[0] : $return; + } + + /** + * Поиск содержимого заказа + * + * @todo В будущем возможно заказ не только поставок реализовать + */ + public function content(int $limit = 1, int $page = 1): Supply|array + { + // Генерация сдвига по запрашиваемым данным (пагинация) + $offset = $limit * ($page - 1); + + // Поиск рёбер: ЗАКАЗ -> ПОСТАВКА + $return = Supply::searchByEdge( + from: 'order', + to: 'supply', + edge: 'order_edge_supply', + subquery_where: [ + [ + 'order._id' => $this->readId() + ], + [ + 'order_edge_supply.type' => 'add' + ] + ], + foreach: ['edge' => 'order_edge_supply'], + where: 'edge._to == supply._id', + limit: $limit, + offset: $offset + ); + + return $limit === 1 ? $return[0] : $return; + } +} diff --git a/mirzaev/skillparts/system/models/OrderEdgeSupply.php b/mirzaev/skillparts/system/models/OrderEdgeSupply.php new file mode 100644 index 0000000..a9b5020 --- /dev/null +++ b/mirzaev/skillparts/system/models/OrderEdgeSupply.php @@ -0,0 +1,13 @@ + 'Название (name)', - 'ocid' => 'Идентификатор 1C (ocid)', - 'catn' => 'Каталожный номер (catn)', - 'imgs' => 'Изображения (imgs)', - 'oemn' => 'OEM номера (oemn)', - // 'data' => 'Данные товара (data)', - // 'cost' => 'Цены (cost)', - // 'time' => 'Сроки доставки (time)', + 'name' => 'Название', + 'desc' => 'Описание', + 'ocid' => 'Идентификатор 1C', + 'catn' => 'Каталожный номер', + 'imgs' => 'Изображения', + 'time' => 'Срок доставки', + 'oemn' => 'OEM номера', + 'cost' => 'Стоимость', 'file' => 'Документ', 'group' => 'Группа' ] @@ -284,7 +287,7 @@ class Product extends Document * * @todo Переделать нормально */ - public static function searchByCatn(string $catn, int $limit = 1, array $select = ['catn' => 'catn']): static|array|null + public static function searchByCatn(string $catn, int $limit = 1, array $select = []): static|array|null { if ($limit <= 1) { return static::findOne(['catn' => $catn]); diff --git a/mirzaev/skillparts/system/models/Search.php b/mirzaev/skillparts/system/models/Search.php index 9f77f1d..c4b8f43 100644 --- a/mirzaev/skillparts/system/models/Search.php +++ b/mirzaev/skillparts/system/models/Search.php @@ -7,7 +7,7 @@ namespace app\models; use yii; use yii\web\IdentityInterface; -use app\models\traits\SearchByAccount; +use app\models\traits\SearchByEdge; /** * Поиск @@ -16,7 +16,7 @@ use app\models\traits\SearchByAccount; */ class Search extends Document { - use SearchByAccount; + use SearchByEdge; /** * Имя коллекции diff --git a/mirzaev/skillparts/system/models/Supply.php b/mirzaev/skillparts/system/models/Supply.php index 8ce6355..dd7ba0d 100644 --- a/mirzaev/skillparts/system/models/Supply.php +++ b/mirzaev/skillparts/system/models/Supply.php @@ -24,11 +24,15 @@ use exception; */ class Supply extends Product implements ProductInterface { - /** - * Метод для конвертации XML в Array - */ use Xml2Array; + /** + * Количество + * + * Используется при выводе в корзине + */ + public int $amnt = 0; + /** * Имя коллекции */ @@ -68,14 +72,14 @@ class Supply extends Product implements ProductInterface */ public function afterSave($data, $vars): void { - if (AccountEdgeSupply::searchByVertex(Yii::$app->user->id, $this->readId())) { + if (AccountEdgeSupply::searchByVertex(yii::$app->user->id, $this->readId())) { // Ребро уже существует } else { // Ребра не существует // Запись ребра: АККАУНТ -> ПОСТАВКА - (new AccountEdgeSupply)->write(Yii::$app->user->id, $this->readId(), 'import'); + (new AccountEdgeSupply)->write(yii::$app->user->id, $this->readId(), 'import'); } } @@ -100,6 +104,39 @@ class Supply extends Product implements ProductInterface return true; } + /** + * Поиск через связь с аккаунтом + * + * @param string $id Идентификатор пользователя + * @param bool $select Запрашиваемые значения + */ + public static function searchByAccount(string $id = null, string|array $select = []): array + { + isset($id) ?: $id = yii::$app->user->id ?? throw new Exception('Не найден идентификатор'); + + return self::searchByEdge( + from: 'account', + to: 'supply', + subquery_where: [ + [ + 'account._id' => $id + ] + ], + where: 'supply._id == account_edge_supply[0]._to AND supply.onec["ЗначенияСвойств"] != null', + select: $select, + // handle: function ($request) { + // $response = $request->createCommand()->execute()->getAll(); + + // foreach ($response as &$attribute) { + // // Приведение всех свойств в массив и очистка от лишних данных + + // $attribute = $attribute->getAll(); + // } + + // return $response; + // } + ); + } /** * Запись данных свойств по UUID 1C @@ -112,7 +149,7 @@ class Supply extends Product implements ProductInterface public static function createProperties1c($properties): void { // Инициализация - $models = self::searchByAccount(Yii::$app->user->id, true); + $models = self::searchByAccount(select: 'supply.onec["ЗначенияСвойств"]'); $properties = self::xml2array($properties->xml); // for ($i = 0; $i <= count($models); $i++) @@ -269,6 +306,14 @@ class Supply extends Product implements ProductInterface foreach ($product as $product) { // Перебор всех инициализированных продуктов + if ($this->catn !== $product->catn) { + // Каталожные номера не соответствуют друг другу + + continue; + } + + // Код ниже скорее всего устарел + if (SupplyEdgeProduct::searchByVertex($this->readId(), $product->readId())) { // Ребро уже существует @@ -279,7 +324,7 @@ class Supply extends Product implements ProductInterface $return = (new SupplyEdgeProduct)->write( $this->readId(), $product->readId(), - 'sell', + 'connect', [ 'onec' => self::xml2array($offer->xml) ] @@ -304,6 +349,7 @@ class Supply extends Product implements ProductInterface // Настройка $model->ocid = $id ?? null; $model->catn = (string) $product->Артикул; + $model->desc = (string) $product->Описание; $model->onec = self::xml2array($product->xml); if (isset($model->onec['ЗначенияСвойств'])) { @@ -378,43 +424,12 @@ class Supply extends Product implements ProductInterface } /** - * Поиск через связь с аккаунтом + * Поиск по OEM-номерам * - * @param string $id Идентификатор пользователя - * @param bool $full Возврат всех значений (иначе только свойства) + * @todo Реализовать с помощью LIKE */ - public static function searchByAccount(string $id = null, bool $full = false): array + public static function searchByOemn(): array { - if (!isset($id)) { - $id = yii::$app->user->id ?? throw new exception('Не найден идентификатор'); - } - - $subquery = static::find() - ->for(['account', 'account_edge_supply']) - ->traversal('supply')->in('account_edge_supply') - ->where(['account._id' => $id]) - ->select('account_edge_supply') - ->createCommand(); - - $query = static::find() - ->params($subquery->getBindVars()) - ->let('account_edge_supply', '(' . (string) $subquery . ')') - ->where('supply._id == account_edge_supply[0]._to') - ->andWhere('supply.onec["ЗначенияСвойств"] != null'); - - if ($full) { - // Если указан полный поиск - return $query->select('supply')->all(); - } - - $query = $query->select('supply.onec["ЗначенияСвойств"]')->createCommand()->execute()->getAll(); - - foreach ($query as &$attribute) { - // Приведение всех свойств в массив и очистка от лишних данных - - $attribute = $attribute->getAll(); - } - - return $query; + return []; } } diff --git a/mirzaev/skillparts/system/models/traits/SearchByAccount.php b/mirzaev/skillparts/system/models/traits/SearchByAccount.php deleted file mode 100644 index 9c3e6b4..0000000 --- a/mirzaev/skillparts/system/models/traits/SearchByAccount.php +++ /dev/null @@ -1,74 +0,0 @@ -user->id ?? throw new exception('Не найден идентификатор'); - } - - $subquery = static::find() - ->for(['account', 'account_edge_' . self::collectionName()]) - ->traversal(self::collectionName(), $direction) - ->in('account_edge_' . self::collectionName()) - ->where(['account._id' => $id]); - - if (!empty($where)) { - // Переданы дополнительные условия фильтрации - - $subquery->where($where); - } - - $subquery = $subquery->select('account_edge_' . self::collectionName()) - ->createCommand(); - - $query = static::find() - ->params($params, $subquery->getBindVars()) - ->let('account_edge_' . self::collectionName(), '(' . (string) $subquery . ')') - ->limit($limit) - ->offset($offset) - ->orderBy($sort); - - if (!empty($let)) { - // Переданы дополнительные условия фильтрации - - $query->let(...$let); - } - - if (isset($post_where) && $post_where) { - // Если переданы дополнительные условия фильтрации - - $query->where($post_where); - } else { - $query->where(self::collectionName() . '._id == account_edge_' . self::collectionName() . '[0]._to'); - } - - return $query->select(self::collectionName())->all(); - } -} diff --git a/mirzaev/skillparts/system/models/traits/SearchByEdge.php b/mirzaev/skillparts/system/models/traits/SearchByEdge.php new file mode 100644 index 0000000..fbd6214 --- /dev/null +++ b/mirzaev/skillparts/system/models/traits/SearchByEdge.php @@ -0,0 +1,83 @@ +for([$from, $edge ?? $from . '_edge_' . $to]) + ->traversal($to, $direction) + ->in($edge ?? $from . '_edge_' . $to) + ->where($subquery_where); + + $subquery = $subquery->select($edge ?? $from . '_edge_' . $to) + ->createCommand(); + + $query = static::find() + ->params($params, $subquery->getBindVars()) + ->let($edge ?? $from . '_edge_' . $to, '(' . (string) $subquery . ')') + ->limit($limit) + ->offset($offset) + ->orderBy($sort); + + if (!empty($let)) { + // Переданы дополнительные условия фильтрации + + $query->let(...$let); + } + + // Запрос + $request = $query + ->foreach($foreach) + ->where($where) + ->select($select ?? $to); + + if (isset($handle)) { + // Передана функция для постобработки + + return $handle($request); + } else if (isset($select)) { + $response = $request->createCommand()->execute()->getAll(); + + foreach ($response as &$attribute) { + // Приведение всех свойств в массив и очистка от лишних данных + + $attribute = $attribute->getAll(); + } + + return $response; + } else { + return $request->all(); + } + } +} diff --git a/mirzaev/skillparts/system/views/account/authentication.php b/mirzaev/skillparts/system/views/account/authentication.php index 76715be..6f777c7 100644 --- a/mirzaev/skillparts/system/views/account/authentication.php +++ b/mirzaev/skillparts/system/views/account/authentication.php @@ -5,12 +5,12 @@ declare(strict_types=1); use yii; ?> - - + +
Личный кабинет - + // HTML; + // } ?>
- + diff --git a/mirzaev/skillparts/system/views/product/index.php b/mirzaev/skillparts/system/views/product/index.php index ca76b47..34faee6 100644 --- a/mirzaev/skillparts/system/views/product/index.php +++ b/mirzaev/skillparts/system/views/product/index.php @@ -9,7 +9,7 @@ use app\models\Product;
-
+
@@ -126,5 +126,5 @@ use app\models\Product;
-
+
\ No newline at end of file diff --git a/mirzaev/skillparts/system/views/profile/index.php b/mirzaev/skillparts/system/views/profile/index.php index e016eb6..8a5d2f4 100644 --- a/mirzaev/skillparts/system/views/profile/index.php +++ b/mirzaev/skillparts/system/views/profile/index.php @@ -57,13 +57,14 @@ use app\models\Supply; // Инициализация isset($model) or $model = yii::$app->user->identity; - isset($attributes) or $attributes = Supply::searchByAccount(yii::$app->user->id); + isset($supplies) or $supplies = Supply::searchByAccount(select: 'supply.onec["ЗначенияСвойств"]'); $list = []; // Перебор свойств поставок - foreach ($attributes as $attribute) { + foreach ($supplies as $supply) { // Инициализация - $id = $attribute['ЗначенияСвойства']['Ид']; + + $id = $supply['ЗначенияСвойства']['Ид']; if (in_array($id, $list, true)) { // Если встретился дубликат (вызывается очень часто) @@ -71,7 +72,7 @@ use app\models\Supply; } // Генерация - $list[$id] = $attribute['ЗначенияСвойства']['Наименование']; + $list[$id] = $supply['ЗначенияСвойства']['Наименование']; } // Инициализация текущего значения параметра в начале массива diff --git a/mirzaev/skillparts/system/views/search/index.php b/mirzaev/skillparts/system/views/search/index.php index cd42bfb..2011aae 100644 --- a/mirzaev/skillparts/system/views/search/index.php +++ b/mirzaev/skillparts/system/views/search/index.php @@ -2,16 +2,10 @@ + HTML; + + // echo << + //
+ //
+ // + //
+ //
+ //
$catn
+ //
+ //
+ // {$amnt}шт + //

1000р

+ //
+ //
+ // + //
+ //
+ // + // HTML; + + // if (++$i % 4 === 0 && $amount - $i !== 0) { + // echo << + // HTML; + // } + } + } else { + echo <<

Ничего не найдено

HTML; - } } - ?> - + } + ?> - \ No newline at end of file + + + \ No newline at end of file diff --git a/mirzaev/skillparts/system/views/loading.php b/mirzaev/skillparts/system/views/search/loading.php similarity index 100% rename from mirzaev/skillparts/system/views/loading.php rename to mirzaev/skillparts/system/views/search/loading.php diff --git a/mirzaev/skillparts/system/views/search/panel.php b/mirzaev/skillparts/system/views/search/panel.php index 90fd4bc..067d8cf 100644 --- a/mirzaev/skillparts/system/views/search/panel.php +++ b/mirzaev/skillparts/system/views/search/panel.php @@ -7,7 +7,19 @@ use app\models\Search; if (isset($history) && $history) { // Отображение истории - if (!yii::$app->user->isGuest && $rows = Search::searchByAccount(sort: ['DESC'])) { + if (yii::$app->user->isGuest) { + // Не аутентифицирован + + // В будущем выводить историю из cookie + + echo <<Войдите для просмотра истории поиска

+ HTML; + } else if ($rows = Search::searchByEdge( + from: 'account', + to: 'search', + sort: ['DESC'] + )) { // История поиска существует foreach ($rows as $row) { diff --git a/mirzaev/skillparts/system/web/css/pages/cart.css b/mirzaev/skillparts/system/web/css/pages/cart.css new file mode 100644 index 0000000..1a6c510 --- /dev/null +++ b/mirzaev/skillparts/system/web/css/pages/cart.css @@ -0,0 +1,11 @@ +#page_cart article { + background-color: #fff; +} + +#page_cart article .list .row:nth-child(2n+1) { + background-color: #f5f2fa; +} + +#page_cart article .list .row:first-child { + background-color: #edeaf2; +} \ No newline at end of file diff --git a/mirzaev/skillparts/system/web/css/pages/search.css b/mirzaev/skillparts/system/web/css/pages/search.css index 6d9e2d8..6bcdf8f 100644 --- a/mirzaev/skillparts/system/web/css/pages/search.css +++ b/mirzaev/skillparts/system/web/css/pages/search.css @@ -1,12 +1,22 @@ -#page_search nav > div, #page_search article > div { +#page_search nav>div, +#page_search article>div>div { + height : 65px; background-color: #fff; + border-right : 0 solid #fff; + transition : 100ms ease-in; } -#page_search .search_card:hover { +/* #page_search nav > div, #page_search article > div:hover > div { + height: 68px; + border-right: 6px solid #e1e1ea; + border-radius: .25rem 0 0 .25rem !important; +} */ + +#page_search .search_card:hover { background-color: #eaeaf0; } -#page_search .search_card:hover img { +#page_search .search_card:hover img { border: 1px solid #e1e1ea; } diff --git a/mirzaev/skillparts/system/web/js/account.js b/mirzaev/skillparts/system/web/js/account.js index 55c2c53..e8f06bb 100644 --- a/mirzaev/skillparts/system/web/js/account.js +++ b/mirzaev/skillparts/system/web/js/account.js @@ -57,6 +57,13 @@ function authentication(form) { // Обновление документа $('meta[name=csrf-token]').prop("content", data._csrf); } + + // Реинициализация панели поиска + // Перенести в отдельный файл который подгружается в зависимости от настроек + // search_panel_show(); + + // Обновление панели поиска + product_search(); }, error: function (data, status) { if (data.responseJSON.main !== undefined) { @@ -108,6 +115,13 @@ function deauthentication() { // Обновление документа $('meta[name=csrf-token]').prop("content", data._csrf); } + + // Реинициализация панели поиска + // Перенести в отдельный файл который подгружается в зависимости от настроек + // search_panel_hide(); + + // Обновление панели поиска + product_search(); } }); }; diff --git a/mirzaev/skillparts/system/web/js/cart.js b/mirzaev/skillparts/system/web/js/cart.js new file mode 100644 index 0000000..fe4d0b1 --- /dev/null +++ b/mirzaev/skillparts/system/web/js/cart.js @@ -0,0 +1,61 @@ +function cart_write(catn, amount = 1) { + $.ajax({ + url: '/order/write', + type: 'post', + dataType: 'json', + data: { + '_csrf': yii.getCsrfToken(), + 'supplies': [ + catn, + amount + ] + }, + success: cart_success, + error: cart_error + }); + + return false; +} + + +function cart_success(data, status) { + // Обработка ответов от удавшихся запросов + + // Основной блок + if (data.main !== undefined) { + main = document.getElementsByTagName('main')[0]; + + // Обновление документа + main.innerHTML = data.main; + + // Реинициализация + reinitialization(main); + } + + // CSRF-токен + if (data._csrf !== undefined) { + // Обновление документа + $('meta[name=csrf-token]').prop("content", data._csrf); + } +} + +function cart_error(data, status) { + // Обработка ответов от неудавшихся запросов + + // Основной блок + if (data.responseJSON.main !== undefined) { + main = document.getElementsByTagName('main')[0]; + + // Обновление окна результатов поиска + main.innerHTML = data.main; + + // Реинициализация + reinitialization(main); + } + + // CSRF-токен + if (data.responseJSON._csrf !== undefined) { + // Обновление документа + $('meta[name=csrf-token]').prop("content", data.responseJSON._csrf); + } +} \ No newline at end of file diff --git a/mirzaev/skillparts/system/web/js/menu.js b/mirzaev/skillparts/system/web/js/menu.js index f075a27..22df467 100644 --- a/mirzaev/skillparts/system/web/js/menu.js +++ b/mirzaev/skillparts/system/web/js/menu.js @@ -7,97 +7,44 @@ function page_main() { type: 'post', dataType: 'json', data: { '_csrf': yii.getCsrfToken() }, - success: function (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); - } - if (data._csrf !== undefined) { - // Обновление документа - $('meta[name=csrf-token]').prop("content", data._csrf); - } - }, - error: function (data, status) { - if (data.responseJSON.main !== undefined) { - main = document.getElementsByTagName('main')[0]; - - // Обновление документа - main.innerHTML = data.responseJSON.main; - - // Реинициализация - reinitialization(main); - } - if (data.responseJSON.redirect !== undefined) { - // Перенаправление - history.pushState({}, document.title, data.responseJSON.redirect); - } - if (data.responseJSON._csrf !== undefined) { - // Обновление документа - $('meta[name=csrf-token]').prop("content", data.responseJSON._csrf); - } - } + success: menu_success, + error: menu_error }); } return false; -}; +} function page_profile() { - url = '/profile' + if (document.getElementById('page_profile') === null) { + url = '/profile' - $.ajax({ - url: url, - type: 'post', - dataType: 'json', - data: { '_csrf': yii.getCsrfToken() }, - success: function (data, status) { - if (data.main !== undefined) { - main = document.getElementsByTagName('main')[0]; + $.ajax({ + url: url, + type: 'post', + dataType: 'json', + data: { '_csrf': yii.getCsrfToken() }, + success: menu_success, + error: menu_error + }); + } - // Обновление документа - main.innerHTML = data.main; + return false; +} - // Реинициализация - reinitialization(main); - } - if (data.redirect !== undefined) { - // Перенаправление - history.pushState({}, document.title, data.redirect); - } - if (data._csrf !== undefined) { - // Обновление документа - $('meta[name=csrf-token]').prop("content", data._csrf); - } - }, - error: function (data, status) { - if (data.responseJSON.main !== undefined) { - main = document.getElementsByTagName('main')[0]; +function page_cart() { + if (document.getElementById('page_cart') === null) { + url = '/cart' - // Обновление документа - main.innerHTML = data.responseJSON.main; - - // Реинициализация - reinitialization(main); - } - if (data.responseJSON.redirect !== undefined) { - // Перенаправление - history.pushState({}, document.title, data.responseJSON.redirect); - } - if (data.responseJSON._csrf !== undefined) { - // Обновление документа - $('meta[name=csrf-token]').prop("content", data.responseJSON._csrf); - } - } - }); + $.ajax({ + url: url, + type: 'post', + dataType: 'json', + data: { '_csrf': yii.getCsrfToken() }, + success: menu_success, + error: menu_error + }); + } return false; }; @@ -105,4 +52,76 @@ function page_profile() { function notifications() { return false; +} + + +function menu_success(data, status) { + // Обработка ответов от удавшихся запросов + + // Основной блок + if (data.main !== undefined) { + // Инициализация + main = document.getElementsByTagName('main')[0]; + + // Обновление документа + main.innerHTML = data.main; + + // Реинициализация + reinitialization(main); + } + + // Заголовок + if (data.title !== undefined) { + // Запись + document.title = data.title; + } + + // Перенаправление + if (data.redirect !== undefined) { + // Перенаправление + history.pushState({}, document.title, data.redirect); + } + + // CSRF-токен + if (data._csrf !== undefined) { + // Обновление документа + $('meta[name=csrf-token]').prop("content", data._csrf); + } +} + +function menu_error(data, status) { + // Обработка ответов от неудавшихся запросов + + // Инициализация + data = data.responseJSON; + + // Основной блок + if (data.main !== undefined) { + // Инициализация + main = document.getElementsByTagName('main')[0]; + + // Обновление окна результатов поиска + main.innerHTML = data.main; + + // Реинициализация + reinitialization(main); + } + + // Заголовок + if (data.title !== undefined) { + // Запись + document.title = data.title; + } + + // Перенаправление + if (data.redirect !== undefined) { + // Перенаправление + history.pushState({}, document.title, data.redirect); + } + + // CSRF-токен + if (data._csrf !== undefined) { + // Обновление документа + $('meta[name=csrf-token]').prop("content", data._csrf); + } } \ No newline at end of file diff --git a/mirzaev/skillparts/system/web/js/search.js b/mirzaev/skillparts/system/web/js/search.js index 5fbaf66..238635d 100644 --- a/mirzaev/skillparts/system/web/js/search.js +++ b/mirzaev/skillparts/system/web/js/search.js @@ -1,5 +1,5 @@ -function product_search(line, advanced = 0) { - if (line.value.length > 1) { +function product_search(text = '', advanced = 0) { + if (text.length > 1) { // Проверка на длину запроса пройдена $.ajax({ @@ -10,13 +10,13 @@ function product_search(line, advanced = 0) { '_csrf': yii.getCsrfToken(), 'type': 'product', 'advanced': advanced, - 'request': line.value + 'request': text }, success: function (data, status) { - search_panel_success(line, advanced, data, status); + search_panel_success(text, advanced, data, status); }, error: function (data, status) { - search_panel_error(line, advanced, data, status); + search_panel_error(text, advanced, data, status); }, statusCode: search_panel_statusCode() }); @@ -27,7 +27,7 @@ function product_search(line, advanced = 0) { } }; -function product_search_history(line, advanced = 0) { +function product_search_history(text = '', advanced = 0) { $.ajax({ url: '/search', type: 'post', @@ -38,45 +38,39 @@ function product_search_history(line, advanced = 0) { 'history': true }, success: function (data, status) { - search_panel_success(line, advanced, data, status); + search_panel_success(text, advanced, data, status); }, error: function (data, status) { - search_panel_error(line, advanced, data, status); + search_panel_error(text, advanced, data, status); }, statusCode: search_panel_statusCode() }); } -function search_panel_success(line, advanced, data, status) { - if (data.search_line_window !== undefined) { - search_line_window = document.getElementById('search_line_window'); +function search_panel_show(line = 'search_line', panel = 'search_line_window') { + // Показ панели поиска - // Обновление окна результатов поиска - search_line_window.innerHTML = data.search_line_window; + // Активация + document.getElementById(panel).style.display = ''; - // Отображение окна (потом надо переделать) - $('#search_line').dropdown('show'); + // Открытие + $('#' + line).dropdown('show'); +} - // Реинициализация - reinitialization(search_line_window); - } - if (data.timer !== undefined) { - // Ожидание перед повторным запросом +function search_panel_hide(line = 'search_line', panel = 'search_line_window') { + // Сокрытие панели поиска - if (getCookie('search') !== 'processing') { - // На данный момент нет других запросов поиска + // Закрытие + $('#' + line).dropdown('hide'); - // Запись о существовании запроса - document.cookie = "search=processing; path=/"; + // Деактивация + document.getElementById(panel).style.display = 'none'; +} - // Запрос - setTimeout(product_search, data.timer + '000', line, advanced); - } - } - if (data.search_line_window_hide === 1) { - // Скрытие окна (потом надо переделать) - $('#search_line').dropdown('hide'); - } +function search_panel_success(text, advanced, data, status) { + // Обработка ответов от удавшихся запросов + + // Основной блок if (data.main !== undefined) { main = document.getElementsByTagName('main')[0]; @@ -86,29 +80,61 @@ function search_panel_success(line, advanced, data, status) { // Реинициализация reinitialization(main); } - if (data.redirect !== undefined) { - // Перенаправление - history.pushState({}, document.title, data.redirect); - } - if (data._csrf !== undefined) { - // Обновление документа - $('meta[name=csrf-token]').prop("content", data._csrf); - } -}; -function search_panel_error(line, advanced, data, status) { - if (data.responseJSON.search_line_window !== undefined) { - search_line_window = document.getElementById('search_line_window'); + // Окно поиска + if (data.panel !== undefined) { + panel = document.getElementById('search_line_window'); // Обновление окна результатов поиска - search_line_window.innerHTML = data.responseJSON.search_line_window; + panel.innerHTML = data.panel; // Отображение окна (потом надо переделать) $('#search_line').dropdown('show'); // Реинициализация - reinitialization(search_line_window); + reinitialization(panel); } + + // Таймер для повтора запроса + if (data.timer !== undefined) { + // Ожидание перед повторным запросом + + if (getCookie('search') !== 'processing') { + // На данный момент нет других запросов поиска + + // Запись о существовании запроса + search_panel_statusCode_progress(); + + // Запрос + setTimeout(product_search, data.timer + '000', text, advanced); + } + } + + // Перенаправление + if (data.redirect !== undefined) { + // Перенаправление + history.pushState({}, document.title, data.redirect); + } + + if (data.responseJSON.hide === 1) { + } + + // Сокрытие окна поиска + if (data.search_line_window_hide === 1) { + search_panel_hide(); + } + + // CSRF-токен + if (data._csrf !== undefined) { + // Обновление документа + $('meta[name=csrf-token]').prop("content", data._csrf); + } +} + +function search_panel_error(text, advanced, data, status) { + // Обработка ответов от неудавшихся запросов + + // Основной блок if (data.responseJSON.main !== undefined) { main = document.getElementsByTagName('main')[0]; @@ -118,10 +144,28 @@ function search_panel_error(line, advanced, data, status) { // Реинициализация reinitialization(main); } + + // Окно поиска + if (data.responseJSON.panel !== undefined) { + panel = document.getElementById('search_line_window'); + + // Обновление окна результатов поиска + panel.innerHTML = data.responseJSON.panel; + + // Отображение окна (потом надо переделать) + $('#search_line').dropdown('show'); + + // Реинициализация + reinitialization(panel); + } + + // Перенаправление if (data.responseJSON.redirect !== undefined) { // Перенаправление history.pushState({}, document.title, data.responseJSON.redirect); } + + // Таймер для повтора запроса if (data.responseJSON.timer !== undefined) { // Ожидание перед повторным запросом @@ -129,30 +173,40 @@ function search_panel_error(line, advanced, data, status) { // На данный момент нет других запросов поиска // Запись о существовании запроса - document.cookie = "search=processing; path=/"; + search_panel_statusCode_progress(); // Запрос - setTimeout(product_search, data.responseJSON.timer + '000', line, advanced); + setTimeout(product_search, data.responseJSON.timer + '000', text, advanced); } } - if (data.responseJSON.search_line_window_hide === 1) { - // Скрытие окна (потом надо переделать) - $('#search_line').dropdown('hide'); + + // Сокрытие окна поиска + if (data.responseJSON.hide === 1) { + search_panel_hide(); } + + // CSRF-токен if (data.responseJSON._csrf !== undefined) { // Обновление документа $('meta[name=csrf-token]').prop("content", data.responseJSON._csrf); } -}; +} function search_panel_statusCode() { return { 200: search_panel_statusCode_waiting, 404: search_panel_statusCode_waiting, }; -}; +} function search_panel_statusCode_waiting() { // Ожидание нового запроса document.cookie = "search=waiting; path=/"; -}; \ No newline at end of file + document.body.style.cursor = "unset"; +} + +function search_panel_statusCode_progress() { + // Выполнение запроса + document.cookie = "search=processing; path=/"; + document.body.style.cursor = "progress"; +} \ No newline at end of file