Laravel сохранить форму из нескольких частей - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть форма из 3 частей, которую я хочу иметь возможность обновлять базу данных после каждой отправки.Есть одна таблица, которая содержит все поля ниже.

form1 asks for first and last name
form2 asks for email and phone
form3 asks for city and state

В моем контроллере у меня есть 3 отдельные функции для сохранения каждого шага формы:

public function name(Request $request){
    $lead = Lead::firstOrNew(123);
    $lead->firstName = $request->get('firstName ');
    $lead->lastName = $request->get('lastName');
    $lead->save();
    return redirect('/form2');
}

public function info(Request $request){
    $lead = Lead::find(123);
    $lead->email = $request->get('email');
    $lead->phone = $request->get('phone');
    $lead->save();
    return redirect('/form3');
}

public function address(Request $request){
    $lead = Lead::find(123);
    $lead->city = $request->get('city');
    $lead->state = $request->get('state');
    $lead->save();
    return redirect('/done');
}

Есть ли способобъединить это в одну функцию обновления?

Ответы [ 5 ]

0 голосов
/ 14 сентября 2018

Учитывая, что HTTP-запросы не имеют состояния (что означает, что каждый запрос ничего не знает о предыдущем до и после него), я бы предпочел, чтобы вы использовали сеансы, чтобы вы могли хранить информацию как redirect из одного form к другому. В этом случае ваш код должен выглядеть так:

<?php

public function name(Request $request){
    Session::put('nameData', $request->all());   //Store the info from form1 in session and redirect to form2
    return redirect('/form2');
}

public function info(Request $request){
    $validSessionData = Session::has('nameData');

    if (!$validSessionData) {    //Check if the user filled form1, if not, go back to form1
        return redirect('/form1');
    }

    $nameAndInfo = Session::pull('nameData', []) + $request->all();  //Merge the info from form1 with info from form2. You could decide to keep them separate and merge later.

    Session::put('nameAndInfo', $nameAndInfo);
    return redirect('/form3');
}

public function address(Request $request){
    $validSessionData = Session::has('nameAndInfo');

    if (!$validSessionData) {   Another check. You could also extend this by checking for form2 session data
        return redirect('/form1');
    }

    $allData = Session::pull('nameAndInfo', []) + $request->all();  //Merge all session data
    $lead = Lead::firstOrNew(123);
    $lead->firstName = $allData['firstName'];
    $lead->lastName = $allData['lastName'];
    $lead->email = $allData['email'];
    $lead->phone = $allData['phone'];
    $lead->city = $allData['city'];
    $lead->state = $allData['state'];

    $lead->save();
    return redirect('/done');
}
0 голосов
/ 14 сентября 2018

Если у вас есть возможность использовать javaScript, сохраните данные первой и второй формы в файлах cookie или локальном хранилище, а когда пользователь достигнет последней части формы, извлеките данные из файлов cookie или локального хранилища, а затем добавьте их в последнюю форму, но держите их в скрытом входе.

0 голосов
/ 13 сентября 2018

Просто выполните условную проверку, обновите модель и определите URL перенаправления:

public function info(Request $request) {
    $lead = Lead::firstOrNew(123);

    if ($request->has('firstName') && $request->has('lastName')) {
        $lead->firstName = $request->get('firstName ');
        $lead->lastName = $request->get('lastName');
        $redirect = '/form2';
    } else if ($request->has('email') && $request->has('phone')) {
        $lead->email = $request->get('email');
        $lead->phone = $request->get('lastName');
        $redirect = '/form3';
    } else if ($request->has('city') && $request->has('state')) {
        $lead->city = $request->get('city');
        $lead->state = $request->get('state');
        $redirect = '/done';
    }

    $lead->save();

    return redirect($redirect);
}

Кроме того, вы, вероятно, можете выполнить групповое обновление через update, просто убедитесь, что вы включили белый список атрибутов в вашей модели

public function info(Request $request) {
    $lead = Lead::firstOrNew(123);
    $lead->update($request->all());

    if ($request->has('firstName') && $request->has('lastName')) {
        $redirect = '/form2';
    } else if ($request->has('email') && $request->has('phone')) {
        $redirect = '/form3';
    } else if ($request->has('city') && $request->has('state')) {
        $redirect = '/done';
    }

    return redirect($redirect);
}

Или лучше добавить переменную перенаправления в вашу форму, например:

<input type="hidden" name="redirect" value="form1">

и упростите ваш метод управления, например:

public function info(Request $request) {
    $lead = Lead::firstOrNew(123);
    $lead->update($request->all());

    return redirect($request->input('redirect'));
}
0 голосов
/ 14 сентября 2018

Вы можете добавить скрытое поле ко всем трем формам (но с именем, например, form_name) и установить их значения для идентификации формы (form1, form2, form3), когда она Отправлено. Затем в вашем контроллере вы проверяете значение поля form_name в запросе, чтобы определить, куда вы хотите перенаправить, например:

public function info(Request $request) {
    $lead = Lead::firstOrNew(123);
    $lead->update($request->all());

    //this will be from the hidden field (form_name)
    $form_type = $request->get('form_name');

    if ($form_type == 'form1') {
        $redirect = '/form2';
    } else if ($form_type == 'form2') {
        $redirect = '/form3';
    } else if ($form_type == 'form3') {
        $redirect = '/done';
    }

    return redirect($redirect);
}
0 голосов
/ 13 сентября 2018

Вы можете изменить методы для вызова общей функции «обновления». Смотрите пример кода ниже.

public function name(Request $request){
    $this->update(123, $request);
    return redirect('/form2');
}

public function info(Request $request){
    $this->update(123, $request);
    return redirect('/form3');
}

public function address(Request $request){
    $this->update(123, $request);
    return redirect('/done');
}

private function update($id, $request) {
    $lead = Lead::find($id);
    foreach ($field as ['firstName', 'lastName', ...]) {
        if ($request->has($field)) {
            $lead->{$field} = $request->get($field);
        }
    }
    $lead->save();
}
...