Починил редактирование товара

This commit is contained in:
Arsen Mirzaev Tatyano-Muradovich 2022-06-25 05:13:34 +10:00
parent 33cc3efc7b
commit 3ec9b920d2
6 changed files with 175 additions and 6 deletions

View File

@ -100,7 +100,7 @@ $config = [
'<_key:[0-9]+>/<action:(accept|decline|data)>' => 'account/<action>', '<_key:[0-9]+>/<action:(accept|decline|data)>' => 'account/<action>',
'product/<prod:[^/]+>/<catn:[^/]+>' => 'product/index', 'product/<prod:[^/]+>/<catn:[^/]+>' => 'product/index',
'product/<prod:[^/]+>/<catn:[^/]+>/<action:(write|delete|connect|disconnect|status)>' => 'product/<action>', 'product/<prod:[^/]+>/<catn:[^/]+>/<action:(write|delete|connect|disconnect|status)>' => 'product/<action>',
'<section:(product|cart)>/<catn:[^/]+>/<action:(read|write|edit|delete)>/<target:(title|catn|dscr|dmns|wght|image|cover|comm)>' => '<section>/<action>-<target>', '<section:(product|cart)>/<prod:[^/]+>/<catn:[^/]+>/<action:(read|write|edit|delete)>/<target:(title|catn|name|dscr|prod|dmns|wght|image|cover|comm)>' => '<section>/<action>-<target>',
'products/<action:(read)>/<stts:[^/]+>/' => 'product/<action>', 'products/<action:(read)>/<stts:[^/]+>/' => 'product/<action>',
'profile/geolocation/<action:(init|write)>' => 'profile/geolocation-<action>', 'profile/geolocation/<action:(init|write)>' => 'profile/geolocation-<action>',
'profile/panel/<panel:(suppliers)>/<block:(requests)>/<action:(search)>' => 'profile/panel-<panel>-<block>-<action>', 'profile/panel/<panel:(suppliers)>/<block:(requests)>/<action:(search)>' => 'profile/panel-<panel>-<block>-<action>',

View File

@ -50,6 +50,8 @@ class ProductController extends Controller
'disconnect', 'disconnect',
'edit-title', 'edit-title',
'edit-catn', 'edit-catn',
'edit-prod',
'edit-name',
'edit-dscr', 'edit-dscr',
'edit-dmns', 'edit-dmns',
'edit-wght', '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 public function actionEditDscr(string $catn, string $prod): array|string|null
{ {
// Инициализация // Инициализация

View File

@ -76,6 +76,7 @@ class Product extends Document
parent::attributes(), parent::attributes(),
[ [
'catn', 'catn',
'name',
// В библеотеке есть баг на название DESC (неизвестно в моей или нет) // В библеотеке есть баг на название DESC (неизвестно в моей или нет)
'dscr', 'dscr',
'prod', 'prod',
@ -98,6 +99,7 @@ class Product extends Document
parent::attributeLabels(), parent::attributeLabels(),
[ [
'catn' => 'Каталожный номер (catn)', 'catn' => 'Каталожный номер (catn)',
'name' => 'Название (name)',
'dscr' => 'Описание (dscr)', 'dscr' => 'Описание (dscr)',
'prod' => 'Производитель (prod)', 'prod' => 'Производитель (prod)',
'dmns' => 'Габариты (dmns)', 'dmns' => 'Габариты (dmns)',
@ -135,8 +137,11 @@ class Product extends Document
'string', 'string',
'message' => '{attribute} должен быть строкой' 'message' => '{attribute} должен быть строкой'
], ],
[
[ [
'prod', 'prod',
'name'
],
'string', 'string',
'length' => [2, 80], 'length' => [2, 80],
'message' => '{attribute} должен быть строкой от 3 до 80 символов' 'message' => '{attribute} должен быть строкой от 3 до 80 символов'

View File

@ -138,12 +138,15 @@ use app\models\Product;
&& (yii::$app->user->identity->type === 'administrator' && (yii::$app->user->identity->type === 'administrator'
|| yii::$app->user->identity->type === 'moderator') || yii::$app->user->identity->type === 'moderator')
) : ?> ) : ?>
<h2 id="name_<?= $model['catn'] ?>" class="mt-auto my-0 w-100 mb-1 product_name" role="button" onclick="return product_panel_name_edit('<?= $model['catn'] ?>', '<?= $model['prod'] ?>', this);">
<?= $model['name'] ?? 'Неизвестно' ?>
</h2>
<h1 id="catn_<?= $model['catn'] ?>" class="mr-auto my-auto pointer-event product_catn" role="button" onclick="return product_panel_catn_edit('<?= $model['catn'] ?>', '<?= $model['prod'] ?>', this, true);"> <h1 id="catn_<?= $model['catn'] ?>" class="mr-auto my-auto pointer-event product_catn" role="button" onclick="return product_panel_catn_edit('<?= $model['catn'] ?>', '<?= $model['prod'] ?>', this, true);">
<?= $model['catn'] ?? '' ?> <?= $model['catn'] ?? '' ?>
</h1> </h1>
<h2 id="prod_<?= $model['catn'] ?>" class="mt-auto my-0 product_prod" role="button" onclick="return product_panel_prod_edit('<?= $model['catn'] ?>', '<?= $model['prod'] ?>', this, true);"> <h3 id="prod_<?= $model['catn'] ?>" class="mt-auto my-0 product_prod" role="button" onclick="return product_panel_prod_edit('<?= $model['catn'] ?>', '<?= $model['prod'] ?>', this, true);">
<?= $model['prod'] ?? 'Неизвестно' ?> <?= $model['prod'] ?? 'Неизвестно' ?>
</h2> </h3>
<?php else : ?> <?php else : ?>
<h1 id="catn_<?= $model['catn'] ?>" class="mr-auto my-auto product_catn"> <h1 id="catn_<?= $model['catn'] ?>" class="mr-auto my-auto product_catn">
<?= $model['catn'] ?> <?= $model['catn'] ?>

View File

@ -81,10 +81,14 @@
} }
#page_product article h1.product_catn { #page_product article h1.product_catn {
font-size: small;
}
#page_product article h2.product_name {
font-size: larger; font-size: larger;
} }
#page_product article h2.product_prod { #page_product article h3.product_prod {
font-size: small; font-size: small;
} }

View File

@ -96,6 +96,47 @@ function product_panel_catn_save(catn, prod, element, redirect = false) {
return true; 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 = '<input class="form-control text-center" type="text" value="' + element.innerText + '" onchange="return product_panel_name_save(\'' + catn + '\', \'' + prod + '\', this.parentElement, ' + redirect + ')" aria-invalid="false">';
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) { function product_panel_prod_edit(catn, prod, element, redirect = false) {
if (catn !== null && catn !== undefined && prod !== null && prod !== undefined && element !== null && element !== undefined) { if (catn !== null && catn !== undefined && prod !== null && prod !== undefined && element !== null && element !== undefined) {
element.innerHTML = '<input class="form-control text-center" type="text" value="' + element.innerText + '" onchange="return product_panel_prod_save(\'' + catn + '\', \'' + prod + '\', this.parentElement, ' + redirect + ')" aria-invalid="false">'; element.innerHTML = '<input class="form-control text-center" type="text" value="' + element.innerText + '" onchange="return product_panel_prod_save(\'' + catn + '\', \'' + prod + '\', this.parentElement, ' + redirect + ')" aria-invalid="false">';
@ -117,7 +158,7 @@ function product_panel_prod_save(catn, prod, element, redirect = false) {
element.innerHTML = text; 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({ $.ajax({
url: '/product/' + prod + '/' + catn + '/edit/prod', url: '/product/' + prod + '/' + catn + '/edit/prod',