myks92
@myks92
Нашёл решение — пометь вопрос ответом!

Ajax + Yii + две модели. Как лучше сделать?

Всем доброго вечера! Имеется абонемент, которые связаны связью hasMany. У каждого абонемента может быть много посещений. Необходимо в форме реализовать возможность добавлять и удалять новые посещения Ajax. Подскажите как это правильно сделать, не делая лишних запросов, но в тоже время, чтобы сами данные, которые при отправке не прошли валидацию оставались.. Благодарю!

public function actionUpdate($id)
    {
        $client_ticket = $this->findModel($id);
        $client_moneys = $client_ticket->clientMoneys;
        $client_visits = $client_ticket->clientVisits;

        $debit = 0;
        foreach ($client_moneys as $client_money){
            $debit +=$client_money->debit +=$client_money->credit;
        }
        $debit < 0 ?: $debit = 0;

        if ($client_ticket->load(Yii::$app->request->post()) && $client_ticket->save() &&
            Model::loadMultiple($client_visits, Yii::$app->request->post()) && Model::validateMultiple($client_visits)) {
            foreach ($client_visits as $client_visit) {
                $client_visit->save(false);
            }
            return $this->redirect(['index']);
        }

        return $this->render('update', [
            'client_ticket' => $client_ticket,
            'debit' => $debit,
            'client_visits' => $client_visits
        ]);
    }


5a4f86dfdb3ca562660561.png
  • Вопрос задан
  • 61 просмотр
Решения вопроса 2
@EVMI
Upd
upd. я бы обновлял данные непосредственно в связной таблице с посещениями и после добавления новой записи или удаления обновлял список посещений на странице.
В представлении на кнопку "+добавить" повесьте скрипт js при клике загружать форму в
<div class='add_form'>
$('.add_form').load('экшн добавить посещение')

в том же скрипте на сабмит загруженной формы добавьте ajax запрос на экшн добавить посещение

в экшене 'экшн добавить посещение'
if ($model->load(Yii::$app->request->post()) && $model->save()) {
            return json_encode($model->id); //тут можете передать параметры для формирования html с добавленным пунктом
        }
        return $this->renderAjax('_форма_добавить_посещение', [
            'model' => $model,
        ]);

Его результат будете разбирать в ответе.
результат запроса анализируйте (например result[1] != '<' в зависимости от результата можно проверять с чего начинается строка чтобы понять что с ней делать) если валидация успешна, формируйте html с полученными данными и добавляйте в конец списка или отдальным ajax обновите список посещений типа $('.list').load('url_update_list'),
если не успешна возвращайте result в $('.add_form')
upd. для удаления на кнопку X повесьте аналогично js ajax с вызовом экшена на удаление, передавайте параметр ид удаляемой записи. На result повесьте ajax функцию обновления списка.
Ответ написан
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Не надо городить все в 1 экшен. Сделайте отдельный, который принимает id абонемента и добавляет или редактирует связанную сущность.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы