diff --git a/mirzaev/skillparts/system/config/web.php.example b/mirzaev/skillparts/system/config/web.php.example index f4d6996..e4ba6de 100644 --- a/mirzaev/skillparts/system/config/web.php.example +++ b/mirzaev/skillparts/system/config/web.php.example @@ -100,7 +100,7 @@ $config = [ '<_key:[0-9]+>/' => 'account/', 'product//' => 'product/index', 'product///' => 'product/', - '///' => '
/-', + '////' => '
/-', 'products///' => 'product/', 'profile/geolocation/' => 'profile/geolocation-', 'profile/panel///' => 'profile/panel---', diff --git a/mirzaev/skillparts/system/controllers/ProductController.php b/mirzaev/skillparts/system/controllers/ProductController.php index 3b2ba50..2db8ed4 100644 --- a/mirzaev/skillparts/system/controllers/ProductController.php +++ b/mirzaev/skillparts/system/controllers/ProductController.php @@ -50,6 +50,8 @@ class ProductController extends Controller 'disconnect', 'edit-title', 'edit-catn', + 'edit-prod', + 'edit-name', 'edit-dscr', 'edit-dmns', 'edit-wght', @@ -634,6 +636,120 @@ class ProductController extends Controller } } + public function actionEditProd(string $catn, string $prod): array|string|null + { + // Инициализация + $return = [ + '_csrf' => yii::$app->request->getCsrfToken() + ]; + + if (empty($catn) || empty($prod)) { + // Не получен артикул + + yii::$app->response->statusCode = 500; + + goto end; + } + + if ($model = Product::searchByCatnAndProd($catn, $prod)) { + // Товар найден + + // Инициализация + $text = yii::$app->request->post('text') ?? yii::$app->request->get('text') ?? 'Без названия'; + + $model->prod = $text; + + if ($model->save()) { + // Товар обновлён + + $return['main'] = $this->renderPartial('index', compact('model')); + $return['redirect'] = "/product/$model->prod/$model->catn"; + } + } + + /** + * Конец алгоритма + */ + end: + + if (yii::$app->request->isPost) { + // POST-запрос + + yii::$app->response->format = Response::FORMAT_JSON; + + return $return; + } + + if (Product::searchByCatnAndProd($catn, $prod)) { + // Старый товар ещё существует (подразумевается, что произошла ошибка) + + // Возврат на страницу товара + return $this->redirect("/product/$prod/$catn"); + } else { + // Старый товар не существует (подразумевается, что его артикул успешно изменён) + + // Переадресация на новую страницу товара + return $this->redirect("/product/$model->catn"); + } + } + + public function actionEditName(string $catn, string $prod): array|string|null + { + // Инициализация + $return = [ + '_csrf' => yii::$app->request->getCsrfToken() + ]; + + if (empty($catn) || empty($prod)) { + // Не получен артикул + + yii::$app->response->statusCode = 500; + + goto end; + } + + if ($model = Product::searchByCatnAndProd($catn, $prod)) { + // Товар найден + + // Инициализация + $text = yii::$app->request->post('text') ?? yii::$app->request->get('text') ?? 'Без названия'; + + $model->name = $text; + + if ($model->save()) { + // Товар обновлён + + $return['main'] = $this->renderPartial('index', compact('model')); + $return['redirect'] = "/product/$model->prod/$model->catn"; + } + } + + /** + * Конец алгоритма + */ + end: + + if (yii::$app->request->isPost) { + // POST-запрос + + yii::$app->response->format = Response::FORMAT_JSON; + + return $return; + } + + if (Product::searchByCatnAndProd($catn, $prod)) { + // Старый товар ещё существует (подразумевается, что произошла ошибка) + + // Возврат на страницу товара + return $this->redirect("/product/$prod/$catn"); + } else { + // Старый товар не существует (подразумевается, что его артикул успешно изменён) + + // Переадресация на новую страницу товара + return $this->redirect("/product/$model->catn"); + } + } + public function actionEditDscr(string $catn, string $prod): array|string|null { // Инициализация diff --git a/mirzaev/skillparts/system/models/Product.php b/mirzaev/skillparts/system/models/Product.php index 859e246..c9ffce3 100644 --- a/mirzaev/skillparts/system/models/Product.php +++ b/mirzaev/skillparts/system/models/Product.php @@ -76,6 +76,7 @@ class Product extends Document parent::attributes(), [ 'catn', + 'name', // В библеотеке есть баг на название DESC (неизвестно в моей или нет) 'dscr', 'prod', @@ -98,6 +99,7 @@ class Product extends Document parent::attributeLabels(), [ 'catn' => 'Каталожный номер (catn)', + 'name' => 'Название (name)', 'dscr' => 'Описание (dscr)', 'prod' => 'Производитель (prod)', 'dmns' => 'Габариты (dmns)', @@ -136,7 +138,10 @@ class Product extends Document 'message' => '{attribute} должен быть строкой' ], [ - 'prod', + [ + 'prod', + 'name' + ], 'string', 'length' => [2, 80], 'message' => '{attribute} должен быть строкой от 3 до 80 символов' diff --git a/mirzaev/skillparts/system/views/product/index.php b/mirzaev/skillparts/system/views/product/index.php index 0bb60fd..e673a1a 100644 --- a/mirzaev/skillparts/system/views/product/index.php +++ b/mirzaev/skillparts/system/views/product/index.php @@ -138,12 +138,15 @@ use app\models\Product; && (yii::$app->user->identity->type === 'administrator' || yii::$app->user->identity->type === 'moderator') ) : ?> +

+ +

-

+

-

+

diff --git a/mirzaev/skillparts/system/web/css/pages/product.css b/mirzaev/skillparts/system/web/css/pages/product.css index e7dfefa..c8fae0e 100644 --- a/mirzaev/skillparts/system/web/css/pages/product.css +++ b/mirzaev/skillparts/system/web/css/pages/product.css @@ -81,10 +81,14 @@ } #page_product article h1.product_catn { + font-size: small; +} + +#page_product article h2.product_name { font-size: larger; } -#page_product article h2.product_prod { +#page_product article h3.product_prod { font-size: small; } diff --git a/mirzaev/skillparts/system/web/js/product_panel.js b/mirzaev/skillparts/system/web/js/product_panel.js index c20d151..a64a978 100644 --- a/mirzaev/skillparts/system/web/js/product_panel.js +++ b/mirzaev/skillparts/system/web/js/product_panel.js @@ -96,6 +96,47 @@ function product_panel_catn_save(catn, prod, element, redirect = false) { return true; }; +function product_panel_name_edit(catn, prod, element, redirect = false) { + if (catn !== null && catn !== undefined && prod !== null && prod !== undefined && element !== null && element !== undefined) { + element.innerHTML = ''; + + element.removeAttribute('onclick'); + + return false; + }; + + return true; +}; + +function product_panel_name_save(catn, prod, element, redirect = false) { + if (catn !== null && catn !== undefined && prod !== null && prod !== undefined && element !== null && element !== undefined) { + // Инициализация + let text = element.children[0].value; + + // Обновление заголовка (предзагрузка) + element.innerHTML = text; + + // Запись аттрибута (предзагрузка) + element.setAttribute('onclick', 'return product_panel_name_edit(\'' + catn + '\', \'' + prod + '\', this);'); + + $.ajax({ + url: '/product/' + prod + '/' + catn + '/edit/name', + type: 'post', + dataType: 'json', + data: { + '_csrf': yii.getCsrfToken(), + 'text': text + }, + success: product_response_success, + error: product_response_error + }); + + return false; + }; + + return true; +}; + function product_panel_prod_edit(catn, prod, element, redirect = false) { if (catn !== null && catn !== undefined && prod !== null && prod !== undefined && element !== null && element !== undefined) { element.innerHTML = ''; @@ -117,7 +158,7 @@ function product_panel_prod_save(catn, prod, element, redirect = false) { element.innerHTML = text; // Запись аттрибута (предзагрузка) - element.setAttribute('onclick', 'return product_panel_catn_edit(\'' + catn + '\', \'' + prod + '\', this);'); + element.setAttribute('onclick', 'return product_panel_prod_edit(\'' + catn + '\', \'' + prod + '\', this);'); $.ajax({ url: '/product/' + prod + '/' + catn + '/edit/prod',