Хранить статус регистрации не работает должным образом (всегда хранится значение «С», но «I» следует сохранить, если регистрация оплачена) - PullRequest
0 голосов
/ 27 мая 2018

У меня есть форма на странице регистрации конференции, чтобы пользователь мог зарегистрироваться в конференции. Форма имеет следующие действия:

<form method="post" action="{{route('conferences.storeRegistration', ['id' => $id, 'slug' => $slug])}}">
...
</form>

Конференция может иметь 1 или несколько типов регистрации, а тип регистрации можетбыть бесплатным или платным.В зависимости от типа (ов) регистрации, выбранных пользователем, при отправке формы, в этом storeRegistration() я хочу сохранить в столбце статуса таблицы регистрации значение «С» (завершено), если общая ценавыбранные типы регистрации: «0», но если «> 0», я хочу сохранить их как «I» (не завершено).

Для этого в storeRegistrationInfo () я пытаюсь получить значение в итоговой сумме сеанса'и затем использовать троичную' status' => ($total > 0) ? 'I' : 'C', ', как показано ниже:

 public function storeRegistration(Request $request, $id, $slug = null, Validator $validator)
    {
    ...
    $total = Session::get('total');

    if ($validator->passes()) {
        $registration = Registration::create([
            'conference_id' => $id,
            'main_participant_id' => $user->id,
             'status' => ($total > 0) ? 'I' : 'C',
        ]);

    ...
}

Но это не работает, всегда хранится в столбце' status ', значение C', независимо, если при регистрации оплачены билеты илиесли все билеты бесплатны.Проблема должна заключаться в том, что dd ($ total) показывает «null».

Знаете ли вы, как этого можно добиться надлежащим образом?


Последовательность ошибок:

У меня есть страница сведений о конференции, где пользователь может выбрать в форме количество билетов, которые он хочет на конференцию.Конференция может иметь 1 или несколько связанных билетов, и некоторые из них могут быть бесплатными, другие оплачиваются.Таким образом, в этой форме пользователь выбирает билеты, которые он хочет, а затем нажимает «Далее».Форма имеет следующее действие:

<form method="post" action="{{route('conferences.storeQuantities', ['id' => $conference->id, 'slug' => $conference->slug])}}">
...
</form>

Таким образом, когда пользователь нажимает «Далее», код переходит в RegistrationController storeQuantities (), этот метод сохраняет выбранные билеты (количество каждого билета, общее количество и т. Д.) Инекоторая другая некоторая информация в сеансе и возвращение пользователя по маршруту «conference.registration»:

public function storeQuantities(Request $request, $id, $slug = null)
    {

        $request->validate([
            'rtypes' => ['required', 'array', new RegistrationTypeQuantity],
        ]);

        $rtypeQuantities = $request->get('rtypes');

        $allParticipants = Conference::where('id', $id)->first()->all_participants;

        $total = 0;
        foreach ($rtypeQuantities as $rtypeName => $quantity) {

            if ($quantity) {

                $rtype = RegistrationType::where('name', $rtypeName)->firstOrFail();
                $price = $rtype->price;

                $selectedRtypes[$rtype->name]['quantity'] = $quantity;
                $selectedRtypes[$rtype->name]['price'] = $price;
                $selectedRtypes[$rtype->name]['subtotal'] = $price * $quantity;
                $total += $selectedRtypes[$rtype->name]['subtotal'];
                $selectedRtypes[$rtype->name]['total'] = $total;

                $selectedRtypes[$rtype->name]['questions'] = $rtype->questions;
                $selectedRtypes[$rtype->name]['id'] = $rtype->id;
            }
        }
        Session::put('selectedRtypes', $selectedRtypes);
        Session::put('allParticipants', $allParticipants);
        Session::put('customQuestions', $selectedRtypes[$rtype->name]['questions']);
        Session::put('total', $total);

        return redirect(route('conferences.registration', ['id' => $id, 'slug' => $slug]))->with('total', $total);
    }

Итак, код переходит к маршруту:

Route::get('/conference/{id}/{slug?}/registration', [
    'uses' => 'RegistrationController@displayRegistrationPage',
    'as'   =>'conferences.registration'
]);

Итак, функцияЗатем вызывается displayRegistrationPage, и он получает значения в сеансе и перенаправляет пользователя на страницу регистрации:

  public function displayRegistrationPage(Request $request, $id, $slug = null)
    {

        $selectedRtypes = Session::get('selectedRtypes');
        $allParticipants = Session::get('allParticipants');
        $customQuestions = Session::get('customQuestions');




        if (isset($selectedRtypes)) {
            return view('conferences.registration',
                ['selectedRtypes' => $selectedRtypes, 'allParticipants' => $allParticipants, 'customQuestions' => $customQuestions, 'id' => $id,
                    'slug' => $slug]);
        } else {
            return redirect(route('conferences.show', ['id' => $id, 'slug' => $slug]));
        }
    }

Так что теперь страница регистрации представляется пользователю.Здесь есть форма для регистрации пользователем, введите некоторые данные для регистрации в конференции.Форма имеет следующее действие:

<form method="post" action="{{route('conferences.storeRegistration', ['id' => $id, 'slug' => $slug])}}">
...
</form>

Итак, когда форма отправляется, в этом storeRegistration () я хочу сохранить в столбце состояния таблицы регистрации значение «C» (завершено), еслирегистрация, которую делает пользователь, имеет только бесплатные типы регистрации.Но я хочу сохранить значение «I» (неполное), если существует 1 или более типов регистрации, цена> 0. Поскольку затем пользователю необходимо заплатить, поэтому регистрация остается неполной, пока он не заплатит.

 public function storeRegistration(Request $request, $id, $slug = null, Validator $validator)
    {
    ...
    $total = Session::get('total');

    if ($validator->passes()) {
        $registration = Registration::create([
            'conference_id' => $id,
            'main_participant_id' => $user->id,
                'status' => ($total > 0) ? 'I' : 'C',
        ]);
        ...
    ...
}

Полный контроллер регистрации:

class RegistrationController extends Controller
{


    // handles the form of the conference details page where the user select the tickets
    public function storeQuantities(Request $request, $id, $slug = null)
    {

        $request->validate([
            'rtypes' => ['required', 'array', new RegistrationTypeQuantity],
        ]);

        $rtypeQuantities = $request->get('rtypes');


        $allParticipants = Conference::where('id', $id)->first()->all_participants;


        $total = 0;
        foreach ($rtypeQuantities as $rtypeName => $quantity) {

            if ($quantity) {

                $rtype = RegistrationType::where('name', $rtypeName)->firstOrFail();

                $price = $rtype->price;

                $selectedRtypes[$rtype->name]['quantity'] = $quantity;
                $selectedRtypes[$rtype->name]['price'] = $price;
                $selectedRtypes[$rtype->name]['subtotal'] = $price * $quantity;
                $total += $selectedRtypes[$rtype->name]['subtotal'];
                $selectedRtypes[$rtype->name]['total'] = $total;

                $selectedRtypes[$rtype->name]['questions'] = $rtype->questions;
                $selectedRtypes[$rtype->name]['id'] = $rtype->id;
            }
        }


        Session::put('selectedRtypes', $selectedRtypes);
        Session::put('allParticipants', $allParticipants);
        Session::put('customQuestions', $selectedRtypes[$rtype->name]['questions']);
        Session::put('total', $total);

        return redirect(route('conferences.registration', ['id' => $id, 'slug' => $slug]))->with('total', $total);
    }

    // redirects the user to the registration page
    public function displayRegistrationPage(Request $request, $id, $slug = null)
    {

        $selectedRtypes = Session::get('selectedRtypes');
        $allParticipants = Session::get('allParticipants');
        $customQuestions = Session::get('customQuestions');


        if (isset($selectedRtypes)) {
            return view('conferences.registration',
                ['selectedRtypes' => $selectedRtypes, 'allParticipants' => $allParticipants, 'customQuestions' => $customQuestions, 'id' => $id,
                    'slug' => $slug]);
        } else {
            return redirect(route('conferences.show', ['id' => $id, 'slug' => $slug]));
        }
    }

    // handles the registration form of the registration page
    public function storeRegistration(Request $request, $id, $slug = null, Validator $validator)
    {

        $allParticipants = Conference::where('id', $id)->first()->all_participants;
        $user = Auth::user();

        $total = Session::get('total');


        $rules = [];
        $messages = [];

        if (isset($request->participant_question_required)) {
            $messages = [
                'participant_question.*.required' => 'Fill all mandatory fields.',
            ];

            foreach ($request->participant_question_required as $key => $value) {
                $rule = 'string|max:255'; 

                // if this was required, ie 1, prepend "required|" to the rule
                if ($value) {
                    $rule = 'required|' . $rule;
                }

                // add the individual rule for this array key to the $rules array
                $rules["participant_question.{$key}"] = $rule;
            }
        }

        if ($allParticipants == 1) {

            $rules["participant_name.*"] = 'required|max:255|string';
            $rules["participant_surname.*"] = 'required|max:255|string';

        }


        $validator = Validator::make($request->all(), $rules, $messages);

        if ($validator->passes()) {
            $registration = Registration::create([
                'conference_id' => $id,
                'main_participant_id' => $user->id,
                'status' => ($total > 0) ? 'I' : 'C',
            ]);

            $participants = [];
            for ($i = 0; $i < count($request->participant_name); $i++) {
                $name = ($allParticipants) ? $request->participant_name[$i] : '';
                $surname = ($allParticipants) ? $request->participant_surname[$i] : '';
                $participants[] = Participant::create([
                    'name' => $name,
                    'surname' => $surname,
                    'registration_id' => $registration->id,
                    'registration_type_id' => $request->rtypes[$i]

                ]);
            }

            if (isset($request->participant_question)) {
                foreach( $request->participant_question as $key => $question ) {
                    $answer = Answer::create([
                        'question_id' => $request->participant_question_id[$key],
                        'participant_id' => $participants[$key]->id,
                        'answer' => $request->participant_question[$key],
                    ]);
                }
            }

            return redirect(route('user.index', ['user' => Auth::id()]).'#myTickets');

        }
    }
}

Макет контекста: https://ibb.co/b0VN8T

1 Ответ

0 голосов
/ 08 июня 2018

Ваша проблема здесь:

return redirect(route('conferences.registration', ['id' => $id, 'slug' => $slug]))->with('total', $total);

Вы сохранили свои данные в сеансе постоянным способом, но просто когда вы хотели перенаправить, вы стерли первый сохраненный:

Session::put('total', $total);

с:

...->with('total', $total);

Последний мигает данные в ваш сеанс только для следующего запроса (при отображении формы регистрации), поэтому при отправке формы регистрации для отправки,«итоговые» данные уже исчезли из сеанса.

Удалите:

...->with('total', $total);

И это будет хорошо для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...