Показать вопросы с соответствующим макетом на основе типа (текст, флажок, выберите и т. Д.) Не работает должным образом - PullRequest
0 голосов
/ 24 мая 2018

У меня есть форма для создания пользовательских вопросов.Для этого пользователю необходимо ввести вопрос (например: получать уведомления?), А также тип поля (текст, длинный текст, флажок, меню выбора, переключатель).Если пользователь выбирает поле с флажком, выбирает меню или переключатель, ему также необходимо ввести доступные параметры для вопроса.

В базе данных вопросы вставляются в таблицы вопросов и параметров вопроса, например:

// таблица вопросов

id     question                    type          conference_id      
1       question1                 text                 1
2       question2                long_text             1   
3       question3                checkbox              1  
4       question4                radio_btn             1  
5       question5                select_menu            1      

// таблица вопросов-ответов:

id     question_id                   type                
1       3                             q3op1       
2       3                              q3op2
3       4                             q4op1 
4       4                              q4op2 
5       5                              q5op1      
6       5                              q5op2      

Я сомневаюсь, как правильно отобразить в registration.blade.php входные данные (текст, радиокнопка, флажок, выберите, текстовое поле и входной файл) в зависимости от типа, хранящегося в столбце «тип» таблицы вопросов.Пока он не работает должным образом, он выглядит как левый экран изображения, но должен выглядеть как правый экран изображения:

enter image description here

знаете, почему не отображается как правый экран изображения?

В модели Вопрос есть этот метод getHtmlInput ():

  switch ($this->type) {
            case "text":
                  return "<input type='text' name='$name' val='$val' class='$class''" . ($required?:"required") . "/>";
            case "checkbox":
                return "<input type='checkbox' name='$name' class='$class''" . ($required?:"required") . "/>";
            case "radio_btn":
                return "<input type='radio' name='$name' class='$class''" . ($required?:"required") . "/>";
            case "select_menu":
                return "<select name='$name' class='$class''" . ($required?:"required") . "></select>";
            case "textarea":
                return "<textarea name='$name' class='$class''" . ($required?:"required") . "></textaera>";
        }

В registration.blade.php вопросыпредставлен с кодом ниже:

@if ($allParticipants == 0)
    @foreach($selectedRtype['questions'] as $customQuestion)
        <div class="form-group">
            <label for="participant_question">{{$customQuestion->question}}</label>
            {!! $customQuestion->getHtmlInput(
            'participant_question[]',($customQuestion->pivot->required == "1") ? 'required' : '',
            $class = "form-control",
             $customtype=$customQuestion->type) !!}
        </div>
        @if($customQuestion->hasOptions())
            @foreach($customQuestion->options as $option)
                <p>{{ $option->value }}</p>
            @endforeach
        @endif
    @endforeach
@endif     

Метод хранения QuestionController для создания вопроса:

public function store(Request $request, $id){
    $this->validate($request, [
        'question' => 'required|max:255|string',
        'type' => 'required|max:255|string',
    ]);
    $conference = Conference::find($id);
    $question = Question::create([
        'conference_id' => $conference->id,
        'question' => $request->question,
        'type' => $request->type,
    ]);


    if(in_array($request->type, Question::$typeHasOptions)){
        foreach($request->input('questionOptions') as $questionOption) {
            QuestionOption::create([
                'question_id' => $question->id,
                'value' => $questionOption
            ]);
        }
    }
    Session::flash('success', 'Question created with success.');
    return redirect()->back();
}

Модели:

// Модель вопроса

class Question extends Model
{
    protected $fillable = [
        'question', 'type', 'conference_id',
    ];

    public static $typeHasOptions = [
        'radio_btn',
        'select_menu',
        'checkbox'
    ];

    public function ticket_types(){
        return $this->belongsToMany('App\TicketType', 'ticket_type_questions')
            ->withPivot('required');
    }

    public function options() {
        return $this->hasMany('App\QuestionOption');
    }


    public function hasOptions() {
        return in_array($this->type, self::$typeHasOptions);
    }

    public function getHtmlInput($name = "", $val = "", $required = false, $class = "", $customtype=false)
    {
        switch ($this->type) {
            case "text":
                  return "<input type='".($customtype?:"text")."' name='$name' val='$val' class='$class''" . ($required?:"required") . ">";
            case "checkbox":
                return "<input type='".($customtype?:"checkbox")."' name='$name' class='$class''" . ($required?:"required") . ">";
            case "radio_btn":
                return "<input type='".($customtype?:"radio")."' name='$name' class='$class''" . ($required?:"required") . ">";
            case "select_menu":
                return "<input type='".($customtype?:"radio")."' name='$name' class='$class''" . ($required?:"required") . ">";
            case "textarea":
                return "<input type='".($customtype?:"radio")."' name='$name' class='$class''" . ($required?:"required") . ">";
        }
    }


}

// ВопросОпция модели

class QuestionOption extends Model
{
    protected $fillable = [ 'question_id', 'value' ];

    public function question() {
        return $this->belongsTo('App\Question');
    }
}

1 Ответ

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

Ошибки в вашем коде:

  • В getHtmlInput дважды задавались кавычки class='$class''"
  • В getHtmlInput 3 последних ввода в switch имели ($customtype?:"radio")
  • Все входы, сгенерированные с name[], но [] нужны только для radio и checkox
  • В registration.blade.php печатном вводе и один раз и в цикле опций только что напечатанное значение <p>{{ $option->value }}</p>
  • Использование <label for="participant_question"> не имеет смысла в этом случае, поскольку оно должно быть привязано к входу с уникальным идентификатором.

Каждый вход должен иметь уникальное поле name.Вам нужно добавить поле name в таблицу questions.И использовать в шаблоне как $customQuestion->name

Примеры фиксированного кода (не проверено):

registration.blade.php

Может выглядеть так:

@if ($allParticipants == 0)
@foreach($selectedRtype['questions'] as $customQuestion)
    <div class="form-group">
        <div>
            {{$customQuestion->question}}
        </div>
        <div>
            @if($customQuestion->hasOptions())
                {!! $customQuestion->getHtmlInput(
                    $customQuestion->name,
                    $customQuestion->options,
                    ($customQuestion->pivot->required == '1'),
                    'form-control',
                    $customQuestion->type) 
                !!}
            @endif
        </div>        
    </div>
@endforeach
@endif

и метод getHtmlInput()

Может выглядеть так:

public function getHtmlInput($name = "", $options = "", $required = false, $class = "", $customtype=false)
{
    $html = '';
    $html .= $customtype == 'select_menu' ? "<select name='$name' class='$class' ".($required?:" required").">" : '';


    foreach($options as $option) {
        switch ($customtype) {
        case "text":
            $html .= "<div><input type='text' name='$name' value='".$option->value."' class='$class'" . ($required?:" required") . "></div>";
            break;
        case "checkbox":
            $html .= "<div><input type='checkbox' name='".$name."[]' value='".$option->value."' class='$class'" . ($required?:" required") . ">". $option->value."</div>";
            break;
        case "radio_btn":
            $html .= "<div><input type='radio' name='".$name."[]' class='$class'" . ($required?:" required") . "> ".$option->value."</div>";
            break;
        case "select_menu":
            $html .= "<option value='".$option->value."'>";
            break;
        case "textarea":
            $html .= "<div><textarea name='$name' class='$class'" . ($required?:" required") . ">" . $option->value . "</textarea></div>";
            break;
    }
    }

    $html .= $customtype == 'select_menu' ? "</select>" : '';

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