$child->parent_id = (int)$parent_id;
if ($child->save()) {
+ Yii::$app->session->setFlash('success', 'Запись создана', false);
return ['success'=>true,'data'=>['id'=>$child->id, 'name'=>$child->name]];
}
return ['success'=>false,'message'=>current($child->getFirstErrors()) ?: 'Ошибка создания'];
$model = $this->findModel($id);
if (!$model) {
+ Yii::$app->session->setFlash('error', 'Ошибка изменения активности');
return ['success' => false, 'message' => 'Не найдено'];
}
try {
$model->active = $active;
if (!$model->save(false)) {
+ Yii::$app->session->setFlash('error', 'Ошибка изменения активности');
throw new \RuntimeException('Не удалось сохранить узел');
}
}
$transaction->commit();
- return ['success' => true];
+ Yii::$app->session->setFlash('success', 'Активность записей изменена', false);
+ return ['success' => true, 'message' => 'Активность записей изменена'];
} catch (Throwable $e) {
$transaction->rollBack();
+ Yii::$app->session->setFlash('error', 'Ошибка изменения активности');
Yii::error($e->getMessage(), 'matrix-type.toggle-active');
return ['success' => false, 'message' => 'Ошибка при сохранении'];
}
{
$model = $this->findModel($id);
if (!$model) {
+ Yii::$app->session->setFlash('error', 'Запись не найдена');
return $this->redirect(['index']);
}
}
$transaction->commit();
+ Yii::$app->session->setFlash('success', 'Записи удалены');
return $this->redirect(['index']);
} catch (\Throwable $e) {
$transaction->rollBack();
+ Yii::$app->session->setFlash('error', 'Ошибка удаления записей');
Yii::error($e->getMessage(), 'matrix-type.soft-delete');
return $this->redirect(['index']);
}
'deleted_by' => $uid,
'deleted_at' => $now,
'active' => 0,
+ 'deleted' => 1,
]);
if ($result === false) {
Yii::error("Ошибка сохранения " . json_encode($matrixType->getErrors(), JSON_UNESCAPED_UNICODE));
*/
protected function findModel($id)
{
- if (($model = MatrixType::find()->where(['id' => $id])->andWhere(['deleted_at' => null])->one()) !== null) {
+ if (($model = MatrixType::find()->where(['id' => $id])->andWhere(['deleted' => 0])->one()) !== null) {
return $model;
}
$this->timestamp()->defaultValue(null)->comment('дата удаления')
);
}
+ if (!$this->db->schema->getTableSchema(self::TABLE_NAME, true)->getColumn('deleted')) {
+ $this->addColumn(
+ self::TABLE_NAME,
+ 'deleted',
+ $this->tinyInteger()->notNull()->defaultValue(0)->comment('признак удаленного элемента')
+ );
+ }
}
/**
}
if ($this->db->schema->getTableSchema(self::TABLE_NAME, true)->getColumn('deleted_at')) {
$this->dropColumn(self::TABLE_NAME, 'deleted_at');
+ }if ($this->db->schema->getTableSchema(self::TABLE_NAME, true)->getColumn('deleted')) {
+ $this->dropColumn(self::TABLE_NAME, 'deleted');
}
}
<?php
namespace yii_app\records;
-use Yii;
use yii\behaviors\BlameableBehavior;
use yii\behaviors\TimestampBehavior;
use yii\db\Expression;
* @property int $created_by
* @property string $created_at
* @property int|null $updated_by
+ * @property int $deleted Признак (флаг) удаления
+ * @property int|null $deleted_by ИД пользователя осуществившего удаление
+ * @property string|null $deleted_at Дата удаления
* @property string|null $updated_at
*/
class MatrixType extends \yii\db\ActiveRecord
return [
[['name'], 'filter', 'filter' => 'trim'],
[['name'], 'required'],
- [['created_by', 'updated_by', 'active', 'parent_id'], 'integer'],
- [['created_at', 'updated_at'], 'safe'],
+ [['created_by', 'updated_by', 'deleted_by', 'active', 'parent_id', 'deleted'], 'integer'],
+ [['created_at', 'updated_at', 'deleted_at'], 'safe'],
[['name'], 'string', 'max' => 255],
// Уникальность имени в рамках одной группы
[
'name' => 'Название типа матрицы',
'parent_id' => 'Родительская категория',
'active' => 'Активность',
+ 'deleted' => 'Удалено',
'created_by' => 'ИД создателя',
'created_at' => 'Дата создания',
'updated_by' => 'ИД редактировавшего',
'updated_at' => 'Дата обновления',
+ 'deleted_by' => 'ИД удалившего',
+ 'deleted_at' => 'Дата обновления',
];
}
$this->load($params, '');
$allTypes = MatrixType::find()
- ->andWhere(['deleted_at' => null])
+ ->andWhere(['deleted' => 0])
->orderBy(['parent_id' => SORT_ASC, 'id' => SORT_ASC])
->all();
$this->title = 'Управление категориями букетов';
$this->params['breadcrumbs'][] = $this->title;
+
+$this->registerCssFile(Yii::getAlias('@web') . '/css/matrix-type/index.css');
$this->registerJsFile('/js/matrix-type/index.js', ['position' => \yii\web\View::POS_END]);
+
?>
<div class="matrix-type-index p-3">
+ <?php if (Yii::$app->session->hasFlash('success')): ?>
+ <div class="alert alert-success alert-dismissible fade show" role="alert">
+ <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close">×</button>
+ <?= Yii::$app->session->getFlash('success') ?>
+ </div>
+ <?php endif; ?>
+
+ <?php if (Yii::$app->session->hasFlash('error')): ?>
+ <div class="alert alert-success alert-dismissible fade show" role="alert">
+ <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close">×</button>
+ <?= Yii::$app->session->getFlash('error') ?>
+ </div>
+ <?php endif; ?>
<h1><?= Html::encode($this->title) ?></h1>
<div class="d-flex justify-content-between mb-4">
--- /dev/null
+.loading-spinner {
+ display: inline-block;
+ width: 16px;
+ height: 16px;
+ border: 2px solid #ccc;
+ border-top: 2px solid #333;
+ border-radius: 50%;
+ animation: spin 0.6s linear infinite;
+ margin-left: 6px;
+}
+
+@keyframes spin {
+ 100% { transform: rotate(360deg); }
+}
var id = checkbox.data('id');
var active = checkbox.is(':checked') ? 1 : 0;
+ var spinner = $('<span class="loading-spinner"></span>');
+ checkbox.after(spinner);
+
$.ajax({
url: '/matrix-type/toggle-active',
type: 'POST',
checkbox.prop('checked', !active);
return;
}
+ var row = checkbox.closest('tr');
+ if (active === 0) {
+ row.css('background', '#ffecec');
+ } else {
+ row.css('background', '');
+ }
+ var alertBox = $('<div class="alert alert-success alert-dismissible fade show" role="alert">'
+ + res.message +
+ '<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close">×</button>' +
+ '</div>');
+ $('.matrix-type-index').prepend(alertBox);
if (active === 0 && checkbox.closest('tr').find('td:first').text().trim() !== '') {
var nodeId = id;
error: function () {
alert('Ошибка сервера');
checkbox.prop('checked', !active);
+ },
+ complete: function () {
+ spinner.remove();
}
});
});