Свойство isNewRecord

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
kaktus7702
Сообщения: 28
Зарегистрирован: 2016.09.18, 13:15

Свойство isNewRecord

Сообщение kaktus7702 »

У класса ActiveRecords есть свойство isNewRecord... но у меня так сложилось что форма значительно отличается от тех полей которые есть в базе. Для этого пришлось сделать промежуточный класс наследуемый от model, установить там правила валидации. Но естественное там нет свойства isNewRecord. Пытался посмотреть в AR где и как это свойство заполняется.. .так и не понял, там в методе getNewRecord одна строка и все.. видимо где то в другом методе выставляется ее значение.
Как правильно определять это новая запись или редактирование существующей? Я могу просто сделать проверку $_GET['id'] если есть то существующая, если нет ее то новая... но насколько это правильно? Раз разбираюсь с YII2 то хочется делать так как правильно, а не так как я знаю..
Спасибо.
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: Свойство isNewRecord

Сообщение Alexum »

Теоретически можно создать отдельный класс, который будет наследоваться от вашей основной модели ActiveRecord, добавить/переопределить там всё, что необходимо, и на его основе строить форму. Использовать как вы обычную модель для реализации CRUD а ля ActiveRecord, ну не знаю...
Аватара пользователя
sokoji
Сообщения: 25
Зарегистрирован: 2015.07.20, 11:51
Контактная информация:

Re: Свойство isNewRecord

Сообщение sokoji »

Передавайте в модель формы саму модель AR, у которой есть это свойство. И оттуда проверяйте свойство, заодно какие-то данные уже существующей модели можно получить для хлебных крошек и других элементов интерфейса.
kaktus7702
Сообщения: 28
Зарегистрирован: 2016.09.18, 13:15

Re: Свойство isNewRecord

Сообщение kaktus7702 »

Alexum писал(а): 2017.06.15, 09:09 Теоретически можно создать отдельный класс, который будет наследоваться от вашей основной модели ActiveRecord, добавить/переопределить там всё, что необходимо, и на его основе строить форму. Использовать как вы обычную модель для реализации CRUD а ля ActiveRecord, ну не знаю...
у меня немного не так.. я в момент вызова метода save создаю AR объект и там уже все как полагается сохраняю... просто у меня в базе 4 поля... а в форме 7 полей плюс два инпута для сохранения файлов.. все эти поля надо обработать, потом засунуть в массив, сериализовать и только после этого поместить в базу...
почему так реализовано, потому что будет несколько форм, с произвольным набором переменных, и в зависимости от переменных по разному будут строиться страницы..

я как сначала хотел сделать

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

    public function actionCreate1()
    {
        $ar = new Master(); //AR класс
        $model = new MasterForm1(); //мой промежуточный
        $model->isNewRecord = $ar->isNewRecord; //в одноименное свойство отправляю значение 

        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            return $this->redirect(['view', 'id' => $model->id]);
        } else {
            return $this->render('create1', [
                'model' => $model,
            ]);
        }
    }
а вот так выглядит метод save в промежуточном классе

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

    public function save($runValidation = true, $attributeNames = null) {

        if (!$this->validate()) {
            return null;
        }
        
        $model->name = $this->name;
        $model->params = $this->buildParams();
        $model->status = $this->status;
        $res = $model->save() ? $model : null;
        return $res;

    }
но меня тут смущает что я объекты начинаю плодить.. и в save и в actionCreate1...
как то не нравится мне это..

а создать объект и сделать его свойством промежуточного класса.. тоже вроде как то не очень хорошо.. можно было бы в конструкторе все это сделать.. но это надо переопределять конструктор, я плохо очень знаю YII2 - поэтому стремно как то переопределять конструктор в промежуточном классе который наследуется от Model

и как лучше сделать не могу понять..
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: Свойство isNewRecord

Сообщение Alexum »

Если не хотите плодить объекты - я вам предложил вариант. Вы же понимаете, что в класс ActiveRecord можно добавлять свои свойства и методы, всё равно сколько там полей в БД. Можете наделать классы-наследники от основной ActiveRecord, куда добавить эти свойства и их валидацию. Переопределить метод beforeSave(), где делать сериализацию и помещать данные в одно поле БД. Соответственно делать десереализацию в переопределённом методе afterFind(). Таким образом в контроллерах не будет ничего лишнего.
kaktus7702
Сообщения: 28
Зарегистрирован: 2016.09.18, 13:15

Re: Свойство isNewRecord

Сообщение kaktus7702 »

Alexum писал(а): 2017.06.15, 10:38 Если не хотите плодить объекты - я вам предложил вариант. Вы же понимаете, что в класс ActiveRecord можно добавлять свои свойства и методы, всё равно сколько там полей в БД. Можете наделать классы-наследники от основной ActiveRecord, куда добавить эти свойства и их валидацию. Переопределить метод beforeSave(), где делать сериализацию и помещать данные в одно поле БД. Соответственно делать десереализацию в переопределённом методе afterFind(). Таким образом в контроллерах не будет ничего лишнего.
я с классами и ООП не сильно еще дружу)) до этого вся моя основная работа заключалась в работе над движком у которого вся архитектура была построена на функциях))
и кстати насчет этого
добавлять свои свойства
я в свой AR добавил сначала свойства одноименные с дополнительными полями формы.. так ошибку выбивало, что нет доступа к чему то там.. вроде так было.. поэтому пошел путем промежуточного класса. Это мне на другом форуме посоветовали..
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: Свойство isNewRecord

Сообщение Alexum »

kaktus7702 писал(а): 2017.06.15, 11:04 я в свой AR добавил сначала свойства одноименные с дополнительными полями формы.. так ошибку выбивало, что нет доступа к чему то там.. вроде так было..
Для полноценной работы с такими свойствами нужны сеттеры и геттеры, т.к. ActiveRecord не знает что делать с этими полями при таких операциях как save().
kaktus7702
Сообщения: 28
Зарегистрирован: 2016.09.18, 13:15

Re: Свойство isNewRecord

Сообщение kaktus7702 »

Alexum писал(а): 2017.06.15, 11:11 Для полноценной работы с такими свойствами нужны сеттеры и геттеры, т.к. ActiveRecord не знает что делать с этими полями при таких операциях как save().
я знаю что такое геттеры и сеттеры)) в том числе и магические)) но как их в данном случае надо было использовать не знаю)) даже идей никаких не мелькает)) плохо еще представляю как все это работает)
sosnovskiy
Сообщения: 239
Зарегистрирован: 2017.03.28, 20:03

Re: Свойство isNewRecord

Сообщение sosnovskiy »

Видимо плохо понимаете. В данном случае они просто должны быть и что то возвращать или сетить. Это уже вам решать
Ответить