Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
AZA
Сообщения: 53 Зарегистрирован: 2018.01.02, 17:13
Сообщение
AZA » 2018.09.10, 18:59
Приветствую,не могу понять в чем дело...
При редактировании записи с помощью Аякса,запись не обновляется,а добавляется новая.
Код
Код: Выделить всё
public function actionIndex()
{
$model=new MenuModel();
$dataProvider = new ActiveDataProvider([
'query' => MenuModel::find(),
]);
if (Yii::$app->request->isAjax)
{
if (Yii::$app->getRequest()->post('widget') == 'edit' && sizeof(Yii::$app->request->post('id')) == 1)
{
$model = $this->findModel(Yii::$app->request->post('id'));
return $this->renderPartial('form',['model'=>$model]);
}
if ($model->load(Yii::$app->request->post()))
{
Yii::$app->response->format = Response::FORMAT_JSON;
return ['status'=>$model->save(),'cache'=>$this->loadInCache()];
}
}
return $this->render('index', [
'dataProvider' => $dataProvider,
// 'model'=>$model,
]);
}
Loveorigami
Сообщения: 977 Зарегистрирован: 2014.08.27, 21:54
Сообщение
Loveorigami » 2018.09.10, 22:09
Очевидно, что первое условие не срабатывает, а во втором сохраняется новая запись. Дебажьте
AZA
Сообщения: 53 Зарегистрирован: 2018.01.02, 17:13
Сообщение
AZA » 2018.09.10, 22:45
Loveorigami писал(а): ↑ 2018.09.10, 22:09
Очевидно, что первое условие не срабатывает, а во втором сохраняется новая запись. Дебажьте
Если бы первое условие не работало,тогда бы я нужную запись не получал.Так что нет.
urichalex
Сообщения: 994 Зарегистрирован: 2015.08.07, 11:03
Сообщение
urichalex » 2018.09.10, 23:07
AZA писал(а): ↑ 2018.09.10, 22:45
Loveorigami писал(а): ↑ 2018.09.10, 22:09
Очевидно, что первое условие не срабатывает, а во втором сохраняется новая запись. Дебажьте
Если бы первое условие не работало,тогда бы я нужную запись не получал.Так что нет.
А в начале метода ты не создаешь новую модель?
AZA
Сообщения: 53 Зарегистрирован: 2018.01.02, 17:13
Сообщение
AZA » 2018.09.11, 08:32
Создаю,видно же.
someweb
Сообщения: 552 Зарегистрирован: 2017.03.09, 10:12
Сообщение
someweb » 2018.09.11, 09:03
Посмотрите в дебаг панели, скорее всего два раза запрос отправляется.
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
AZA
Сообщения: 53 Зарегистрирован: 2018.01.02, 17:13
Сообщение
AZA » 2018.09.11, 09:38
Один запрос летит.
someweb
Сообщения: 552 Зарегистрирован: 2017.03.09, 10:12
Сообщение
someweb » 2018.09.11, 09:55
Сорри, невнимательно прочитал. Тогда как пишет Loveorigami - первое условие не выполняется.
И, кстати, с таким кодом вы никак не отредактируете.
Потому как если сработает первое условие, то там сохранения нет. А во второе условие всегда попадает новая модель.
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
AZA
Сообщения: 53 Зарегистрирован: 2018.01.02, 17:13
Сообщение
AZA » 2018.09.11, 10:47
А как по другому сделать? (Просто не представляю,как это реализовать.)
someweb
Сообщения: 552 Зарегистрирован: 2017.03.09, 10:12
Сообщение
someweb » 2018.09.11, 11:11
Либо возвращайте все JSON, либо renderPartial() - не надо перемешивать.
А логика как в actionUpdate сгенерированном gii.
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
andku83
Сообщения: 988 Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков
Сообщение
andku83 » 2018.09.11, 12:05
Можно попробовать вот так:
Код: Выделить всё
public function actionIndex()
{
$dataProvider = new ActiveDataProvider([
'query' => MenuModel::find(),
]);
if (Yii::$app->request->isAjax)
{
if (Yii::$app->request->post('id')) {
$model = $this->findModel(Yii::$app->request->post('id'));
}
if (!$model) {
$model=new MenuModel();
}
if (Yii::$app->getRequest()->post('widget') == 'edit')
{
$model = $this->findModel(Yii::$app->request->post('id'));
return $this->renderPartial('form',['model'=>$model]);
}
if ($model->load(Yii::$app->request->post()))
{
Yii::$app->response->format = Response::FORMAT_JSON;
return ['status'=>$model->save(),'cache'=>$this->loadInCache()];
}
}
return $this->render('index', [
'dataProvider' => $dataProvider,
]);
}
Смотрите request, возможно
Yii::$app->request->post('id') не будет работать.
Возможно вместо
'id' нужно использовать
MenuModel['id']
И все-таки правильнее логику по сохранению записей перенести в другой action
AZA
Сообщения: 53 Зарегистрирован: 2018.01.02, 17:13
Сообщение
AZA » 2018.09.12, 09:14
Так не работает,модель в любом случаи не создаётся,я про !$model,с isset таже басня.
uEhlO4a
Сообщения: 70 Зарегистрирован: 2017.08.12, 19:19
Сообщение
uEhlO4a » 2018.09.12, 11:11
хочешь обновить, делай например так как више написали,
$post = Yii::$app->request->post();
$model = MenuModel::findOne($post['id']);
if(!$model) {
$model=new MenuModel();
}
в виде index.php нужно добавить скрытое поле 'id'
p.s.
и что это такое sizeof(Yii::$app->request->post('id')) ? Какой-то капец
andku83
Сообщения: 988 Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков
Сообщение
andku83 » 2018.09.12, 11:48
Не забывайте заглядывать в дебаг тулбар - там много интересного...
Код: Выделить всё
if (Yii::$app->getRequest()->post('widget') == 'edit')
{
$model = $this->findModel(Yii::$app->request->post('id'));
return $this->renderPartial('form',['model'=>$model]);
}
if ($model->load(Yii::$app->request->post()))
{
if ($model->save()) {
Yii::$app->response->format = Response::FORMAT_JSON;
return ['status' => true,'cache' => $this->loadInCache()];
} else {
var_dump($model->errors);
return $this->renderPartial('form',['model'=>$model]);
}
}
AZA
Сообщения: 53 Зарегистрирован: 2018.01.02, 17:13
Сообщение
AZA » 2018.09.18, 20:33
uEhlO4a писал(а): ↑ 2018.09.12, 11:11
хочешь обновить, делай например так как више написали,
$post = Yii::$app->request->post();
$model = MenuModel::findOne($post['id']);
if(!$model) {
$model=new MenuModel();
}
в виде index.php нужно добавить скрытое поле 'id'
p.s.
и что это такое sizeof(Yii::$app->request->post('id')) ? Какой-то капец
ЕЩЕ Раз.
Модель не создается при условии if(!$model).
и что это такое sizeof(Yii::$app->request->post('id')) ? Какой-то капец
Что в этом плохого?У меня передается массив состоящих из id и проверяем,если редактируем чтобы был один id.
someweb
Сообщения: 552 Зарегистрирован: 2017.03.09, 10:12
Сообщение
someweb » 2018.09.19, 09:49
Сделайте так и приведите вывод
Код: Выделить всё
$post = Yii::$app->request->post();
Yii::debug($post, 'ajax-edit');
$model = MenuModel::findOne($post['id']);
Yii::debug($model->id ?? 'Model not found', 'ajax-edit');
if(!$model) {
$model=new MenuModel();
Yii::debug(Model was created, 'ajax-edit');
}
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.