Запрет удаления или редактирования строки в таблице

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
za4me
Сообщения: 152
Зарегистрирован: 2016.06.26, 15:29
Контактная информация:

Запрет удаления или редактирования строки в таблице

Сообщение za4me » 2016.12.28, 18:02

Добрый день.
Подскажите, пожалуйста, направление что читать для того что-бы сделать следующий функционал:

Имеется две таблицы в БД и в каждой из них есть строка с id = 1, я хочу запретить редактирование или удаление данных строк, понимаю что можно сделать в action update и delete просто проверку:

Код: Выделить всё

if ($model->id == 1) {
    // error message
    
    return $this->goHome();
}    
Но добавлять данные строки в каждый update, delete думаю не совсем красиво и разумно.

Аватара пользователя
Alexum
Сообщения: 675
Зарегистрирован: 2016.09.26, 10:00

Re: Запрет удаления или редактирования строки в таблице

Сообщение Alexum » 2016.12.28, 18:39

В rules модели можно добавить соответствующее правило, читайте про валидацию.

Аватара пользователя
za4me
Сообщения: 152
Зарегистрирован: 2016.06.26, 15:29
Контактная информация:

Re: Запрет удаления или редактирования строки в таблице

Сообщение za4me » 2016.12.28, 18:49

Alexum писал(а):В rules модели можно добавить соответствующее правило, читайте про валидацию.
Правильно ли я понял, что лучше всего в моем случае будет добавить в проект автономный валидатор и применять его в необходимых полях моделей?

Аватара пользователя
Alexum
Сообщения: 675
Зарегистрирован: 2016.09.26, 10:00

Re: Запрет удаления или редактирования строки в таблице

Сообщение Alexum » 2016.12.28, 19:02

Можно и проще. Есть готовый валидатор integer для которого можно задать параметр min

winzza
Сообщения: 126
Зарегистрирован: 2015.06.11, 20:30

Re: Запрет удаления или редактирования строки в таблице

Сообщение winzza » 2016.12.28, 19:20

А может лучше beforeValidate реализовать?
Бо потом возникнет ситуация, что нужно будет еще какой параметр/условие добавить. И снова будут вопросы...

Аватара пользователя
maleks
Сообщения: 1813
Зарегистрирован: 2012.12.26, 12:56

Re: Запрет удаления или редактирования строки в таблице

Сообщение maleks » 2016.12.29, 08:34

winzza писал(а):А может лучше beforeValidate реализовать?
вы что перед удалением модели её валидируете?


По теме, думаю можно поведение контроллера какое то сообразить, по типу access control в которое передавать экшены и соответствующие им невалидные комбинации значений гет параметров
Yii2 universal module sceleton - for basic and advanced templates

Аватара пользователя
za4me
Сообщения: 152
Зарегистрирован: 2016.06.26, 15:29
Контактная информация:

Re: Запрет удаления или редактирования строки в таблице

Сообщение za4me » 2016.12.29, 10:58

maleks писал(а): По теме, думаю можно поведение контроллера какое то сообразить, по типу access control в которое передавать экшены и соответствующие им невалидные комбинации значений гет параметров
Сделал фильтр:

Код: Выделить всё

class IdFilter extends ActionFilter
{
    public $ids = [];
    public $getId;

    public function beforeAction($action)
    {
        $this->getId = Yii::$app->request->get('id');

        foreach ($this->ids as $id) {
            if ($id == $this->getId) {
                Yii::$app->session->setFlash('error', 'Запрещены манипуляции с системными строками');

                return Yii::$app->getResponse()->redirect(
                    '/' . $action->controller->id
                );
            }
        }

        return true;
    }
}
 
Работает почти как надо :D
Есть два нюанса, не могу понять почему они не работают.
1. Не выводится flash сообщение на update action, редиректит на родительскую страницу нормально.
2. Action delete все-же происходит и успешного удаления появляется сообщение. Хотя в контроллере указал only:

Код: Выделить всё

public function behaviors()
{
    return [
        'id' =>[
            'class' => IdFilter::class,
            'ids' => [
                '6'
            ],
            'only' => [
                'update', 'delete'
            ],
        ],
        'verbs' => [
            'class' => VerbFilter::className(),
            'actions' => [
                'delete' => ['POST'],
            ],
        ],
    ];
}

Аватара пользователя
za4me
Сообщения: 152
Зарегистрирован: 2016.06.26, 15:29
Контактная информация:

Re: Запрет удаления или редактирования строки в таблице

Сообщение za4me » 2016.12.29, 11:06

Первый пункт решен, моя ошибка.

А решив первый, решил и второй, проверка для delete проходила потому что я не возвращал false.
Сделал вот так:

Код: Выделить всё

if ($id == $this->getId) {
    Yii::$app->session->setFlash('error', 'Запрещены манипуляции с системными строками');

    Yii::$app->getResponse()->redirect(
        '/' . $action->controller->id
    );

    return false;
}
И все работает, всем большое спасибо.

Аватара пользователя
Alexum
Сообщения: 675
Зарегистрирован: 2016.09.26, 10:00

Re: Запрет удаления или редактирования строки в таблице

Сообщение Alexum » 2016.12.29, 11:43

Ну и отлично, только может пересмотреть идею защищать строки с определёнными id и добавить отдельное битовое поле вида "read_only" = 0/1? Не нужно будет держать и править массив с id-шниками в вашем фильтре. Да и понадёжнее это. Если у вас ID - автоинкремент, то может так приключиться, что "поплывёт" при следующих развёртываниях.

Аватара пользователя
Faenir
Сообщения: 292
Зарегистрирован: 2010.01.06, 01:46
Откуда: Симферополь

Re: Запрет удаления или редактирования строки в таблице

Сообщение Faenir » 2016.12.29, 15:49

Я у себя добавляю поле `is_system` и в beforeSave и beforeDelete базовой модели проверяю его, если = 1, то не даю удалять/редактировать.

Ответить