Ajax edit

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

Ajax edit

Сообщение AZA »

Приветствую,не могу понять в чем дело...
При редактировании записи с помощью Аякса,запись не обновляется,а добавляется новая.
Код

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


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

Re: Ajax edit

Сообщение Loveorigami »

Очевидно, что первое условие не срабатывает, а во втором сохраняется новая запись. Дебажьте
Аватара пользователя
AZA
Сообщения: 53
Зарегистрирован: 2018.01.02, 17:13

Re: Ajax edit

Сообщение AZA »

Loveorigami писал(а): 2018.09.10, 22:09 Очевидно, что первое условие не срабатывает, а во втором сохраняется новая запись. Дебажьте
Если бы первое условие не работало,тогда бы я нужную запись не получал.Так что нет.
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: Ajax edit

Сообщение urichalex »

AZA писал(а): 2018.09.10, 22:45
Loveorigami писал(а): 2018.09.10, 22:09 Очевидно, что первое условие не срабатывает, а во втором сохраняется новая запись. Дебажьте
Если бы первое условие не работало,тогда бы я нужную запись не получал.Так что нет.
А в начале метода ты не создаешь новую модель?
Аватара пользователя
AZA
Сообщения: 53
Зарегистрирован: 2018.01.02, 17:13

Re: Ajax edit

Сообщение AZA »

Создаю,видно же.
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Re: Ajax edit

Сообщение someweb »

Посмотрите в дебаг панели, скорее всего два раза запрос отправляется.
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
Аватара пользователя
AZA
Сообщения: 53
Зарегистрирован: 2018.01.02, 17:13

Re: Ajax edit

Сообщение AZA »

Один запрос летит.
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Re: Ajax edit

Сообщение someweb »

Сорри, невнимательно прочитал. Тогда как пишет Loveorigami - первое условие не выполняется.
И, кстати, с таким кодом вы никак не отредактируете.
Потому как если сработает первое условие, то там сохранения нет. А во второе условие всегда попадает новая модель.
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
Аватара пользователя
AZA
Сообщения: 53
Зарегистрирован: 2018.01.02, 17:13

Re: Ajax edit

Сообщение AZA »

А как по другому сделать? (Просто не представляю,как это реализовать.)
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Re: Ajax edit

Сообщение someweb »

Либо возвращайте все JSON, либо renderPartial() - не надо перемешивать.
А логика как в actionUpdate сгенерированном gii.
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Ajax edit

Сообщение andku83 »

Можно попробовать вот так:

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

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

Re: Ajax edit

Сообщение AZA »

Так не работает,модель в любом случаи не создаётся,я про !$model,с isset таже басня.
uEhlO4a
Сообщения: 70
Зарегистрирован: 2017.08.12, 19:19

Re: Ajax edit

Сообщение uEhlO4a »

хочешь обновить, делай например так как више написали,

$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
Откуда: Харьков

Re: Ajax edit

Сообщение andku83 »

Не забывайте заглядывать в дебаг тулбар - там много интересного...

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

            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

Re: Ajax edit

Сообщение AZA »

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

Re: Ajax edit

Сообщение someweb »

Сделайте так и приведите вывод

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

$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');
}
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
Ответить