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