Как решить это неопределенное смещение: 0 ошибка? - PullRequest
0 голосов
/ 04 мая 2018

На странице сведений о конгрессе пользователь выбирает желаемое количество для каждого типа билета, затем нажимает «Далее» и переходит на страницу регистрации. На странице регистрации есть форма регистрации.

В таблице конгрессов есть столбец «all_participants»:

  • Если all_participants равен «0», это означает, что необходим только сбор информации о пользователе, который выполняет регистрацию, который является аутентифицированным пользователем. Так же используется имя, фамилия и адрес электронной почты авторизованного пользователя при регистрации. А в регистрационной форме необходимо только показывать пользовательские вопросы, связанные с выбранными типами заявок, один раз (для ответа авторизованного пользователя) и хранить их, используя идентификатор аутентифицированного пользователя
  • Таким образом, если all_participants равен "0" и пользователь выбрал типы заявок на предыдущей странице, иметь 1 или более пользовательских вопросов, связанных с регистрацией Похоже, что пользовательский вопрос (ы). Если нет никаких пользовательских вопросов, связанных с каким-либо из типов заявок, выбранных пользователем, пользователю не нужно вставлять какую-либо информацию, поскольку он использует свою регистрационную информацию (имя, фамилию и адрес электронной почты) для регистрации.

Проблема в том, что когда пользователь заполняет поле и нажимает «Перейти к шагу 2», появляется «Undefined offset: 0».

Знаете ли вы, как правильно решить эту проблему?

Ошибка объяснена диаграммой: (в этом случае существует пользовательский вопрос «Какой у вас телефон?», Связанный, по крайней мере, с одним типом билета, выбранным пользователем)

enter image description here

// Регистрационная форма

<form method="post" id="step1form" action="">
        {{csrf_field()}}
        @if (!empty($allParticipants))
            @if($allParticipants == 1)
                <p>Please fill in all fields. Your tickets will be sent to
                    p{{ (\Auth::check()) ? Auth::user()->email : old('email')}}.</p>

                @foreach($selectedTypes as $selectedType)
                    @foreach(range(1,$selectedType['quantity']) as $test)

                        <h6>Participant - 1 - {{$test}}</h6>
                        <div class="form-check">
                            <input class="form-check-input" type="radio" name="" value="">
                            <label class="form-check-label d-flex align-items-center" for="exampleRadios1">
                                <span class="mr-auto">Fill the following fields with the authenticated user information.</span>
                            </label>
                        </div>
                        <div class="form-group font-size-sm">
                            <label for="participant_name" class="text-gray">Name</label>
                            <input type="text" name="participant_name[]" required class="form-control" value="">
                        </div>
                        <div class="form-group font-size-sm">
                            <label for="participant_surname" class="text-gray">Surname</label>
                            <input type="text" required class="form-control" name="participant_surname[]" value="">
                        </div>
                        <input type="hidden" name="ttypes[]" value="{{ $selectedType['id'] }}"/>
                        @foreach($selectedType['questions'] as $customQuestion)
                            <div class="form-group">
                                <label for="participant_question">{{$customQuestion->question}}</label>
                                <input type="text"
                                       @if($customQuestion->pivot->required == "1") required @endif
                                       class="form-control" name="participant_question[]">
                                <input type="hidden" name="participant_question_required[]"
                                       value="{{ $customQuestion->pivot->required }}">
                                <input type="hidden" value="{{ $customQuestion->id }}" name="participant_question_id[]"/>
                            </div>
                        @endforeach
                    @endforeach
                @endforeach
                @else
                    <p>Its not necessary aditional info. Your tickets will be sent to {{ (\Auth::check()) ? Auth::user()->email : old('email')}}.</p>

                  @if($selectedRtype['questions'] )
                      <p>You only need to answer the cutom questions below.</p>
                @foreach($selectedRtype['questions'] as $customQuestion)
                    <div class="form-group">
                        <label for="participant_question">{{$customQuestion->question}}</label>
                        <input type="text"
                               @if($customQuestion->pivot->required == "1") required @endif
                               class="form-control" name="participant_question[]">
                        <input type="hidden" name="participant_question_required[]"
                               value="{{ $customQuestion->pivot->required }}">
                        <input type="hidden" value="{{ $customQuestion->id }}" name="participant_question_id[]"/>
                    </div>
                @endforeach
        @endif

                @endif
            @endif

        <input type="submit" href="#step2"
               id="goToStep2Free" class="btn btn-primary btn float-right next-step" value="Go to step 2"/>
    </form>

// storeUSerInfo метод RegistrationController, который вызывается при нажатии кнопки «Перейти к шагу 2»:

public function StoreUserInfo(Request $request, $id, $slug = null, Validator $validator){
    $allParticipants = Congress::where('id', $id)->first()->all_participants;
    $user = Auth::user();

    if($allParticipants){
        $rules = [
            'participant_name.*' => 'required|max:255|string',
            'participant_surname.*' => 'required|max:255|string',
        ];

        $messages = [
            'participant_question.*.required' => 'The participant is required'
        ];

        foreach ($request->participant_question_required as $key => $value) {
            $rule = 'string|max:255'; // I think string should come before max
            //dd($value);
            // 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;
        }

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

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

            $participants = [];

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

                ]);

            for ($i = 0; $i < count($request->participant_question); $i++)
                $answer = Answer::create([
                    'question_id' => $request->participant_question_id[$i],

                    'participant_id' => $participants[$i]->id,
                    'answer' => $request->participant_question[$i],
                ]);
            }

        return response()->json([
            'success' => true,
            'message' => 'success'
        ], 200);
    }


    else {

        $messages = [
            'participant_question.*.required' => 'The participant is required'
        ];


        foreach ($request->participant_question_required as $key => $value) {
            $rule = 'string|max:255'; // I think string should come before max
            //dd($value);
            // 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;
        }


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


        if ($validator->passes()) {

            $registration = Registration::create([
                'congress_id' => $id,
                'main_participant_id' => $user->id,
                'status' => 'C',

            ]);

            $participants = [];

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

                ]);

            for ($i = 0; $i < count($request->participant_question); $i++)
                $answer = Answer::create([
                    'question_id' => $request->participant_question_id[$i],
                        // the error undefined offset is here
                    'participant_id' => $participants[$i]->id,
                    'answer' => $request->participant_question[$i],
                ]);
        }

        return response()->json([
            'success' => true,
            'message' => 'success'
        ], 200);

    }
}

Структура базы данных, релевантная для вопроса:

congresses: id, name, all_participants,...
ticekt type table: id, name, etc
registrations: id, congress_id (fk), main_participant_id (main_participant_id is the id of the auth user the user that does the registration)
participants: id registration_id (fk), ticket_type_id (fk), name, surname
questions: id, question, congress_id (fk)
ticket_type_questions pivot table: id, ticket_type_id, question_id, required (required is 1 or 0, 1 means required)

1 Ответ

0 голосов
/ 04 мая 2018

Просто поиск 0: при доступе к ключу массива вы должны убедиться, что ключ существует.

Я вижу 4 цикла for с объявлением $i = 0;, которые используются для доступа к массиву, но никогда не проверяются. Также вы можете просто захотеть использовать цикл foreach, но это ваше дело.

проверка наличия ключа

if (isset($request->participant_question_id[$i])) {
    $answer = Answer::create([
        'question_id' => $request->participant_question_id[$i],
        // the error undefined offset is here
        'participant_id' => $participants[$i]->id,
        'answer' => $request->participant_question[$i],
    ]);
}

каждый подход

foreach ($request->participant_question as $key => $question)
    $answer = Answer::create([
        'question_id' => $question,
        // the error undefined offset is here
        'participant_id' => $participants[$i]->id,
        'answer' => $request->participant_question[$i],
    ]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...