Свойство isNewRecord
-
- Сообщения: 28
- Зарегистрирован: 2016.09.18, 13:15
Свойство isNewRecord
У класса ActiveRecords есть свойство isNewRecord... но у меня так сложилось что форма значительно отличается от тех полей которые есть в базе. Для этого пришлось сделать промежуточный класс наследуемый от model, установить там правила валидации. Но естественное там нет свойства isNewRecord. Пытался посмотреть в AR где и как это свойство заполняется.. .так и не понял, там в методе getNewRecord одна строка и все.. видимо где то в другом методе выставляется ее значение.
Как правильно определять это новая запись или редактирование существующей? Я могу просто сделать проверку $_GET['id'] если есть то существующая, если нет ее то новая... но насколько это правильно? Раз разбираюсь с YII2 то хочется делать так как правильно, а не так как я знаю..
Спасибо.
Как правильно определять это новая запись или редактирование существующей? Я могу просто сделать проверку $_GET['id'] если есть то существующая, если нет ее то новая... но насколько это правильно? Раз разбираюсь с YII2 то хочется делать так как правильно, а не так как я знаю..
Спасибо.
Re: Свойство isNewRecord
Теоретически можно создать отдельный класс, который будет наследоваться от вашей основной модели ActiveRecord, добавить/переопределить там всё, что необходимо, и на его основе строить форму. Использовать как вы обычную модель для реализации CRUD а ля ActiveRecord, ну не знаю...
Re: Свойство isNewRecord
Передавайте в модель формы саму модель AR, у которой есть это свойство. И оттуда проверяйте свойство, заодно какие-то данные уже существующей модели можно получить для хлебных крошек и других элементов интерфейса.
-
- Сообщения: 28
- Зарегистрирован: 2016.09.18, 13:15
Re: Свойство isNewRecord
у меня немного не так.. я в момент вызова метода save создаю AR объект и там уже все как полагается сохраняю... просто у меня в базе 4 поля... а в форме 7 полей плюс два инпута для сохранения файлов.. все эти поля надо обработать, потом засунуть в массив, сериализовать и только после этого поместить в базу...Alexum писал(а): ↑2017.06.15, 09:09 Теоретически можно создать отдельный класс, который будет наследоваться от вашей основной модели ActiveRecord, добавить/переопределить там всё, что необходимо, и на его основе строить форму. Использовать как вы обычную модель для реализации CRUD а ля ActiveRecord, ну не знаю...
почему так реализовано, потому что будет несколько форм, с произвольным набором переменных, и в зависимости от переменных по разному будут строиться страницы..
я как сначала хотел сделать
Код: Выделить всё
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,
]);
}
}
Код: Выделить всё
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;
}
как то не нравится мне это..
а создать объект и сделать его свойством промежуточного класса.. тоже вроде как то не очень хорошо.. можно было бы в конструкторе все это сделать.. но это надо переопределять конструктор, я плохо очень знаю YII2 - поэтому стремно как то переопределять конструктор в промежуточном классе который наследуется от Model
и как лучше сделать не могу понять..
Re: Свойство isNewRecord
Если не хотите плодить объекты - я вам предложил вариант. Вы же понимаете, что в класс ActiveRecord можно добавлять свои свойства и методы, всё равно сколько там полей в БД. Можете наделать классы-наследники от основной ActiveRecord, куда добавить эти свойства и их валидацию. Переопределить метод beforeSave(), где делать сериализацию и помещать данные в одно поле БД. Соответственно делать десереализацию в переопределённом методе afterFind(). Таким образом в контроллерах не будет ничего лишнего.
-
- Сообщения: 28
- Зарегистрирован: 2016.09.18, 13:15
Re: Свойство isNewRecord
я с классами и ООП не сильно еще дружу)) до этого вся моя основная работа заключалась в работе над движком у которого вся архитектура была построена на функциях))Alexum писал(а): ↑2017.06.15, 10:38 Если не хотите плодить объекты - я вам предложил вариант. Вы же понимаете, что в класс ActiveRecord можно добавлять свои свойства и методы, всё равно сколько там полей в БД. Можете наделать классы-наследники от основной ActiveRecord, куда добавить эти свойства и их валидацию. Переопределить метод beforeSave(), где делать сериализацию и помещать данные в одно поле БД. Соответственно делать десереализацию в переопределённом методе afterFind(). Таким образом в контроллерах не будет ничего лишнего.
и кстати насчет этого
я в свой AR добавил сначала свойства одноименные с дополнительными полями формы.. так ошибку выбивало, что нет доступа к чему то там.. вроде так было.. поэтому пошел путем промежуточного класса. Это мне на другом форуме посоветовали..добавлять свои свойства
Re: Свойство isNewRecord
Для полноценной работы с такими свойствами нужны сеттеры и геттеры, т.к. ActiveRecord не знает что делать с этими полями при таких операциях как save().kaktus7702 писал(а): ↑2017.06.15, 11:04 я в свой AR добавил сначала свойства одноименные с дополнительными полями формы.. так ошибку выбивало, что нет доступа к чему то там.. вроде так было..
-
- Сообщения: 28
- Зарегистрирован: 2016.09.18, 13:15
Re: Свойство isNewRecord
я знаю что такое геттеры и сеттеры)) в том числе и магические)) но как их в данном случае надо было использовать не знаю)) даже идей никаких не мелькает)) плохо еще представляю как все это работает)
-
- Сообщения: 239
- Зарегистрирован: 2017.03.28, 20:03
Re: Свойство isNewRecord
Видимо плохо понимаете. В данном случае они просто должны быть и что то возвращать или сетить. Это уже вам решать